blob: 456c66478e969191dc92b274f6f7e798289d3df1 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
Ned Deily47299fd2016-02-15 16:54:08 +110087#include <AvailabilityMacros.h>
88/* for getaddrinfo thread safety test on old versions of OS X */
89#ifndef MAC_OS_X_VERSION_10_5
90#define MAC_OS_X_VERSION_10_5 1050
91#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +000092 /*
93 * inet_aton is not available on OSX 10.3, yet we want to use a binary
94 * that was build on 10.4 or later to work on that release, weak linking
95 * comes to the rescue.
96 */
97# pragma weak inet_aton
98#endif
99
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000100#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000101#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000102
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000103/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000104PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200105"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000106\n\
107Open a socket of the given type. The family argument specifies the\n\
108address family; it defaults to AF_INET. The type argument specifies\n\
109whether this is a stream (SOCK_STREAM, this is the default)\n\
110or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
111specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200112The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000113\n\
114A socket object represents one endpoint of a network connection.\n\
115\n\
116Methods of socket objects (keyword arguments not allowed):\n\
117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000118_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119bind(addr) -- bind the socket to a local address\n\
120close() -- close the socket\n\
121connect(addr) -- connect the socket to a remote address\n\
122connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200123dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000124fileno() -- return underlying file descriptor\n\
125getpeername() -- return remote address [*]\n\
126getsockname() -- return local address\n\
127getsockopt(level, optname[, buflen]) -- get socket options\n\
128gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100129listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000131recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000132recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000133recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000134 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000135sendall(data[, flags]) -- send all data\n\
136send(data[, flags]) -- send data, may not send all of it\n\
137sendto(data[, flags], addr) -- send data to a given address\n\
138setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
Christian Heimesdffa3942016-09-05 23:54:41 +0200139setsockopt(level, optname, value[, optlen]) -- set socket options\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140settimeout(None | float) -- set or clear the timeout\n\
141shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700142if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700143if_nametoindex(name) -- return the corresponding interface index\n\
144if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000147
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000148/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000149 I hope some day someone can clean this up please... */
150
Guido van Rossum9376b741999-09-15 22:01:40 +0000151/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
152 script doesn't get this right, so we hardcode some platform checks below.
153 On the other hand, not all Linux versions agree, so there the settings
154 computed by the configure script are needed! */
155
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700156#ifndef __linux__
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if !defined(WITH_THREAD)
167# undef HAVE_GETHOSTBYNAME_R
168#endif
169
170#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000172#endif
173
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000175# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# define HAVE_GETHOSTBYNAME_R_3_ARG
177# elif defined(__sun) || defined(__sgi)
178# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700179# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000180/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000181# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
182# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000183# else
184# undef HAVE_GETHOSTBYNAME_R
185# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000186#endif
187
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000188#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
189 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000190# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000191#endif
192
Ned Deilye1d4e582016-02-23 22:05:29 +1100193/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000194#ifdef HAVE_SYS_PARAM_H
195#include <sys/param.h>
196#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000197/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100198 (this includes the getaddrinfo emulation) protect access with a lock.
199
200 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
201 a mix of code including an unsafe implementation from an old BSD's
202 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
203 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100205
Ned Deilye1d4e582016-02-23 22:05:29 +1100206 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
207 http://www.openbsd.org/plus54.html
208
209 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
210
211http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100212 */
213#if defined(WITH_THREAD) && ( \
214 (defined(__APPLE__) && \
215 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000216 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100217 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
218 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100219 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000220#define USE_GETADDRINFO_LOCK
221#endif
222
223#ifdef USE_GETADDRINFO_LOCK
224#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
225#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
226#else
227#define ACQUIRE_GETADDRINFO_LOCK
228#define RELEASE_GETADDRINFO_LOCK
229#endif
230
231#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000232# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000233#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000234
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000235#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000236# include <types.h>
237# include <io.h>
238# include <sys/ioctl.h>
239# include <utils.h>
240# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000241#endif
242
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100243#ifdef __APPLE__
244# include <sys/ioctl.h>
245#endif
246
247
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000249/* make sure that the reentrant (gethostbyaddr_r etc)
250 functions are declared correctly if compiling with
251 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252
Thomas Wouters477c8d52006-05-27 19:21:47 +0000253/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000254 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000255#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000256#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000257
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000258#undef _XOPEN_SOURCE
259#include <sys/socket.h>
260#include <sys/types.h>
261#include <netinet/in.h>
262#ifdef _SS_ALIGNSIZE
263#define HAVE_GETADDRINFO 1
264#define HAVE_GETNAMEINFO 1
265#endif
266
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000267#define HAVE_INET_PTON
268#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000269#endif
270
Thomas Wouters477c8d52006-05-27 19:21:47 +0000271/* Irix 6.5 fails to define this variable at all. This is needed
272 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000273 are just busted. Same thing for Solaris. */
274#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000275#define INET_ADDRSTRLEN 16
276#endif
277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000280#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000281#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700283#ifdef HAVE_SYS_SOCKET_H
284#include <sys/socket.h>
285#endif
286
287#ifdef HAVE_NET_IF_H
288#include <net/if.h>
289#endif
290
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000291/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000293#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294
295/* Addressing includes */
296
Guido van Rossum6f489d91996-06-28 20:15:15 +0000297#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298
299/* Non-MS WINDOWS includes */
300# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000301# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000302
Guido van Rossum9376b741999-09-15 22:01:40 +0000303/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000305
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000306# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000307
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000308#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000309
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000310/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000311# ifdef HAVE_FCNTL_H
312# include <fcntl.h>
313# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000314
Steve Dower65e4cb12014-11-22 12:54:57 -0800315#if defined(_MSC_VER) && _MSC_VER >= 1800
316/* Provides the IsWindows7SP1OrGreater() function */
317#include <VersionHelpers.h>
318#endif
319
Jeremy Hylton22308652001-02-02 03:23:09 +0000320#endif
321
Skip Montanaro7befb992004-02-10 16:50:21 +0000322#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000323
Neal Norwitz39d22e52002-11-02 19:55:21 +0000324#ifndef O_NONBLOCK
325# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000326#endif
327
Trent Micka708d6e2004-09-07 17:48:26 +0000328/* include Python's addrinfo.h unless it causes trouble */
329#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
330 /* Do not include addinfo.h on some newer IRIX versions.
331 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
332 * for example, but not by 6.5.10.
333 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000334#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000335 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
336 * EAI_* constants are defined in (the already included) ws2tcpip.h.
337 */
338#else
339# include "addrinfo.h"
340#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000341
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000342#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000343#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000344int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000345const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000346#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000347#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000348
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000349#ifdef __APPLE__
350/* On OS X, getaddrinfo returns no error indication of lookup
351 failure, so we must use the emulation instead of the libinfo
352 implementation. Unfortunately, performing an autoconf test
353 for this bug would require DNS access for the machine performing
354 the configuration, which is not acceptable. Therefore, we
355 determine the bug just by checking for __APPLE__. If this bug
356 gets ever fixed, perhaps checking for sys/version.h would be
357 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000358#ifndef HAVE_GETNAMEINFO
359/* This bug seems to be fixed in Jaguar. Ths easiest way I could
360 Find to check for Jaguar is that it has getnameinfo(), which
361 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000362#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000363#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000364
365#ifdef HAVE_INET_ATON
366#define USE_INET_ATON_WEAKLINK
367#endif
368
Jack Jansen84262fb2002-07-02 14:40:42 +0000369#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000370
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000371/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000372#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000373/* avoid clashes with the C library definition of the symbol. */
374#define getaddrinfo fake_getaddrinfo
375#define gai_strerror fake_gai_strerror
376#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000377#include "getaddrinfo.c"
378#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000379#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000380#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000381#include "getnameinfo.c"
382#endif
383
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000384#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000385#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000386#endif
387
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000388#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000389#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000390#define EAFNOSUPPORT WSAEAFNOSUPPORT
391#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000392#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000393
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000394#ifndef SOCKETCLOSE
395#define SOCKETCLOSE close
396#endif
397
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000398#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define USE_BLUETOOTH 1
400#if defined(__FreeBSD__)
401#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
402#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000403#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000404#define SOL_HCI SOL_HCI_RAW
405#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000406#define sockaddr_l2 sockaddr_l2cap
407#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000408#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
410#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000411#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000412#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000413#define sockaddr_l2 sockaddr_bt
414#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000415#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000417#define SOL_HCI BTPROTO_HCI
418#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000419#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
420#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000421#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000422#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000423#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000424#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
425#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000426#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000427#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
428#endif
429#endif
430
Charles-François Natali8b759652011-12-23 16:44:51 +0100431/* Convert "sock_addr_t *" to "struct sockaddr *". */
432#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433
Martin v. Löwise9416172003-05-03 10:12:45 +0000434/*
435 * Constants for getnameinfo()
436 */
437#if !defined(NI_MAXHOST)
438#define NI_MAXHOST 1025
439#endif
440#if !defined(NI_MAXSERV)
441#define NI_MAXSERV 32
442#endif
443
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000444#ifndef INVALID_SOCKET /* MS defines this */
445#define INVALID_SOCKET (-1)
446#endif
447
Charles-François Natali0cc86852013-09-13 19:53:08 +0200448#ifndef INADDR_NONE
449#define INADDR_NONE (-1)
450#endif
451
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000452/* XXX There's a problem here: *static* functions are not supposed to have
453 a Py prefix (or use CapitalizedWords). Later... */
454
Guido van Rossum30a685f1991-06-27 15:51:29 +0000455/* Global variable holding the exception type for errors detected
456 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000457static PyObject *socket_herror;
458static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000459static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000460
Tim Peters643a7fc2002-02-17 04:13:21 +0000461/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000462 The sock_type variable contains pointers to various functions,
463 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000464 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000465static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000466
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000467#if defined(HAVE_POLL_H)
468#include <poll.h>
469#elif defined(HAVE_SYS_POLL_H)
470#include <sys/poll.h>
471#endif
472
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000473/* Largest value to try to store in a socklen_t (used when handling
474 ancillary data). POSIX requires socklen_t to hold at least
475 (2**31)-1 and recommends against storing larger values, but
476 socklen_t was originally int in the BSD interface, so to be on the
477 safe side we use the smaller of (2**31)-1 and INT_MAX. */
478#if INT_MAX > 0x7fffffff
479#define SOCKLEN_T_LIMIT 0x7fffffff
480#else
481#define SOCKLEN_T_LIMIT INT_MAX
482#endif
483
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200484#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000485/* Instead of select(), we'll use poll() since poll() works on any fd. */
486#define IS_SELECTABLE(s) 1
487/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000488#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200489/* If there's no timeout left, we don't have to call select, so it's a safe,
490 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100491#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000492#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000493
494static PyObject*
495select_error(void)
496{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200497 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000499}
500
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000501#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000502#ifndef WSAEAGAIN
503#define WSAEAGAIN WSAEWOULDBLOCK
504#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000505#define CHECK_ERRNO(expected) \
506 (WSAGetLastError() == WSA ## expected)
507#else
508#define CHECK_ERRNO(expected) \
509 (errno == expected)
510#endif
511
Victor Stinnerdaf45552013-08-28 00:53:59 +0200512#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200513# define GET_SOCK_ERROR WSAGetLastError()
514# define SET_SOCK_ERROR(err) WSASetLastError(err)
515# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
516# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
517#else
518# define GET_SOCK_ERROR errno
519# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
520# define SOCK_TIMEOUT_ERR EWOULDBLOCK
521# define SOCK_INPROGRESS_ERR EINPROGRESS
522#endif
523
524
525#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200526/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
527static int support_wsa_no_inherit = -1;
528#endif
529
Guido van Rossum30a685f1991-06-27 15:51:29 +0000530/* Convenience function to raise an error according to errno
531 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000532
Guido van Rossum73624e91994-10-10 17:59:00 +0000533static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000534set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000535{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000536#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 int err_no = WSAGetLastError();
538 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
539 recognizes the error codes used by both GetLastError() and
540 WSAGetLastError */
541 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200542 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000543#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000544
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200545 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000546}
547
Guido van Rossum30a685f1991-06-27 15:51:29 +0000548
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000550set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000553
554#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (v != NULL) {
560 PyErr_SetObject(socket_herror, v);
561 Py_DECREF(v);
562 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565}
566
567
568static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000569set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572
Martin v. Löwis272cb402002-03-01 08:31:07 +0000573#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 /* EAI_SYSTEM is not available on Windows XP. */
575 if (error == EAI_SYSTEM)
576 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000577#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000578
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000579#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000581#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 if (v != NULL) {
585 PyErr_SetObject(socket_gaierror, v);
586 Py_DECREF(v);
587 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000590}
591
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000592/* Function to perform the setting of socket blocking mode
593 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000594static int
595internal_setblocking(PySocketSockObject *s, int block)
596{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400597 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200598#ifdef MS_WINDOWS
599 u_long arg;
600#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100601#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100602 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100603 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000605#ifdef SOCK_NONBLOCK
606 if (block)
607 s->sock_type &= (~SOCK_NONBLOCK);
608 else
609 s->sock_type |= SOCK_NONBLOCK;
610#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000613#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100614#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200616 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400617 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100618#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200620 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400621 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100623 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 else
Victor Stinner9a954832013-12-04 00:41:24 +0100625 new_delay_flag = delay_flag | O_NONBLOCK;
626 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200627 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400628 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100629#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200631 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200632 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400633 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400635
636 result = 0;
637
638 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000639 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000641
Yury Selivanovfa22b292016-10-18 16:03:52 -0400642 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200643#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400644 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200645#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400646 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200647#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400648 }
649
650 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651}
652
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000653static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200654internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
655 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000656{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100658#ifdef HAVE_POLL
659 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200660 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100661#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200662 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200663 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100664#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000665
Victor Stinnerb7df3142015-03-27 22:59:32 +0100666#ifdef WITH_THREAD
667 /* must be called with the GIL held */
668 assert(PyGILState_Check());
669#endif
670
Victor Stinner416f2e62015-03-31 13:56:29 +0200671 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200672 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200675 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000678 /* Prefer poll, if available, since you can poll() any fd
679 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000680#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100681 pollfd.fd = s->sock_fd;
682 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200683 if (connect) {
684 /* On Windows, the socket becomes writable on connection success,
685 but a connection failure is notified as an error. On POSIX, the
686 socket becomes writable on connection success or on connection
687 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200688 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200689 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000690
Victor Stinner71694d52015-03-28 01:18:54 +0100691 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200692 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200693 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000694
Victor Stinner71694d52015-03-28 01:18:54 +0100695 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200696 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100697 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000698#else
Victor Stinnerced11742015-04-09 10:27:25 +0200699 if (interval >= 0) {
700 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
701 tvp = &tv;
702 }
703 else
704 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000705
Victor Stinner71694d52015-03-28 01:18:54 +0100706 FD_ZERO(&fds);
707 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200708 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200709 if (connect) {
710 /* On Windows, the socket becomes writable on connection success,
711 but a connection failure is notified as an error. On POSIX, the
712 socket becomes writable on connection success or on connection
713 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200714 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200715 }
Victor Stinner71694d52015-03-28 01:18:54 +0100716
717 /* See if the socket is ready */
718 Py_BEGIN_ALLOW_THREADS;
719 if (writing)
720 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200721 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100722 else
723 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200724 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100725 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000726#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 if (n < 0)
729 return -1;
730 if (n == 0)
731 return 1;
732 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000733}
734
Victor Stinner31bf2d52015-04-01 21:57:09 +0200735/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000736
Victor Stinner81c41db2015-04-02 11:50:57 +0200737 On error, raise an exception and return -1 if err is set, or fill err and
738 return -1 otherwise. If a signal was received and the signal handler raised
739 an exception, return -1, and set err to -1 if err is set.
740
741 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100742
Victor Stinner31bf2d52015-04-01 21:57:09 +0200743 If the socket has a timeout, wait until the socket is ready before calling
744 the function: wait until the socket is writable if writing is nonzero, wait
745 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100746
Victor Stinner81c41db2015-04-02 11:50:57 +0200747 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200748 the function, except if the signal handler raised an exception (PEP 475).
749
750 When the function is retried, recompute the timeout using a monotonic clock.
751
Victor Stinner81c41db2015-04-02 11:50:57 +0200752 sock_call_ex() must be called with the GIL held. The socket function is
753 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200754static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200755sock_call_ex(PySocketSockObject *s,
756 int writing,
757 int (*sock_func) (PySocketSockObject *s, void *data),
758 void *data,
759 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200760 int *err,
761 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200762{
Victor Stinner8912d142015-04-06 23:16:34 +0200763 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764 _PyTime_t deadline = 0;
765 int deadline_initialized = 0;
766 int res;
767
Victor Stinner92f01132015-10-11 09:54:42 +0200768#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200769 /* sock_call() must be called with the GIL held. */
770 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200771#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200772
773 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200774 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200775 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200776 /* For connect(), poll even for blocking socket. The connection
777 runs asynchronously. */
778 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200779 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200780 _PyTime_t interval;
781
Victor Stinner81c41db2015-04-02 11:50:57 +0200782 if (deadline_initialized) {
783 /* recompute the timeout */
784 interval = deadline - _PyTime_GetMonotonicClock();
785 }
786 else {
787 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200788 deadline = _PyTime_GetMonotonicClock() + timeout;
789 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200790 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200791
Victor Stinner10550cd2015-04-03 13:22:27 +0200792 if (interval >= 0)
793 res = internal_select(s, writing, interval, connect);
794 else
795 res = 1;
796 }
797 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200798 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200799 }
800
Victor Stinner31bf2d52015-04-01 21:57:09 +0200801 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200802 if (err)
803 *err = GET_SOCK_ERROR;
804
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 if (CHECK_ERRNO(EINTR)) {
806 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200807 if (PyErr_CheckSignals()) {
808 if (err)
809 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200810 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200812
813 /* retry select() */
814 continue;
815 }
816
817 /* select() failed */
818 s->errorhandler();
819 return -1;
820 }
821
822 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 if (err)
824 *err = SOCK_TIMEOUT_ERR;
825 else
826 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827 return -1;
828 }
829
830 /* the socket is ready */
831 }
832
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 /* inner loop to retry sock_func() when sock_func() is interrupted
834 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200835 while (1) {
836 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200837 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200838 Py_END_ALLOW_THREADS
839
840 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 /* sock_func() succeeded */
842 if (err)
843 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844 return 0;
845 }
846
Victor Stinner81c41db2015-04-02 11:50:57 +0200847 if (err)
848 *err = GET_SOCK_ERROR;
849
Victor Stinner31bf2d52015-04-01 21:57:09 +0200850 if (!CHECK_ERRNO(EINTR))
851 break;
852
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 /* sock_func() was interrupted by a signal */
854 if (PyErr_CheckSignals()) {
855 if (err)
856 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200857 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859
Victor Stinner81c41db2015-04-02 11:50:57 +0200860 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861 }
862
863 if (s->sock_timeout > 0
864 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200865 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200866
867 For example, select() could indicate a socket is ready for
868 reading, but the data then discarded by the OS because of a
869 wrong checksum.
870
871 Loop on select() to recheck for socket readyness. */
872 continue;
873 }
874
Victor Stinner81c41db2015-04-02 11:50:57 +0200875 /* sock_func() failed */
876 if (!err)
877 s->errorhandler();
878 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000879 return -1;
880 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200881}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000882
Victor Stinner81c41db2015-04-02 11:50:57 +0200883static int
884sock_call(PySocketSockObject *s,
885 int writing,
886 int (*func) (PySocketSockObject *s, void *data),
887 void *data)
888{
Victor Stinner8912d142015-04-06 23:16:34 +0200889 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200890}
891
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000892
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000893/* Initialize a new socket object. */
894
Victor Stinner88ed6402015-04-09 10:23:12 +0200895/* Default timeout for new sockets */
896static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000897
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200898static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000899init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 s->sock_fd = fd;
903 s->sock_family = family;
904 s->sock_type = type;
905 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000908#ifdef SOCK_NONBLOCK
909 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100910 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000911 else
912#endif
913 {
914 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200915 if (defaulttimeout >= 0) {
916 if (internal_setblocking(s, 0) == -1) {
917 return -1;
918 }
919 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000920 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200921 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000922}
923
924
Guido van Rossum30a685f1991-06-27 15:51:29 +0000925/* Create a new socket object.
926 This just creates the object and initializes it.
927 If the creation fails, return NULL and set an exception (implicit
928 in NEWOBJ()). */
929
Guido van Rossum73624e91994-10-10 17:59:00 +0000930static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000931new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 PySocketSockObject *s;
934 s = (PySocketSockObject *)
935 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200936 if (s == NULL)
937 return NULL;
938 if (init_sockobject(s, fd, family, type, proto) == -1) {
939 Py_DECREF(s);
940 return NULL;
941 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000943}
944
Guido van Rossum30a685f1991-06-27 15:51:29 +0000945
Guido van Rossum48a680c2001-03-02 06:34:14 +0000946/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000947 thread to be in gethostbyname or getaddrinfo */
948#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200949static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000950#endif
951
952
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953/* Convert a string specifying a host name or one of a few symbolic
954 names to a numeric IP address. This usually calls gethostbyname()
955 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000956 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957 an error occurred; then an exception is raised. */
958
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000959static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200960setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 struct addrinfo hints, *res;
963 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
966 if (name[0] == '\0') {
967 int siz;
968 memset(&hints, 0, sizeof(hints));
969 hints.ai_family = af;
970 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
971 hints.ai_flags = AI_PASSIVE;
972 Py_BEGIN_ALLOW_THREADS
973 ACQUIRE_GETADDRINFO_LOCK
974 error = getaddrinfo(NULL, "0", &hints, &res);
975 Py_END_ALLOW_THREADS
976 /* We assume that those thread-unsafe getaddrinfo() versions
977 *are* safe regarding their return value, ie. that a
978 subsequent call to getaddrinfo() does not destroy the
979 outcome of the first call. */
980 RELEASE_GETADDRINFO_LOCK
981 if (error) {
982 set_gaierror(error);
983 return -1;
984 }
985 switch (res->ai_family) {
986 case AF_INET:
987 siz = 4;
988 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000989#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 case AF_INET6:
991 siz = 16;
992 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000993#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 default:
995 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200996 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 "unsupported address family");
998 return -1;
999 }
1000 if (res->ai_next) {
1001 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001002 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 "wildcard resolved to multiple address");
1004 return -1;
1005 }
1006 if (res->ai_addrlen < addr_ret_size)
1007 addr_ret_size = res->ai_addrlen;
1008 memcpy(addr_ret, res->ai_addr, addr_ret_size);
1009 freeaddrinfo(res);
1010 return siz;
1011 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +01001013 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014 if (strcmp(name, "255.255.255.255") == 0 ||
1015 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 struct sockaddr_in *sin;
1017 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001018 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 "address family mismatched");
1020 return -1;
1021 }
1022 sin = (struct sockaddr_in *)addr_ret;
1023 memset((void *) sin, '\0', sizeof(*sin));
1024 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001025#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001026 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 sin->sin_addr.s_addr = INADDR_BROADCAST;
1029 return sizeof(sin->sin_addr);
1030 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001031
1032 /* avoid a name resolution in case of numeric address */
1033#ifdef HAVE_INET_PTON
1034 /* check for an IPv4 address */
1035 if (af == AF_UNSPEC || af == AF_INET) {
1036 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1037 memset(sin, 0, sizeof(*sin));
1038 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1039 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001040#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001041 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001042#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001043 return 4;
1044 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001046#ifdef ENABLE_IPV6
1047 /* check for an IPv6 address - if the address contains a scope ID, we
1048 * fallback to getaddrinfo(), which can handle translation from interface
1049 * name to interface index */
1050 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1051 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1052 memset(sin, 0, sizeof(*sin));
1053 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1054 sin->sin6_family = AF_INET6;
1055#ifdef HAVE_SOCKADDR_SA_LEN
1056 sin->sin6_len = sizeof(*sin);
1057#endif
1058 return 16;
1059 }
1060 }
1061#endif /* ENABLE_IPV6 */
1062#else /* HAVE_INET_PTON */
1063 /* check for an IPv4 address */
1064 if (af == AF_INET || af == AF_UNSPEC) {
1065 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1066 memset(sin, 0, sizeof(*sin));
1067 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1068 sin->sin_family = AF_INET;
1069#ifdef HAVE_SOCKADDR_SA_LEN
1070 sin->sin_len = sizeof(*sin);
1071#endif
1072 return 4;
1073 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001074 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001075#endif /* HAVE_INET_PTON */
1076
1077 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 memset(&hints, 0, sizeof(hints));
1079 hints.ai_family = af;
1080 Py_BEGIN_ALLOW_THREADS
1081 ACQUIRE_GETADDRINFO_LOCK
1082 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001083#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 if (error == EAI_NONAME && af == AF_UNSPEC) {
1085 /* On Tru64 V5.1, numeric-to-addr conversion fails
1086 if no address family is given. Assume IPv4 for now.*/
1087 hints.ai_family = AF_INET;
1088 error = getaddrinfo(name, NULL, &hints, &res);
1089 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 Py_END_ALLOW_THREADS
1092 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1093 if (error) {
1094 set_gaierror(error);
1095 return -1;
1096 }
1097 if (res->ai_addrlen < addr_ret_size)
1098 addr_ret_size = res->ai_addrlen;
1099 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1100 freeaddrinfo(res);
1101 switch (addr_ret->sa_family) {
1102 case AF_INET:
1103 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001104#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 case AF_INET6:
1106 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001109 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 return -1;
1111 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001112}
1113
Guido van Rossum30a685f1991-06-27 15:51:29 +00001114
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115/* Create a string object representing an IP address.
1116 This is always a string of the form 'dd.dd.dd.dd' (with variable
1117 size numbers). */
1118
Guido van Rossum73624e91994-10-10 17:59:00 +00001119static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001120makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 char buf[NI_MAXHOST];
1123 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1126 NI_NUMERICHOST);
1127 if (error) {
1128 set_gaierror(error);
1129 return NULL;
1130 }
1131 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001132}
1133
1134
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001135#ifdef USE_BLUETOOTH
1136/* Convert a string representation of a Bluetooth address into a numeric
1137 address. Returns the length (6), or raises an exception and returns -1 if
1138 an error occurred. */
1139
1140static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001141setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 unsigned int b0, b1, b2, b3, b4, b5;
1144 char ch;
1145 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1148 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1149 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1150 bdaddr->b[0] = b0;
1151 bdaddr->b[1] = b1;
1152 bdaddr->b[2] = b2;
1153 bdaddr->b[3] = b3;
1154 bdaddr->b[4] = b4;
1155 bdaddr->b[5] = b5;
1156 return 6;
1157 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001158 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 return -1;
1160 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001161}
1162
1163/* Create a string representation of the Bluetooth address. This is always a
1164 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1165 value (zero padded if necessary). */
1166
1167static PyObject *
1168makebdaddr(bdaddr_t *bdaddr)
1169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1173 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1174 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1175 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001176}
1177#endif
1178
1179
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180/* Create an object representing the given socket address,
1181 suitable for passing it back to bind(), connect() etc.
1182 The family field of the sockaddr structure is inspected
1183 to determine what kind of address it really is. */
1184
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001185/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001186static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001187makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001188{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 if (addrlen == 0) {
1190 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001191 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001195
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001196 case AF_INET:
1197 {
1198 struct sockaddr_in *a;
1199 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1200 PyObject *ret = NULL;
1201 if (addrobj) {
1202 a = (struct sockaddr_in *)addr;
1203 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1204 Py_DECREF(addrobj);
1205 }
1206 return ret;
1207 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001208
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001209#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 case AF_UNIX:
1211 {
1212 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001213#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001214 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1215 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1216 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 }
1218 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001219#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 {
1221 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001222 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001223 }
1224 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001225#endif /* AF_UNIX */
1226
Martin v. Löwis11017b12006-01-14 18:12:57 +00001227#if defined(AF_NETLINK)
1228 case AF_NETLINK:
1229 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1231 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001232 }
1233#endif /* AF_NETLINK */
1234
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001235#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 case AF_INET6:
1237 {
1238 struct sockaddr_in6 *a;
1239 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1240 PyObject *ret = NULL;
1241 if (addrobj) {
1242 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001243 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 addrobj,
1245 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001246 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 a->sin6_scope_id);
1248 Py_DECREF(addrobj);
1249 }
1250 return ret;
1251 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001252#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001253
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001254#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001255 case AF_BLUETOOTH:
1256 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 case BTPROTO_L2CAP:
1259 {
1260 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1261 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1262 PyObject *ret = NULL;
1263 if (addrobj) {
1264 ret = Py_BuildValue("Oi",
1265 addrobj,
1266 _BT_L2_MEMB(a, psm));
1267 Py_DECREF(addrobj);
1268 }
1269 return ret;
1270 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001272 case BTPROTO_RFCOMM:
1273 {
1274 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1275 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1276 PyObject *ret = NULL;
1277 if (addrobj) {
1278 ret = Py_BuildValue("Oi",
1279 addrobj,
1280 _BT_RC_MEMB(a, channel));
1281 Py_DECREF(addrobj);
1282 }
1283 return ret;
1284 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 case BTPROTO_HCI:
1287 {
1288 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001289#if defined(__NetBSD__) || defined(__DragonFly__)
1290 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1291#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001292 PyObject *ret = NULL;
1293 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1294 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001297
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001298#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 case BTPROTO_SCO:
1300 {
1301 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1302 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1303 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001304#endif
1305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 default:
1307 PyErr_SetString(PyExc_ValueError,
1308 "Unknown Bluetooth protocol");
1309 return NULL;
1310 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001311#endif
1312
Antoine Pitroub156a462010-10-27 20:13:57 +00001313#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 case AF_PACKET:
1315 {
1316 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1317 char *ifname = "";
1318 struct ifreq ifr;
1319 /* need to look up interface name give index */
1320 if (a->sll_ifindex) {
1321 ifr.ifr_ifindex = a->sll_ifindex;
1322 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1323 ifname = ifr.ifr_name;
1324 }
1325 return Py_BuildValue("shbhy#",
1326 ifname,
1327 ntohs(a->sll_protocol),
1328 a->sll_pkttype,
1329 a->sll_hatype,
1330 a->sll_addr,
1331 a->sll_halen);
1332 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001333#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001334
Christian Heimes043d6f62008-01-07 17:19:16 +00001335#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 case AF_TIPC:
1337 {
1338 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1339 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1340 return Py_BuildValue("IIIII",
1341 a->addrtype,
1342 a->addr.nameseq.type,
1343 a->addr.nameseq.lower,
1344 a->addr.nameseq.upper,
1345 a->scope);
1346 } else if (a->addrtype == TIPC_ADDR_NAME) {
1347 return Py_BuildValue("IIIII",
1348 a->addrtype,
1349 a->addr.name.name.type,
1350 a->addr.name.name.instance,
1351 a->addr.name.name.instance,
1352 a->scope);
1353 } else if (a->addrtype == TIPC_ADDR_ID) {
1354 return Py_BuildValue("IIIII",
1355 a->addrtype,
1356 a->addr.id.node,
1357 a->addr.id.ref,
1358 0,
1359 a->scope);
1360 } else {
1361 PyErr_SetString(PyExc_ValueError,
1362 "Invalid address type");
1363 return NULL;
1364 }
1365 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001366#endif
1367
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001368#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001369 case AF_CAN:
1370 {
1371 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1372 char *ifname = "";
1373 struct ifreq ifr;
1374 /* need to look up interface name given index */
1375 if (a->can_ifindex) {
1376 ifr.ifr_ifindex = a->can_ifindex;
1377 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1378 ifname = ifr.ifr_name;
1379 }
1380
1381 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1382 ifname,
1383 a->can_family);
1384 }
1385#endif
1386
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001387#ifdef PF_SYSTEM
1388 case PF_SYSTEM:
1389 switch(proto) {
1390#ifdef SYSPROTO_CONTROL
1391 case SYSPROTO_CONTROL:
1392 {
1393 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1394 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1395 }
1396#endif
1397 default:
1398 PyErr_SetString(PyExc_ValueError,
1399 "Invalid address type");
1400 return 0;
1401 }
1402#endif
1403
Christian Heimesdffa3942016-09-05 23:54:41 +02001404#ifdef HAVE_SOCKADDR_ALG
1405 case AF_ALG:
1406 {
1407 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1408 return Py_BuildValue("s#s#HH",
1409 a->salg_type,
1410 strnlen((const char*)a->salg_type,
1411 sizeof(a->salg_type)),
1412 a->salg_name,
1413 strnlen((const char*)a->salg_name,
1414 sizeof(a->salg_name)),
1415 a->salg_feat,
1416 a->salg_mask);
1417 }
1418#endif
1419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 default:
1423 /* If we don't know the address family, don't raise an
1424 exception -- return it as an (int, bytes) tuple. */
1425 return Py_BuildValue("iy#",
1426 addr->sa_family,
1427 addr->sa_data,
1428 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001431}
1432
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001433/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1434 (in particular, numeric IP addresses). */
1435struct maybe_idna {
1436 PyObject *obj;
1437 char *buf;
1438};
1439
1440static void
1441idna_cleanup(struct maybe_idna *data)
1442{
1443 Py_CLEAR(data->obj);
1444}
1445
1446static int
1447idna_converter(PyObject *obj, struct maybe_idna *data)
1448{
1449 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001450 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001451 if (obj == NULL) {
1452 idna_cleanup(data);
1453 return 1;
1454 }
1455 data->obj = NULL;
1456 len = -1;
1457 if (PyBytes_Check(obj)) {
1458 data->buf = PyBytes_AsString(obj);
1459 len = PyBytes_Size(obj);
1460 }
1461 else if (PyByteArray_Check(obj)) {
1462 data->buf = PyByteArray_AsString(obj);
1463 len = PyByteArray_Size(obj);
1464 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001465 else if (PyUnicode_Check(obj)) {
1466 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1467 data->buf = PyUnicode_DATA(obj);
1468 len = PyUnicode_GET_LENGTH(obj);
1469 }
1470 else {
1471 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1472 if (!obj2) {
1473 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1474 return 0;
1475 }
1476 assert(PyBytes_Check(obj2));
1477 data->obj = obj2;
1478 data->buf = PyBytes_AS_STRING(obj2);
1479 len = PyBytes_GET_SIZE(obj2);
1480 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001481 }
1482 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001483 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1484 obj->ob_type->tp_name);
1485 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001486 }
1487 if (strlen(data->buf) != len) {
1488 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001489 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001490 return 0;
1491 }
1492 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001493}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001494
1495/* Parse a socket address argument according to the socket object's
1496 address family. Return 1 if the address was in the proper format,
1497 0 of not. The address is returned through addr_ret, its length
1498 through len_ret. */
1499
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001500static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001501getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001505
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001506#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 case AF_UNIX:
1508 {
1509 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001510 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001511 int retval = 0;
1512
1513 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1514 allow embedded nulls on Linux. */
1515 if (PyUnicode_Check(args)) {
1516 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1517 return 0;
1518 }
1519 else
1520 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001521 if (!PyArg_Parse(args, "y*", &path)) {
1522 Py_DECREF(args);
1523 return retval;
1524 }
1525 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001528#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001529 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001531 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001532 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001534 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 }
1536 }
1537 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001538#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 {
1540 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001541 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001542 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001544 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001546 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 }
1548 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001549 memcpy(addr->sun_path, path.buf, path.len);
1550 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001551 retval = 1;
1552 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001554 Py_DECREF(args);
1555 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001557#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001558
Martin v. Löwis11017b12006-01-14 18:12:57 +00001559#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001560 case AF_NETLINK:
1561 {
1562 struct sockaddr_nl* addr;
1563 int pid, groups;
1564 addr = (struct sockaddr_nl *)addr_ret;
1565 if (!PyTuple_Check(args)) {
1566 PyErr_Format(
1567 PyExc_TypeError,
1568 "getsockaddrarg: "
1569 "AF_NETLINK address must be tuple, not %.500s",
1570 Py_TYPE(args)->tp_name);
1571 return 0;
1572 }
1573 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1574 return 0;
1575 addr->nl_family = AF_NETLINK;
1576 addr->nl_pid = pid;
1577 addr->nl_groups = groups;
1578 *len_ret = sizeof(*addr);
1579 return 1;
1580 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001581#endif
1582
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001583#ifdef AF_RDS
1584 case AF_RDS:
1585 /* RDS sockets use sockaddr_in: fall-through */
1586#endif
1587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 case AF_INET:
1589 {
1590 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001591 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 int port, result;
1593 if (!PyTuple_Check(args)) {
1594 PyErr_Format(
1595 PyExc_TypeError,
1596 "getsockaddrarg: "
1597 "AF_INET address must be tuple, not %.500s",
1598 Py_TYPE(args)->tp_name);
1599 return 0;
1600 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001601 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1602 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 return 0;
1604 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001605 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001607 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 if (result < 0)
1609 return 0;
1610 if (port < 0 || port > 0xffff) {
1611 PyErr_SetString(
1612 PyExc_OverflowError,
1613 "getsockaddrarg: port must be 0-65535.");
1614 return 0;
1615 }
1616 addr->sin_family = AF_INET;
1617 addr->sin_port = htons((short)port);
1618 *len_ret = sizeof *addr;
1619 return 1;
1620 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001621
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001622#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001623 case AF_INET6:
1624 {
1625 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001626 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001627 int port, result;
1628 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 flowinfo = scope_id = 0;
1630 if (!PyTuple_Check(args)) {
1631 PyErr_Format(
1632 PyExc_TypeError,
1633 "getsockaddrarg: "
1634 "AF_INET6 address must be tuple, not %.500s",
1635 Py_TYPE(args)->tp_name);
1636 return 0;
1637 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 if (!PyArg_ParseTuple(args, "O&i|II",
1639 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 &scope_id)) {
1641 return 0;
1642 }
1643 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001644 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001646 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 if (result < 0)
1648 return 0;
1649 if (port < 0 || port > 0xffff) {
1650 PyErr_SetString(
1651 PyExc_OverflowError,
1652 "getsockaddrarg: port must be 0-65535.");
1653 return 0;
1654 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001655 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001656 PyErr_SetString(
1657 PyExc_OverflowError,
1658 "getsockaddrarg: flowinfo must be 0-1048575.");
1659 return 0;
1660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 addr->sin6_family = s->sock_family;
1662 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001663 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 addr->sin6_scope_id = scope_id;
1665 *len_ret = sizeof *addr;
1666 return 1;
1667 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001668#endif
1669
Hye-Shik Chang81268602004-02-02 06:05:24 +00001670#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 case AF_BLUETOOTH:
1672 {
1673 switch (s->sock_proto) {
1674 case BTPROTO_L2CAP:
1675 {
1676 struct sockaddr_l2 *addr;
1677 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001679 addr = (struct sockaddr_l2 *)addr_ret;
1680 memset(addr, 0, sizeof(struct sockaddr_l2));
1681 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1682 if (!PyArg_ParseTuple(args, "si", &straddr,
1683 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001684 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 "wrong format");
1686 return 0;
1687 }
1688 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1689 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 *len_ret = sizeof *addr;
1692 return 1;
1693 }
1694 case BTPROTO_RFCOMM:
1695 {
1696 struct sockaddr_rc *addr;
1697 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 addr = (struct sockaddr_rc *)addr_ret;
1700 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1701 if (!PyArg_ParseTuple(args, "si", &straddr,
1702 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001703 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 "wrong format");
1705 return 0;
1706 }
1707 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1708 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 *len_ret = sizeof *addr;
1711 return 1;
1712 }
1713 case BTPROTO_HCI:
1714 {
1715 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001716#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001717 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001718
Alexander Belopolskye239d232010-12-08 23:31:48 +00001719 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001720 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001721 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001722 "wrong format");
1723 return 0;
1724 }
1725 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1726 return 0;
1727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1729 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001730 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001731 "wrong format");
1732 return 0;
1733 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 *len_ret = sizeof *addr;
1736 return 1;
1737 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001738#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001739 case BTPROTO_SCO:
1740 {
1741 struct sockaddr_sco *addr;
1742 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 addr = (struct sockaddr_sco *)addr_ret;
1745 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1746 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001747 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 "wrong format");
1749 return 0;
1750 }
1751 straddr = PyBytes_AS_STRING(args);
1752 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1753 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 *len_ret = sizeof *addr;
1756 return 1;
1757 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001758#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001760 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 return 0;
1762 }
1763 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001764#endif
1765
Antoine Pitroub156a462010-10-27 20:13:57 +00001766#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 case AF_PACKET:
1768 {
1769 struct sockaddr_ll* addr;
1770 struct ifreq ifr;
1771 char *interfaceName;
1772 int protoNumber;
1773 int hatype = 0;
1774 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001775 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 if (!PyTuple_Check(args)) {
1778 PyErr_Format(
1779 PyExc_TypeError,
1780 "getsockaddrarg: "
1781 "AF_PACKET address must be tuple, not %.500s",
1782 Py_TYPE(args)->tp_name);
1783 return 0;
1784 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001785 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001787 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 return 0;
1789 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1790 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1791 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1792 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001793 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 return 0;
1795 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001796 if (haddr.buf && haddr.len > 8) {
1797 PyErr_SetString(PyExc_ValueError,
1798 "Hardware address must be 8 bytes or less");
1799 PyBuffer_Release(&haddr);
1800 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 }
1802 if (protoNumber < 0 || protoNumber > 0xffff) {
1803 PyErr_SetString(
1804 PyExc_OverflowError,
1805 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001806 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 return 0;
1808 }
1809 addr = (struct sockaddr_ll*)addr_ret;
1810 addr->sll_family = AF_PACKET;
1811 addr->sll_protocol = htons((short)protoNumber);
1812 addr->sll_ifindex = ifr.ifr_ifindex;
1813 addr->sll_pkttype = pkttype;
1814 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001815 if (haddr.buf) {
1816 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1817 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001819 else
1820 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001822 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 return 1;
1824 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001825#endif
1826
Christian Heimes043d6f62008-01-07 17:19:16 +00001827#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 case AF_TIPC:
1829 {
1830 unsigned int atype, v1, v2, v3;
1831 unsigned int scope = TIPC_CLUSTER_SCOPE;
1832 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 if (!PyTuple_Check(args)) {
1835 PyErr_Format(
1836 PyExc_TypeError,
1837 "getsockaddrarg: "
1838 "AF_TIPC address must be tuple, not %.500s",
1839 Py_TYPE(args)->tp_name);
1840 return 0;
1841 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 if (!PyArg_ParseTuple(args,
1844 "IIII|I;Invalid TIPC address format",
1845 &atype, &v1, &v2, &v3, &scope))
1846 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 addr = (struct sockaddr_tipc *) addr_ret;
1849 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 addr->family = AF_TIPC;
1852 addr->scope = scope;
1853 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 if (atype == TIPC_ADDR_NAMESEQ) {
1856 addr->addr.nameseq.type = v1;
1857 addr->addr.nameseq.lower = v2;
1858 addr->addr.nameseq.upper = v3;
1859 } else if (atype == TIPC_ADDR_NAME) {
1860 addr->addr.name.name.type = v1;
1861 addr->addr.name.name.instance = v2;
1862 } else if (atype == TIPC_ADDR_ID) {
1863 addr->addr.id.node = v1;
1864 addr->addr.id.ref = v2;
1865 } else {
1866 /* Shouldn't happen */
1867 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1868 return 0;
1869 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 return 1;
1874 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001875#endif
1876
Vinay Sajiped6783f2014-03-21 11:44:32 +00001877#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001878 case AF_CAN:
1879 switch (s->sock_proto) {
1880 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001881 /* fall-through */
1882 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001883 {
1884 struct sockaddr_can *addr;
1885 PyObject *interfaceName;
1886 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001887 Py_ssize_t len;
1888
Benjamin Peterson18b71912013-05-16 15:29:44 -05001889 addr = (struct sockaddr_can *)addr_ret;
1890
Charles-François Natali47413c12011-10-06 19:47:44 +02001891 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1892 &interfaceName))
1893 return 0;
1894
1895 len = PyBytes_GET_SIZE(interfaceName);
1896
1897 if (len == 0) {
1898 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001899 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001900 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1901 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001902 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1903 s->errorhandler();
1904 Py_DECREF(interfaceName);
1905 return 0;
1906 }
1907 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001908 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001909 "AF_CAN interface name too long");
1910 Py_DECREF(interfaceName);
1911 return 0;
1912 }
1913
1914 addr->can_family = AF_CAN;
1915 addr->can_ifindex = ifr.ifr_ifindex;
1916
1917 *len_ret = sizeof(*addr);
1918 Py_DECREF(interfaceName);
1919 return 1;
1920 }
1921 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001922 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001923 "getsockaddrarg: unsupported CAN protocol");
1924 return 0;
1925 }
1926#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001927
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001928#ifdef PF_SYSTEM
1929 case PF_SYSTEM:
1930 switch (s->sock_proto) {
1931#ifdef SYSPROTO_CONTROL
1932 case SYSPROTO_CONTROL:
1933 {
1934 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001935
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001936 addr = (struct sockaddr_ctl *)addr_ret;
1937 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001938 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001939
1940 if (PyUnicode_Check(args)) {
1941 struct ctl_info info;
1942 PyObject *ctl_name;
1943
1944 if (!PyArg_Parse(args, "O&",
1945 PyUnicode_FSConverter, &ctl_name)) {
1946 return 0;
1947 }
1948
Victor Stinnerf50e1872015-03-20 11:32:24 +01001949 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001950 PyErr_SetString(PyExc_ValueError,
1951 "provided string is too long");
1952 Py_DECREF(ctl_name);
1953 return 0;
1954 }
1955 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1956 sizeof(info.ctl_name));
1957 Py_DECREF(ctl_name);
1958
1959 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1960 PyErr_SetString(PyExc_OSError,
1961 "cannot find kernel control with provided name");
1962 return 0;
1963 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001964
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001965 addr->sc_id = info.ctl_id;
1966 addr->sc_unit = 0;
1967 } else if (!PyArg_ParseTuple(args, "II",
1968 &(addr->sc_id), &(addr->sc_unit))) {
1969 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1970 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001971
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001972 return 0;
1973 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001974
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001975 *len_ret = sizeof(*addr);
1976 return 1;
1977 }
1978#endif
1979 default:
1980 PyErr_SetString(PyExc_OSError,
1981 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1982 return 0;
1983 }
1984#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02001985#ifdef HAVE_SOCKADDR_ALG
1986 case AF_ALG:
1987 {
1988 struct sockaddr_alg *sa;
1989 char *type;
1990 char *name;
1991 sa = (struct sockaddr_alg *)addr_ret;
1992
1993 memset(sa, 0, sizeof(*sa));
1994 sa->salg_family = AF_ALG;
1995
1996 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
1997 &type, &name, &sa->salg_feat, &sa->salg_mask))
1998 return 0;
1999 /* sockaddr_alg has fixed-sized char arrays for type and name */
2000 if (strlen(type) > sizeof(sa->salg_type)) {
2001 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2002 return 0;
2003 }
2004 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2005 if (strlen(name) > sizeof(sa->salg_name)) {
2006 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2007 return 0;
2008 }
2009 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2010
2011 *len_ret = sizeof(*sa);
2012 return 1;
2013 }
2014#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002019 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002023}
2024
Guido van Rossum30a685f1991-06-27 15:51:29 +00002025
Guido van Rossum48a680c2001-03-02 06:34:14 +00002026/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002027 Return 1 if the family is known, 0 otherwise. The length is returned
2028 through len_ret. */
2029
2030static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002031getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002034
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002035#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 case AF_UNIX:
2037 {
2038 *len_ret = sizeof (struct sockaddr_un);
2039 return 1;
2040 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002041#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002042
Martin v. Löwis11017b12006-01-14 18:12:57 +00002043#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002044 case AF_NETLINK:
2045 {
2046 *len_ret = sizeof (struct sockaddr_nl);
2047 return 1;
2048 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002049#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002050
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002051#ifdef AF_RDS
2052 case AF_RDS:
2053 /* RDS sockets use sockaddr_in: fall-through */
2054#endif
2055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002056 case AF_INET:
2057 {
2058 *len_ret = sizeof (struct sockaddr_in);
2059 return 1;
2060 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002061
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002062#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 case AF_INET6:
2064 {
2065 *len_ret = sizeof (struct sockaddr_in6);
2066 return 1;
2067 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002068#endif
2069
Hye-Shik Chang81268602004-02-02 06:05:24 +00002070#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 case AF_BLUETOOTH:
2072 {
2073 switch(s->sock_proto)
2074 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002076 case BTPROTO_L2CAP:
2077 *len_ret = sizeof (struct sockaddr_l2);
2078 return 1;
2079 case BTPROTO_RFCOMM:
2080 *len_ret = sizeof (struct sockaddr_rc);
2081 return 1;
2082 case BTPROTO_HCI:
2083 *len_ret = sizeof (struct sockaddr_hci);
2084 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002085#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 case BTPROTO_SCO:
2087 *len_ret = sizeof (struct sockaddr_sco);
2088 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002089#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002090 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002091 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 "unknown BT protocol");
2093 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 }
2096 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002097#endif
2098
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002099#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 case AF_PACKET:
2101 {
2102 *len_ret = sizeof (struct sockaddr_ll);
2103 return 1;
2104 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002105#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002106
Christian Heimes043d6f62008-01-07 17:19:16 +00002107#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 case AF_TIPC:
2109 {
2110 *len_ret = sizeof (struct sockaddr_tipc);
2111 return 1;
2112 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002113#endif
2114
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002115#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002116 case AF_CAN:
2117 {
2118 *len_ret = sizeof (struct sockaddr_can);
2119 return 1;
2120 }
2121#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002122
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002123#ifdef PF_SYSTEM
2124 case PF_SYSTEM:
2125 switch(s->sock_proto) {
2126#ifdef SYSPROTO_CONTROL
2127 case SYSPROTO_CONTROL:
2128 *len_ret = sizeof (struct sockaddr_ctl);
2129 return 1;
2130#endif
2131 default:
2132 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2133 "unknown PF_SYSTEM protocol");
2134 return 0;
2135 }
2136#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002137#ifdef HAVE_SOCKADDR_ALG
2138 case AF_ALG:
2139 {
2140 *len_ret = sizeof (struct sockaddr_alg);
2141 return 1;
2142 }
2143#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002147 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002148 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002149 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002152}
2153
2154
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002155/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2156 Currently, these methods are only compiled if the RFC 2292/3542
2157 CMSG_LEN() macro is available. Older systems seem to have used
2158 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2159 it may be possible to define CMSG_LEN() that way if it's not
2160 provided. Some architectures might need extra padding after the
2161 cmsghdr, however, and CMSG_LEN() would have to take account of
2162 this. */
2163#ifdef CMSG_LEN
2164/* If length is in range, set *result to CMSG_LEN(length) and return
2165 true; otherwise, return false. */
2166static int
2167get_CMSG_LEN(size_t length, size_t *result)
2168{
2169 size_t tmp;
2170
2171 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2172 return 0;
2173 tmp = CMSG_LEN(length);
2174 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2175 return 0;
2176 *result = tmp;
2177 return 1;
2178}
2179
2180#ifdef CMSG_SPACE
2181/* If length is in range, set *result to CMSG_SPACE(length) and return
2182 true; otherwise, return false. */
2183static int
2184get_CMSG_SPACE(size_t length, size_t *result)
2185{
2186 size_t tmp;
2187
2188 /* Use CMSG_SPACE(1) here in order to take account of the padding
2189 necessary before *and* after the data. */
2190 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2191 return 0;
2192 tmp = CMSG_SPACE(length);
2193 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2194 return 0;
2195 *result = tmp;
2196 return 1;
2197}
2198#endif
2199
2200/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2201 pointer in msg->msg_control with at least "space" bytes after it,
2202 and its cmsg_len member inside the buffer. */
2203static int
2204cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2205{
2206 size_t cmsg_offset;
2207 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2208 sizeof(cmsgh->cmsg_len));
2209
Charles-François Natali466517d2011-08-28 18:23:43 +02002210 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002211 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002212 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002213 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2214 annoying under OS X as it's unsigned there and so it triggers a
2215 tautological comparison warning under Clang when compared against 0.
2216 Since the check is valid on other platforms, silence the warning under
2217 Clang. */
2218 #ifdef __clang__
2219 #pragma clang diagnostic push
2220 #pragma clang diagnostic ignored "-Wtautological-compare"
2221 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002222 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002223 #pragma GCC diagnostic push
2224 #pragma GCC diagnostic ignored "-Wtype-limits"
2225 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002226 if (msg->msg_controllen < 0)
2227 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002228 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002229 #pragma GCC diagnostic pop
2230 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002231 #ifdef __clang__
2232 #pragma clang diagnostic pop
2233 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002234 if (space < cmsg_len_end)
2235 space = cmsg_len_end;
2236 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2237 return (cmsg_offset <= (size_t)-1 - space &&
2238 cmsg_offset + space <= msg->msg_controllen);
2239}
2240
2241/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2242 *space to number of bytes following it in the buffer and return
2243 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2244 msg->msg_controllen are valid. */
2245static int
2246get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2247{
2248 size_t data_offset;
2249 char *data_ptr;
2250
2251 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2252 return 0;
2253 data_offset = data_ptr - (char *)msg->msg_control;
2254 if (data_offset > msg->msg_controllen)
2255 return 0;
2256 *space = msg->msg_controllen - data_offset;
2257 return 1;
2258}
2259
2260/* If cmsgh is invalid or not contained in the buffer pointed to by
2261 msg->msg_control, return -1. If cmsgh is valid and its associated
2262 data is entirely contained in the buffer, set *data_len to the
2263 length of the associated data and return 0. If only part of the
2264 associated data is contained in the buffer but cmsgh is otherwise
2265 valid, set *data_len to the length contained in the buffer and
2266 return 1. */
2267static int
2268get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2269{
2270 size_t space, cmsg_data_len;
2271
2272 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2273 cmsgh->cmsg_len < CMSG_LEN(0))
2274 return -1;
2275 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2276 if (!get_cmsg_data_space(msg, cmsgh, &space))
2277 return -1;
2278 if (space >= cmsg_data_len) {
2279 *data_len = cmsg_data_len;
2280 return 0;
2281 }
2282 *data_len = space;
2283 return 1;
2284}
2285#endif /* CMSG_LEN */
2286
2287
Victor Stinner31bf2d52015-04-01 21:57:09 +02002288struct sock_accept {
2289 socklen_t *addrlen;
2290 sock_addr_t *addrbuf;
2291 SOCKET_T result;
2292};
2293
2294#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2295/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2296static int accept4_works = -1;
2297#endif
2298
2299static int
2300sock_accept_impl(PySocketSockObject *s, void *data)
2301{
2302 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002303 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2304 socklen_t *paddrlen = ctx->addrlen;
2305#ifdef HAVE_SOCKADDR_ALG
2306 /* AF_ALG does not support accept() with addr and raises
2307 * ECONNABORTED instead. */
2308 if (s->sock_family == AF_ALG) {
2309 addr = NULL;
2310 paddrlen = NULL;
2311 *ctx->addrlen = 0;
2312 }
2313#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002314
2315#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2316 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002317 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002318 SOCK_CLOEXEC);
2319 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2320 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2321 accept4_works = (errno != ENOSYS);
2322 }
2323 }
2324 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002325 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002326#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002327 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002328#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002329
2330#ifdef MS_WINDOWS
2331 return (ctx->result != INVALID_SOCKET);
2332#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002333 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002334#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002335}
2336
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002337/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002338
Guido van Rossum73624e91994-10-10 17:59:00 +00002339static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002340sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002343 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 socklen_t addrlen;
2345 PyObject *sock = NULL;
2346 PyObject *addr = NULL;
2347 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002348 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002350 if (!getsockaddrlen(s, &addrlen))
2351 return NULL;
2352 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 if (!IS_SELECTABLE(s))
2355 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002356
Victor Stinner31bf2d52015-04-01 21:57:09 +02002357 ctx.addrlen = &addrlen;
2358 ctx.addrbuf = &addrbuf;
2359 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002361 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002362
Victor Stinnerdaf45552013-08-28 00:53:59 +02002363#ifdef MS_WINDOWS
2364 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2365 PyErr_SetFromWindowsErr(0);
2366 SOCKETCLOSE(newfd);
2367 goto finally;
2368 }
2369#else
2370
2371#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2372 if (!accept4_works)
2373#endif
2374 {
2375 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2376 SOCKETCLOSE(newfd);
2377 goto finally;
2378 }
2379 }
2380#endif
2381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 sock = PyLong_FromSocket_t(newfd);
2383 if (sock == NULL) {
2384 SOCKETCLOSE(newfd);
2385 goto finally;
2386 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2389 addrlen, s->sock_proto);
2390 if (addr == NULL)
2391 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002393 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002394
Guido van Rossum67f7a382002-06-06 21:08:16 +00002395finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 Py_XDECREF(sock);
2397 Py_XDECREF(addr);
2398 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002399}
2400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002401PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002402"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002403\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002404Wait for an incoming connection. Return a new socket file descriptor\n\
2405representing the connection, and the address of the client.\n\
2406For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002407
Guido van Rossum11ba0942002-06-13 15:07:44 +00002408/* s.setblocking(flag) method. Argument:
2409 False -- non-blocking mode; same as settimeout(0)
2410 True -- blocking mode; same as settimeout(None)
2411*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002412
Guido van Rossum73624e91994-10-10 17:59:00 +00002413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002415{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002416 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 block = PyLong_AsLong(arg);
2419 if (block == -1 && PyErr_Occurred())
2420 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002421
Victor Stinner9001d802015-04-06 23:06:01 +02002422 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002423 if (internal_setblocking(s, block) == -1) {
2424 return NULL;
2425 }
2426 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002427}
Guido van Rossume4485b01994-09-07 14:32:49 +00002428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002430"setblocking(flag)\n\
2431\n\
2432Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002433setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002434setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002435
Victor Stinner71694d52015-03-28 01:18:54 +01002436static int
2437socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2438{
2439#ifdef MS_WINDOWS
2440 struct timeval tv;
2441#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002442#ifndef HAVE_POLL
2443 _PyTime_t ms;
2444#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002445 int overflow = 0;
2446
2447 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002448 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002449 return 0;
2450 }
2451
Victor Stinner869e1772015-03-30 03:49:14 +02002452 if (_PyTime_FromSecondsObject(timeout,
2453 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002454 return -1;
2455
2456 if (*timeout < 0) {
2457 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2458 return -1;
2459 }
2460
2461#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002462 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002463#endif
2464#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002465 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2466 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002467#endif
2468 if (overflow) {
2469 PyErr_SetString(PyExc_OverflowError,
2470 "timeout doesn't fit into C timeval");
2471 return -1;
2472 }
2473
2474 return 0;
2475}
2476
Guido van Rossum11ba0942002-06-13 15:07:44 +00002477/* s.settimeout(timeout) method. Argument:
2478 None -- no timeout, blocking mode; same as setblocking(True)
2479 0.0 -- non-blocking mode; same as setblocking(False)
2480 > 0 -- timeout mode; operations time out after timeout seconds
2481 < 0 -- illegal; raises an exception
2482*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002484sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002485{
Victor Stinner71694d52015-03-28 01:18:54 +01002486 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002487
Victor Stinner71694d52015-03-28 01:18:54 +01002488 if (socket_parse_timeout(&timeout, arg) < 0)
2489 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002492 if (internal_setblocking(s, timeout < 0) == -1) {
2493 return NULL;
2494 }
2495 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002496}
2497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002498PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002499"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002500\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002501Set a timeout on socket operations. 'timeout' can be a float,\n\
2502giving in seconds, or None. Setting a timeout of None disables\n\
2503the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002504Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002505
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002506/* s.gettimeout() method.
2507 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002509sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002510{
Victor Stinner71694d52015-03-28 01:18:54 +01002511 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002512 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 }
Victor Stinner71694d52015-03-28 01:18:54 +01002514 else {
2515 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2516 return PyFloat_FromDouble(seconds);
2517 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002518}
2519
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002520PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002521"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002522\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002523Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002524operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002526
Guido van Rossumaee08791992-09-08 09:05:33 +00002527/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002528 With an integer third argument, sets an integer optval with optlen=4.
2529 With None as third argument and an integer fourth argument, set
2530 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002531 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002532 use optional built-in module 'struct' to encode the string.
2533*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002534
Guido van Rossum73624e91994-10-10 17:59:00 +00002535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002536sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 int level;
2539 int optname;
2540 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002541 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002543 unsigned int optlen;
2544 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002545
Christian Heimesdffa3942016-09-05 23:54:41 +02002546 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 if (PyArg_ParseTuple(args, "iii:setsockopt",
2548 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002549 res = setsockopt(s->sock_fd, level, optname,
2550 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002551 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002553
2554 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002555 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002556 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2557 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2558 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002559 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002560 NULL, (socklen_t)optlen);
2561 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002563
2564 PyErr_Clear();
2565 /* setsockopt(level, opt, buffer) */
2566 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2567 &level, &optname, &optval))
2568 return NULL;
2569
2570#ifdef MS_WINDOWS
2571 if (optval.len > INT_MAX) {
2572 PyBuffer_Release(&optval);
2573 PyErr_Format(PyExc_OverflowError,
2574 "socket option is larger than %i bytes",
2575 INT_MAX);
2576 return NULL;
2577 }
2578 res = setsockopt(s->sock_fd, level, optname,
2579 optval.buf, (int)optval.len);
2580#else
2581 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2582#endif
2583 PyBuffer_Release(&optval);
2584
2585done:
Victor Stinnercc739322016-03-23 21:35:29 +01002586 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002588 }
2589
2590 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002591}
2592
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002593PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002594"setsockopt(level, option, value: int)\n\
2595setsockopt(level, option, value: buffer)\n\
2596setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002597\n\
2598Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002599The value argument can either be an integer, a string buffer, or \n\
2600None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002601
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002602
Guido van Rossumaee08791992-09-08 09:05:33 +00002603/* s.getsockopt() method.
2604 With two arguments, retrieves an integer option.
2605 With a third integer argument, retrieves a string buffer of that size;
2606 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002607
Guido van Rossum73624e91994-10-10 17:59:00 +00002608static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002609sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 int level;
2612 int optname;
2613 int res;
2614 PyObject *buf;
2615 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2618 &level, &optname, &buflen))
2619 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 if (buflen == 0) {
2622 int flag = 0;
2623 socklen_t flagsize = sizeof flag;
2624 res = getsockopt(s->sock_fd, level, optname,
2625 (void *)&flag, &flagsize);
2626 if (res < 0)
2627 return s->errorhandler();
2628 return PyLong_FromLong(flag);
2629 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002631 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 "getsockopt buflen out of range");
2633 return NULL;
2634 }
2635 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2636 if (buf == NULL)
2637 return NULL;
2638 res = getsockopt(s->sock_fd, level, optname,
2639 (void *)PyBytes_AS_STRING(buf), &buflen);
2640 if (res < 0) {
2641 Py_DECREF(buf);
2642 return s->errorhandler();
2643 }
2644 _PyBytes_Resize(&buf, buflen);
2645 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002646}
2647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002649"getsockopt(level, option[, buffersize]) -> value\n\
2650\n\
2651Get a socket option. See the Unix manual for level and option.\n\
2652If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002653string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002654
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002655
Fred Drake728819a2000-07-01 03:40:12 +00002656/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002657
Guido van Rossum73624e91994-10-10 17:59:00 +00002658static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002659sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 sock_addr_t addrbuf;
2662 int addrlen;
2663 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2666 return NULL;
2667 Py_BEGIN_ALLOW_THREADS
2668 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2669 Py_END_ALLOW_THREADS
2670 if (res < 0)
2671 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002672 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002673}
2674
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002675PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002676"bind(address)\n\
2677\n\
2678Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002679pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002680sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002681
Guido van Rossum30a685f1991-06-27 15:51:29 +00002682
2683/* s.close() method.
2684 Set the file descriptor to -1 so operations tried subsequently
2685 will surely fail. */
2686
Guido van Rossum73624e91994-10-10 17:59:00 +00002687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002688sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002691 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002692
Victor Stinner19a8e842016-03-21 16:36:48 +01002693 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002694 if (fd != INVALID_SOCKET) {
2695 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002696
2697 /* We do not want to retry upon EINTR: see
2698 http://lwn.net/Articles/576478/ and
2699 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2700 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002702 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002704 if (res < 0) {
2705 return s->errorhandler();
2706 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002708 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002709}
2710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002712"close()\n\
2713\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002714Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002715
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002716static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002717sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002718{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002719 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002720 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002721 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002722}
2723
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002724PyDoc_STRVAR(detach_doc,
2725"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002726\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002727Close the socket object without closing the underlying file descriptor.\n\
2728The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002729can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002730
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002731static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002732sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002733{
Victor Stinner81c41db2015-04-02 11:50:57 +02002734 int err;
2735 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002736
Victor Stinner81c41db2015-04-02 11:50:57 +02002737 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2738 /* getsockopt() failed */
2739 return 0;
2740 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002741
Victor Stinner81c41db2015-04-02 11:50:57 +02002742 if (err == EISCONN)
2743 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002744 if (err != 0) {
2745 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2746 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002747 return 0;
2748 }
2749 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002750}
2751
2752static int
2753internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2754 int raise)
2755{
2756 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002757
2758 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002760 Py_END_ALLOW_THREADS
2761
Victor Stinner70a46f62015-03-31 22:03:59 +02002762 if (!res) {
2763 /* connect() succeeded, the socket is connected */
2764 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002766
Victor Stinner81c41db2015-04-02 11:50:57 +02002767 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002768
Victor Stinner81c41db2015-04-02 11:50:57 +02002769 /* save error, PyErr_CheckSignals() can replace it */
2770 err = GET_SOCK_ERROR;
2771 if (CHECK_ERRNO(EINTR)) {
2772 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002773 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002774
2775 /* Issue #23618: when connect() fails with EINTR, the connection is
2776 running asynchronously.
2777
2778 If the socket is blocking or has a timeout, wait until the
2779 connection completes, fails or timed out using select(), and then
2780 get the connection status using getsockopt(SO_ERROR).
2781
2782 If the socket is non-blocking, raise InterruptedError. The caller is
2783 responsible to wait until the connection completes, fails or timed
2784 out (it's the case in asyncio for example). */
2785 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2786 }
2787 else {
2788 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2789 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002790 }
2791
Victor Stinner81c41db2015-04-02 11:50:57 +02002792 if (!wait_connect) {
2793 if (raise) {
2794 /* restore error, maybe replaced by PyErr_CheckSignals() */
2795 SET_SOCK_ERROR(err);
2796 s->errorhandler();
2797 return -1;
2798 }
2799 else
2800 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002801 }
2802
Victor Stinner81c41db2015-04-02 11:50:57 +02002803 if (raise) {
2804 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002805 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2806 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002807 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002808 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002809 else {
2810 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002811 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2812 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002813 return err;
2814 }
2815 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002816}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002817
Fred Drake728819a2000-07-01 03:40:12 +00002818/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002819
Guido van Rossum73624e91994-10-10 17:59:00 +00002820static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002821sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002822{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 sock_addr_t addrbuf;
2824 int addrlen;
2825 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2828 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002829
Victor Stinner81c41db2015-04-02 11:50:57 +02002830 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002831 if (res < 0)
2832 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002833
Victor Stinneree699e92015-03-31 21:28:42 +02002834 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002835}
2836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002837PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838"connect(address)\n\
2839\n\
2840Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842
Guido van Rossum30a685f1991-06-27 15:51:29 +00002843
Fred Drake728819a2000-07-01 03:40:12 +00002844/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002845
2846static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002847sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002848{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 sock_addr_t addrbuf;
2850 int addrlen;
2851 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2854 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002855
Victor Stinner81c41db2015-04-02 11:50:57 +02002856 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002857 if (res < 0)
2858 return NULL;
2859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002861}
2862
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002863PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002864"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002865\n\
2866This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002867instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002868
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002869
Guido van Rossumed233a51992-06-23 09:07:03 +00002870/* s.fileno() method */
2871
Guido van Rossum73624e91994-10-10 17:59:00 +00002872static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002873sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002876}
2877
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002878PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002879"fileno() -> integer\n\
2880\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002881Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002882
Guido van Rossumed233a51992-06-23 09:07:03 +00002883
Guido van Rossumc89705d1992-11-26 08:54:07 +00002884/* s.getsockname() method */
2885
Guido van Rossum73624e91994-10-10 17:59:00 +00002886static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002887sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 sock_addr_t addrbuf;
2890 int res;
2891 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 if (!getsockaddrlen(s, &addrlen))
2894 return NULL;
2895 memset(&addrbuf, 0, addrlen);
2896 Py_BEGIN_ALLOW_THREADS
2897 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2898 Py_END_ALLOW_THREADS
2899 if (res < 0)
2900 return s->errorhandler();
2901 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2902 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002903}
2904
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002905PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002906"getsockname() -> address info\n\
2907\n\
2908Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002910
Guido van Rossumc89705d1992-11-26 08:54:07 +00002911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002913/* s.getpeername() method */
2914
Guido van Rossum73624e91994-10-10 17:59:00 +00002915static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002916sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 sock_addr_t addrbuf;
2919 int res;
2920 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 if (!getsockaddrlen(s, &addrlen))
2923 return NULL;
2924 memset(&addrbuf, 0, addrlen);
2925 Py_BEGIN_ALLOW_THREADS
2926 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2927 Py_END_ALLOW_THREADS
2928 if (res < 0)
2929 return s->errorhandler();
2930 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2931 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002932}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002934PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002935"getpeername() -> address info\n\
2936\n\
2937Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002938info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002939
Guido van Rossumb6775db1994-08-01 11:34:53 +00002940#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002941
2942
Guido van Rossum30a685f1991-06-27 15:51:29 +00002943/* s.listen(n) method */
2944
Guido van Rossum73624e91994-10-10 17:59:00 +00002945static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002946sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002947{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002948 /* We try to choose a default backlog high enough to avoid connection drops
2949 * for common workloads, yet not too high to limit resource usage. */
2950 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002952
Charles-François Natali644b8f52014-05-22 19:45:39 +01002953 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002957 /* To avoid problems on systems that don't allow a negative backlog
2958 * (which doesn't make sense anyway) we force a minimum value of 0. */
2959 if (backlog < 0)
2960 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 res = listen(s->sock_fd, backlog);
2962 Py_END_ALLOW_THREADS
2963 if (res < 0)
2964 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002965 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002966}
2967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002969"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002970\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002971Enable a server to accept connections. If backlog is specified, it must be\n\
2972at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002973unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002974connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002975
Victor Stinner31bf2d52015-04-01 21:57:09 +02002976struct sock_recv {
2977 char *cbuf;
2978 Py_ssize_t len;
2979 int flags;
2980 Py_ssize_t result;
2981};
2982
2983static int
2984sock_recv_impl(PySocketSockObject *s, void *data)
2985{
2986 struct sock_recv *ctx = data;
2987
2988#ifdef MS_WINDOWS
2989 if (ctx->len > INT_MAX)
2990 ctx->len = INT_MAX;
2991 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2992#else
2993 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2994#endif
2995 return (ctx->result >= 0);
2996}
2997
Guido van Rossum82a5c661998-07-07 20:45:43 +00002998
Thomas Wouters477c8d52006-05-27 19:21:47 +00002999/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003000 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003001 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003002 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003003 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003004 * also possible that we return a number of bytes smaller than the request
3005 * bytes.
3006 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003007
Antoine Pitrou19467d22010-08-17 19:33:30 +00003008static Py_ssize_t
3009sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003010{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003011 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 if (!IS_SELECTABLE(s)) {
3014 select_error();
3015 return -1;
3016 }
3017 if (len == 0) {
3018 /* If 0 bytes were requested, do nothing. */
3019 return 0;
3020 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003021
Victor Stinner31bf2d52015-04-01 21:57:09 +02003022 ctx.cbuf = cbuf;
3023 ctx.len = len;
3024 ctx.flags = flags;
3025 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003027
3028 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003029}
3030
Guido van Rossum48a680c2001-03-02 06:34:14 +00003031
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003032/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003033
Guido van Rossum73624e91994-10-10 17:59:00 +00003034static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003035sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003036{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003037 Py_ssize_t recvlen, outlen;
3038 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003040
Antoine Pitrou19467d22010-08-17 19:33:30 +00003041 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 if (recvlen < 0) {
3045 PyErr_SetString(PyExc_ValueError,
3046 "negative buffersize in recv");
3047 return NULL;
3048 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 /* Allocate a new string. */
3051 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3052 if (buf == NULL)
3053 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 /* Call the guts */
3056 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3057 if (outlen < 0) {
3058 /* An error occurred, release the string and return an
3059 error. */
3060 Py_DECREF(buf);
3061 return NULL;
3062 }
3063 if (outlen != recvlen) {
3064 /* We did not read as many bytes as we anticipated, resize the
3065 string if possible and be successful. */
3066 _PyBytes_Resize(&buf, outlen);
3067 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003070}
3071
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003072PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003073"recv(buffersize[, flags]) -> data\n\
3074\n\
3075Receive up to buffersize bytes from the socket. For the optional flags\n\
3076argument, see the Unix manual. When no data is available, block until\n\
3077at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003078the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003079
Guido van Rossum30a685f1991-06-27 15:51:29 +00003080
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003081/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003082
Thomas Wouters477c8d52006-05-27 19:21:47 +00003083static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003084sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003085{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003086 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003087
Antoine Pitrou19467d22010-08-17 19:33:30 +00003088 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 Py_buffer pbuf;
3090 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003091 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003094 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 &pbuf, &recvlen, &flags))
3096 return NULL;
3097 buf = pbuf.buf;
3098 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 if (recvlen < 0) {
3101 PyBuffer_Release(&pbuf);
3102 PyErr_SetString(PyExc_ValueError,
3103 "negative buffersize in recv_into");
3104 return NULL;
3105 }
3106 if (recvlen == 0) {
3107 /* If nbytes was not specified, use the buffer's length */
3108 recvlen = buflen;
3109 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 /* Check if the buffer is large enough */
3112 if (buflen < recvlen) {
3113 PyBuffer_Release(&pbuf);
3114 PyErr_SetString(PyExc_ValueError,
3115 "buffer too small for requested bytes");
3116 return NULL;
3117 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 /* Call the guts */
3120 readlen = sock_recv_guts(s, buf, recvlen, flags);
3121 if (readlen < 0) {
3122 /* Return an error. */
3123 PyBuffer_Release(&pbuf);
3124 return NULL;
3125 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003127 PyBuffer_Release(&pbuf);
3128 /* Return the number of bytes read. Note that we do not do anything
3129 special here in the case that readlen < recvlen. */
3130 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003131}
3132
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003133PyDoc_STRVAR(recv_into_doc,
3134"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003135\n\
3136A version of recv() that stores its data into a buffer rather than creating \n\
3137a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3138is not specified (or 0), receive up to the size available in the given buffer.\n\
3139\n\
3140See recv() for documentation about the flags.");
3141
Victor Stinner31bf2d52015-04-01 21:57:09 +02003142struct sock_recvfrom {
3143 char* cbuf;
3144 Py_ssize_t len;
3145 int flags;
3146 socklen_t *addrlen;
3147 sock_addr_t *addrbuf;
3148 Py_ssize_t result;
3149};
3150
3151static int
3152sock_recvfrom_impl(PySocketSockObject *s, void *data)
3153{
3154 struct sock_recvfrom *ctx = data;
3155
3156 memset(ctx->addrbuf, 0, *ctx->addrlen);
3157
3158#ifdef MS_WINDOWS
3159 if (ctx->len > INT_MAX)
3160 ctx->len = INT_MAX;
3161 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3162 SAS2SA(ctx->addrbuf), ctx->addrlen);
3163#else
3164 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3165 SAS2SA(ctx->addrbuf), ctx->addrlen);
3166#endif
3167 return (ctx->result >= 0);
3168}
3169
Thomas Wouters477c8d52006-05-27 19:21:47 +00003170
3171/*
Christian Heimes99170a52007-12-19 02:07:34 +00003172 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3173 * into a char buffer. If you have any inc/def ref to do to the objects that
3174 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003175 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003176 * that it is also possible that we return a number of bytes smaller than the
3177 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003178 *
3179 * 'addr' is a return value for the address object. Note that you must decref
3180 * it yourself.
3181 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003182static Py_ssize_t
3183sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003184 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003185{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003187 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003188 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003190 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 if (!getsockaddrlen(s, &addrlen))
3193 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 if (!IS_SELECTABLE(s)) {
3196 select_error();
3197 return -1;
3198 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003199
Victor Stinner31bf2d52015-04-01 21:57:09 +02003200 ctx.cbuf = cbuf;
3201 ctx.len = len;
3202 ctx.flags = flags;
3203 ctx.addrbuf = &addrbuf;
3204 ctx.addrlen = &addrlen;
3205 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003206 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003207
Victor Stinner31bf2d52015-04-01 21:57:09 +02003208 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3209 s->sock_proto);
3210 if (*addr == NULL)
3211 return -1;
3212
3213 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003214}
3215
3216/* s.recvfrom(nbytes [,flags]) method */
3217
3218static PyObject *
3219sock_recvfrom(PySocketSockObject *s, PyObject *args)
3220{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 PyObject *buf = NULL;
3222 PyObject *addr = NULL;
3223 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003224 int flags = 0;
3225 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003226
Antoine Pitrou19467d22010-08-17 19:33:30 +00003227 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003228 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003230 if (recvlen < 0) {
3231 PyErr_SetString(PyExc_ValueError,
3232 "negative buffersize in recvfrom");
3233 return NULL;
3234 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003236 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3237 if (buf == NULL)
3238 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3241 recvlen, flags, &addr);
3242 if (outlen < 0) {
3243 goto finally;
3244 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 if (outlen != recvlen) {
3247 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003248 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003250 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 goto finally;
3252 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003255
3256finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003257 Py_XDECREF(buf);
3258 Py_XDECREF(addr);
3259 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003260}
3261
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003262PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003263"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3264\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003265Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003266
Thomas Wouters477c8d52006-05-27 19:21:47 +00003267
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003268/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003269
3270static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003271sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003272{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003273 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003274
Antoine Pitrou19467d22010-08-17 19:33:30 +00003275 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003276 Py_buffer pbuf;
3277 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003278 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003280 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003281
Antoine Pitrou19467d22010-08-17 19:33:30 +00003282 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003283 kwlist, &pbuf,
3284 &recvlen, &flags))
3285 return NULL;
3286 buf = pbuf.buf;
3287 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003289 if (recvlen < 0) {
3290 PyBuffer_Release(&pbuf);
3291 PyErr_SetString(PyExc_ValueError,
3292 "negative buffersize in recvfrom_into");
3293 return NULL;
3294 }
3295 if (recvlen == 0) {
3296 /* If nbytes was not specified, use the buffer's length */
3297 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003298 } else if (recvlen > buflen) {
3299 PyBuffer_Release(&pbuf);
3300 PyErr_SetString(PyExc_ValueError,
3301 "nbytes is greater than the length of the buffer");
3302 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3306 if (readlen < 0) {
3307 PyBuffer_Release(&pbuf);
3308 /* Return an error */
3309 Py_XDECREF(addr);
3310 return NULL;
3311 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 PyBuffer_Release(&pbuf);
3314 /* Return the number of bytes read and the address. Note that we do
3315 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003316 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003317}
3318
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003319PyDoc_STRVAR(recvfrom_into_doc,
3320"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003321\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003322Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003323
Victor Stinner35bee932015-04-02 12:28:07 +02003324/* The sendmsg() and recvmsg[_into]() methods require a working
3325 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3326#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003327struct sock_recvmsg {
3328 struct msghdr *msg;
3329 int flags;
3330 ssize_t result;
3331};
3332
3333static int
3334sock_recvmsg_impl(PySocketSockObject *s, void *data)
3335{
3336 struct sock_recvmsg *ctx = data;
3337
3338 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3339 return (ctx->result >= 0);
3340}
3341
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003342/*
3343 * Call recvmsg() with the supplied iovec structures, flags, and
3344 * ancillary data buffer size (controllen). Returns the tuple return
3345 * value for recvmsg() or recvmsg_into(), with the first item provided
3346 * by the supplied makeval() function. makeval() will be called with
3347 * the length read and makeval_data as arguments, and must return a
3348 * new reference (which will be decrefed if there is a subsequent
3349 * error). On error, closes any file descriptors received via
3350 * SCM_RIGHTS.
3351 */
3352static PyObject *
3353sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3354 int flags, Py_ssize_t controllen,
3355 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3356{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003357 sock_addr_t addrbuf;
3358 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003359 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003360 PyObject *cmsg_list = NULL, *retval = NULL;
3361 void *controlbuf = NULL;
3362 struct cmsghdr *cmsgh;
3363 size_t cmsgdatalen = 0;
3364 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003365 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003366
3367 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3368 ignored" when the socket is connected (Linux fills them in
3369 anyway for AF_UNIX sockets at least). Normally msg_namelen
3370 seems to be set to 0 if there's no address, but try to
3371 initialize msg_name to something that won't be mistaken for a
3372 real address if that doesn't happen. */
3373 if (!getsockaddrlen(s, &addrbuflen))
3374 return NULL;
3375 memset(&addrbuf, 0, addrbuflen);
3376 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3377
3378 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3379 PyErr_SetString(PyExc_ValueError,
3380 "invalid ancillary data buffer length");
3381 return NULL;
3382 }
3383 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3384 return PyErr_NoMemory();
3385
3386 /* Make the system call. */
3387 if (!IS_SELECTABLE(s)) {
3388 select_error();
3389 goto finally;
3390 }
3391
Victor Stinner31bf2d52015-04-01 21:57:09 +02003392 msg.msg_name = SAS2SA(&addrbuf);
3393 msg.msg_namelen = addrbuflen;
3394 msg.msg_iov = iov;
3395 msg.msg_iovlen = iovlen;
3396 msg.msg_control = controlbuf;
3397 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003398
Victor Stinner31bf2d52015-04-01 21:57:09 +02003399 ctx.msg = &msg;
3400 ctx.flags = flags;
3401 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003402 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003403
3404 /* Make list of (level, type, data) tuples from control messages. */
3405 if ((cmsg_list = PyList_New(0)) == NULL)
3406 goto err_closefds;
3407 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3408 implementations didn't do so. */
3409 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3410 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3411 PyObject *bytes, *tuple;
3412 int tmp;
3413
3414 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3415 if (cmsg_status != 0) {
3416 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3417 "received malformed or improperly-truncated "
3418 "ancillary data", 1) == -1)
3419 goto err_closefds;
3420 }
3421 if (cmsg_status < 0)
3422 break;
3423 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003424 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003425 goto err_closefds;
3426 }
3427
3428 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3429 cmsgdatalen);
3430 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3431 (int)cmsgh->cmsg_type, bytes);
3432 if (tuple == NULL)
3433 goto err_closefds;
3434 tmp = PyList_Append(cmsg_list, tuple);
3435 Py_DECREF(tuple);
3436 if (tmp != 0)
3437 goto err_closefds;
3438
3439 if (cmsg_status != 0)
3440 break;
3441 }
3442
3443 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003444 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003445 cmsg_list,
3446 (int)msg.msg_flags,
3447 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3448 ((msg.msg_namelen > addrbuflen) ?
3449 addrbuflen : msg.msg_namelen),
3450 s->sock_proto));
3451 if (retval == NULL)
3452 goto err_closefds;
3453
3454finally:
3455 Py_XDECREF(cmsg_list);
3456 PyMem_Free(controlbuf);
3457 return retval;
3458
3459err_closefds:
3460#ifdef SCM_RIGHTS
3461 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3462 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3463 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3464 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3465 if (cmsg_status < 0)
3466 break;
3467 if (cmsgh->cmsg_level == SOL_SOCKET &&
3468 cmsgh->cmsg_type == SCM_RIGHTS) {
3469 size_t numfds;
3470 int *fdp;
3471
3472 numfds = cmsgdatalen / sizeof(int);
3473 fdp = (int *)CMSG_DATA(cmsgh);
3474 while (numfds-- > 0)
3475 close(*fdp++);
3476 }
3477 if (cmsg_status != 0)
3478 break;
3479 }
3480#endif /* SCM_RIGHTS */
3481 goto finally;
3482}
3483
3484
3485static PyObject *
3486makeval_recvmsg(ssize_t received, void *data)
3487{
3488 PyObject **buf = data;
3489
3490 if (received < PyBytes_GET_SIZE(*buf))
3491 _PyBytes_Resize(buf, received);
3492 Py_XINCREF(*buf);
3493 return *buf;
3494}
3495
3496/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3497
3498static PyObject *
3499sock_recvmsg(PySocketSockObject *s, PyObject *args)
3500{
3501 Py_ssize_t bufsize, ancbufsize = 0;
3502 int flags = 0;
3503 struct iovec iov;
3504 PyObject *buf = NULL, *retval = NULL;
3505
3506 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3507 return NULL;
3508
3509 if (bufsize < 0) {
3510 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3511 return NULL;
3512 }
3513 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3514 return NULL;
3515 iov.iov_base = PyBytes_AS_STRING(buf);
3516 iov.iov_len = bufsize;
3517
3518 /* Note that we're passing a pointer to *our pointer* to the bytes
3519 object here (&buf); makeval_recvmsg() may incref the object, or
3520 deallocate it and set our pointer to NULL. */
3521 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3522 &makeval_recvmsg, &buf);
3523 Py_XDECREF(buf);
3524 return retval;
3525}
3526
3527PyDoc_STRVAR(recvmsg_doc,
3528"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3529\n\
3530Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3531socket. The ancbufsize argument sets the size in bytes of the\n\
3532internal buffer used to receive the ancillary data; it defaults to 0,\n\
3533meaning that no ancillary data will be received. Appropriate buffer\n\
3534sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3535CMSG_LEN(), and items which do not fit into the buffer might be\n\
3536truncated or discarded. The flags argument defaults to 0 and has the\n\
3537same meaning as for recv().\n\
3538\n\
3539The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3540The data item is a bytes object holding the non-ancillary data\n\
3541received. The ancdata item is a list of zero or more tuples\n\
3542(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3543(control messages) received: cmsg_level and cmsg_type are integers\n\
3544specifying the protocol level and protocol-specific type respectively,\n\
3545and cmsg_data is a bytes object holding the associated data. The\n\
3546msg_flags item is the bitwise OR of various flags indicating\n\
3547conditions on the received message; see your system documentation for\n\
3548details. If the receiving socket is unconnected, address is the\n\
3549address of the sending socket, if available; otherwise, its value is\n\
3550unspecified.\n\
3551\n\
3552If recvmsg() raises an exception after the system call returns, it\n\
3553will first attempt to close any file descriptors received via the\n\
3554SCM_RIGHTS mechanism.");
3555
3556
3557static PyObject *
3558makeval_recvmsg_into(ssize_t received, void *data)
3559{
3560 return PyLong_FromSsize_t(received);
3561}
3562
3563/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3564
3565static PyObject *
3566sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3567{
3568 Py_ssize_t ancbufsize = 0;
3569 int flags = 0;
3570 struct iovec *iovs = NULL;
3571 Py_ssize_t i, nitems, nbufs = 0;
3572 Py_buffer *bufs = NULL;
3573 PyObject *buffers_arg, *fast, *retval = NULL;
3574
3575 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3576 &buffers_arg, &ancbufsize, &flags))
3577 return NULL;
3578
3579 if ((fast = PySequence_Fast(buffers_arg,
3580 "recvmsg_into() argument 1 must be an "
3581 "iterable")) == NULL)
3582 return NULL;
3583 nitems = PySequence_Fast_GET_SIZE(fast);
3584 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003585 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003586 goto finally;
3587 }
3588
3589 /* Fill in an iovec for each item, and save the Py_buffer
3590 structs to release afterwards. */
3591 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3592 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3593 PyErr_NoMemory();
3594 goto finally;
3595 }
3596 for (; nbufs < nitems; nbufs++) {
3597 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3598 "w*;recvmsg_into() argument 1 must be an iterable "
3599 "of single-segment read-write buffers",
3600 &bufs[nbufs]))
3601 goto finally;
3602 iovs[nbufs].iov_base = bufs[nbufs].buf;
3603 iovs[nbufs].iov_len = bufs[nbufs].len;
3604 }
3605
3606 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3607 &makeval_recvmsg_into, NULL);
3608finally:
3609 for (i = 0; i < nbufs; i++)
3610 PyBuffer_Release(&bufs[i]);
3611 PyMem_Free(bufs);
3612 PyMem_Free(iovs);
3613 Py_DECREF(fast);
3614 return retval;
3615}
3616
3617PyDoc_STRVAR(recvmsg_into_doc,
3618"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3619\n\
3620Receive normal data and ancillary data from the socket, scattering the\n\
3621non-ancillary data into a series of buffers. The buffers argument\n\
3622must be an iterable of objects that export writable buffers\n\
3623(e.g. bytearray objects); these will be filled with successive chunks\n\
3624of the non-ancillary data until it has all been written or there are\n\
3625no more buffers. The ancbufsize argument sets the size in bytes of\n\
3626the internal buffer used to receive the ancillary data; it defaults to\n\
36270, meaning that no ancillary data will be received. Appropriate\n\
3628buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3629or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3630truncated or discarded. The flags argument defaults to 0 and has the\n\
3631same meaning as for recv().\n\
3632\n\
3633The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3634The nbytes item is the total number of bytes of non-ancillary data\n\
3635written into the buffers. The ancdata item is a list of zero or more\n\
3636tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3637data (control messages) received: cmsg_level and cmsg_type are\n\
3638integers specifying the protocol level and protocol-specific type\n\
3639respectively, and cmsg_data is a bytes object holding the associated\n\
3640data. The msg_flags item is the bitwise OR of various flags\n\
3641indicating conditions on the received message; see your system\n\
3642documentation for details. If the receiving socket is unconnected,\n\
3643address is the address of the sending socket, if available; otherwise,\n\
3644its value is unspecified.\n\
3645\n\
3646If recvmsg_into() raises an exception after the system call returns,\n\
3647it will first attempt to close any file descriptors received via the\n\
3648SCM_RIGHTS mechanism.");
3649#endif /* CMSG_LEN */
3650
3651
Victor Stinner31bf2d52015-04-01 21:57:09 +02003652struct sock_send {
3653 char *buf;
3654 Py_ssize_t len;
3655 int flags;
3656 Py_ssize_t result;
3657};
3658
3659static int
3660sock_send_impl(PySocketSockObject *s, void *data)
3661{
3662 struct sock_send *ctx = data;
3663
3664#ifdef MS_WINDOWS
3665 if (ctx->len > INT_MAX)
3666 ctx->len = INT_MAX;
3667 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3668#else
3669 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3670#endif
3671 return (ctx->result >= 0);
3672}
3673
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003674/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003675
Guido van Rossum73624e91994-10-10 17:59:00 +00003676static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003677sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003678{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003679 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003680 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003681 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003683 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3684 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003686 if (!IS_SELECTABLE(s)) {
3687 PyBuffer_Release(&pbuf);
3688 return select_error();
3689 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003690 ctx.buf = pbuf.buf;
3691 ctx.len = pbuf.len;
3692 ctx.flags = flags;
3693 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003694 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 return NULL;
3696 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003697 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003698
3699 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003700}
3701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003702PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003703"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003704\n\
3705Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003706argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003707sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003708
3709
3710/* s.sendall(data [,flags]) method */
3711
3712static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003713sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003715 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003716 Py_ssize_t len, n;
3717 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003718 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003719 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003720 int has_timeout = (s->sock_timeout > 0);
3721 _PyTime_t interval = s->sock_timeout;
3722 _PyTime_t deadline = 0;
3723 int deadline_initialized = 0;
3724 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3727 return NULL;
3728 buf = pbuf.buf;
3729 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 if (!IS_SELECTABLE(s)) {
3732 PyBuffer_Release(&pbuf);
3733 return select_error();
3734 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003737 if (has_timeout) {
3738 if (deadline_initialized) {
3739 /* recompute the timeout */
3740 interval = deadline - _PyTime_GetMonotonicClock();
3741 }
3742 else {
3743 deadline_initialized = 1;
3744 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3745 }
3746
3747 if (interval <= 0) {
3748 PyErr_SetString(socket_timeout, "timed out");
3749 goto done;
3750 }
3751 }
3752
Victor Stinner02f32ab2015-04-01 22:53:26 +02003753 ctx.buf = buf;
3754 ctx.len = len;
3755 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003756 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3757 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003758 n = ctx.result;
3759 assert(n >= 0);
3760
3761 buf += n;
3762 len -= n;
3763
3764 /* We must run our signal handlers before looping again.
3765 send() can return a successful partial write when it is
3766 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003767 if (PyErr_CheckSignals())
3768 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003769 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003771
Victor Stinner8912d142015-04-06 23:16:34 +02003772 Py_INCREF(Py_None);
3773 res = Py_None;
3774
3775done:
3776 PyBuffer_Release(&pbuf);
3777 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003778}
3779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003780PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003781"sendall(data[, flags])\n\
3782\n\
3783Send a data string to the socket. For the optional flags\n\
3784argument, see the Unix manual. This calls send() repeatedly\n\
3785until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003786to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003787
Guido van Rossum30a685f1991-06-27 15:51:29 +00003788
Victor Stinner31bf2d52015-04-01 21:57:09 +02003789struct sock_sendto {
3790 char *buf;
3791 Py_ssize_t len;
3792 int flags;
3793 int addrlen;
3794 sock_addr_t *addrbuf;
3795 Py_ssize_t result;
3796};
3797
3798static int
3799sock_sendto_impl(PySocketSockObject *s, void *data)
3800{
3801 struct sock_sendto *ctx = data;
3802
3803#ifdef MS_WINDOWS
3804 if (ctx->len > INT_MAX)
3805 ctx->len = INT_MAX;
3806 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3807 SAS2SA(ctx->addrbuf), ctx->addrlen);
3808#else
3809 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3810 SAS2SA(ctx->addrbuf), ctx->addrlen);
3811#endif
3812 return (ctx->result >= 0);
3813}
3814
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003815/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003816
Guido van Rossum73624e91994-10-10 17:59:00 +00003817static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003818sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003820 Py_buffer pbuf;
3821 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003822 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003823 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003824 int addrlen, flags;
3825 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003827 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003828 arglen = PyTuple_Size(args);
3829 switch (arglen) {
3830 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003831 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3832 return NULL;
3833 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003834 break;
3835 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003836 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3837 &pbuf, &flags, &addro)) {
3838 return NULL;
3839 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003840 break;
3841 default:
3842 PyErr_Format(PyExc_TypeError,
3843 "sendto() takes 2 or 3 arguments (%d given)",
3844 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003845 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003848 if (!IS_SELECTABLE(s)) {
3849 PyBuffer_Release(&pbuf);
3850 return select_error();
3851 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3854 PyBuffer_Release(&pbuf);
3855 return NULL;
3856 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003857
Victor Stinner31bf2d52015-04-01 21:57:09 +02003858 ctx.buf = pbuf.buf;
3859 ctx.len = pbuf.len;
3860 ctx.flags = flags;
3861 ctx.addrlen = addrlen;
3862 ctx.addrbuf = &addrbuf;
3863 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003864 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 return NULL;
3866 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003867 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003868
3869 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003870}
3871
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003872PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003873"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003874\n\
3875Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003876For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003877
Guido van Rossum30a685f1991-06-27 15:51:29 +00003878
Victor Stinner35bee932015-04-02 12:28:07 +02003879/* The sendmsg() and recvmsg[_into]() methods require a working
3880 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3881#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003882struct sock_sendmsg {
3883 struct msghdr *msg;
3884 int flags;
3885 ssize_t result;
3886};
3887
3888static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003889sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3890 struct msghdr *msg,
3891 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3892 Py_ssize_t ndataparts, ndatabufs = 0;
3893 int result = -1;
3894 struct iovec *iovs = NULL;
3895 PyObject *data_fast = NULL;
3896 Py_buffer *databufs = NULL;
3897
3898 /* Fill in an iovec for each message part, and save the Py_buffer
3899 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003900 data_fast = PySequence_Fast(data_arg,
3901 "sendmsg() argument 1 must be an "
3902 "iterable");
3903 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003904 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003905 }
3906
Christian Heimesdffa3942016-09-05 23:54:41 +02003907 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3908 if (ndataparts > INT_MAX) {
3909 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3910 goto finally;
3911 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003912
Christian Heimesdffa3942016-09-05 23:54:41 +02003913 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003914 if (ndataparts > 0) {
3915 iovs = PyMem_New(struct iovec, ndataparts);
3916 if (iovs == NULL) {
3917 PyErr_NoMemory();
3918 goto finally;
3919 }
3920 msg->msg_iov = iovs;
3921
3922 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003923 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003924 PyErr_NoMemory();
3925 goto finally;
3926 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003927 }
3928 for (; ndatabufs < ndataparts; ndatabufs++) {
3929 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3930 "y*;sendmsg() argument 1 must be an iterable of "
3931 "bytes-like objects",
3932 &databufs[ndatabufs]))
3933 goto finally;
3934 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3935 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3936 }
3937 result = 0;
3938 finally:
3939 *databufsout = databufs;
3940 *ndatabufsout = ndatabufs;
3941 Py_XDECREF(data_fast);
3942 return result;
3943}
3944
3945static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003946sock_sendmsg_impl(PySocketSockObject *s, void *data)
3947{
3948 struct sock_sendmsg *ctx = data;
3949
3950 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3951 return (ctx->result >= 0);
3952}
3953
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003954/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3955
3956static PyObject *
3957sock_sendmsg(PySocketSockObject *s, PyObject *args)
3958{
Christian Heimesdffa3942016-09-05 23:54:41 +02003959 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003960 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003961 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003962 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003963 struct cmsginfo {
3964 int level;
3965 int type;
3966 Py_buffer data;
3967 } *cmsgs = NULL;
3968 void *controlbuf = NULL;
3969 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003970 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003971 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003973 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974
3975 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02003976 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003978 }
3979
3980 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003981
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003982 /* Parse destination address. */
3983 if (addr_arg != NULL && addr_arg != Py_None) {
3984 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3985 goto finally;
3986 msg.msg_name = &addrbuf;
3987 msg.msg_namelen = addrlen;
3988 }
3989
3990 /* Fill in an iovec for each message part, and save the Py_buffer
3991 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02003992 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003993 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003994 }
3995
3996 if (cmsg_arg == NULL)
3997 ncmsgs = 0;
3998 else {
3999 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4000 "sendmsg() argument 2 must be an "
4001 "iterable")) == NULL)
4002 goto finally;
4003 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4004 }
4005
4006#ifndef CMSG_SPACE
4007 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004008 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004009 "sending multiple control messages is not supported "
4010 "on this system");
4011 goto finally;
4012 }
4013#endif
4014 /* Save level, type and Py_buffer for each control message,
4015 and calculate total size. */
4016 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4017 PyErr_NoMemory();
4018 goto finally;
4019 }
4020 controllen = controllen_last = 0;
4021 while (ncmsgbufs < ncmsgs) {
4022 size_t bufsize, space;
4023
4024 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4025 "(iiy*):[sendmsg() ancillary data items]",
4026 &cmsgs[ncmsgbufs].level,
4027 &cmsgs[ncmsgbufs].type,
4028 &cmsgs[ncmsgbufs].data))
4029 goto finally;
4030 bufsize = cmsgs[ncmsgbufs++].data.len;
4031
4032#ifdef CMSG_SPACE
4033 if (!get_CMSG_SPACE(bufsize, &space)) {
4034#else
4035 if (!get_CMSG_LEN(bufsize, &space)) {
4036#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004037 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004038 goto finally;
4039 }
4040 controllen += space;
4041 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004042 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004043 goto finally;
4044 }
4045 controllen_last = controllen;
4046 }
4047
4048 /* Construct ancillary data block from control message info. */
4049 if (ncmsgbufs > 0) {
4050 struct cmsghdr *cmsgh = NULL;
4051
Victor Stinner52d61e42016-09-12 11:41:58 +02004052 controlbuf = PyMem_Malloc(controllen);
4053 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004054 PyErr_NoMemory();
4055 goto finally;
4056 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004057 msg.msg_control = controlbuf;
4058
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004059 msg.msg_controllen = controllen;
4060
4061 /* Need to zero out the buffer as a workaround for glibc's
4062 CMSG_NXTHDR() implementation. After getting the pointer to
4063 the next header, it checks its (uninitialized) cmsg_len
4064 member to see if the "message" fits in the buffer, and
4065 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004066 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004067 memset(controlbuf, 0, controllen);
4068
4069 for (i = 0; i < ncmsgbufs; i++) {
4070 size_t msg_len, data_len = cmsgs[i].data.len;
4071 int enough_space = 0;
4072
4073 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4074 if (cmsgh == NULL) {
4075 PyErr_Format(PyExc_RuntimeError,
4076 "unexpected NULL result from %s()",
4077 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4078 goto finally;
4079 }
4080 if (!get_CMSG_LEN(data_len, &msg_len)) {
4081 PyErr_SetString(PyExc_RuntimeError,
4082 "item size out of range for CMSG_LEN()");
4083 goto finally;
4084 }
4085 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4086 size_t space;
4087
4088 cmsgh->cmsg_len = msg_len;
4089 if (get_cmsg_data_space(&msg, cmsgh, &space))
4090 enough_space = (space >= data_len);
4091 }
4092 if (!enough_space) {
4093 PyErr_SetString(PyExc_RuntimeError,
4094 "ancillary data does not fit in calculated "
4095 "space");
4096 goto finally;
4097 }
4098 cmsgh->cmsg_level = cmsgs[i].level;
4099 cmsgh->cmsg_type = cmsgs[i].type;
4100 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4101 }
4102 }
4103
4104 /* Make the system call. */
4105 if (!IS_SELECTABLE(s)) {
4106 select_error();
4107 goto finally;
4108 }
4109
Victor Stinner31bf2d52015-04-01 21:57:09 +02004110 ctx.msg = &msg;
4111 ctx.flags = flags;
4112 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004113 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004114
4115 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116
4117finally:
4118 PyMem_Free(controlbuf);
4119 for (i = 0; i < ncmsgbufs; i++)
4120 PyBuffer_Release(&cmsgs[i].data);
4121 PyMem_Free(cmsgs);
4122 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004123 PyMem_Free(msg.msg_iov);
4124 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004125 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004126 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004127 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004128 return retval;
4129}
4130
4131PyDoc_STRVAR(sendmsg_doc,
4132"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4133\n\
4134Send normal and ancillary data to the socket, gathering the\n\
4135non-ancillary data from a series of buffers and concatenating it into\n\
4136a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004137data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004138The ancdata argument specifies the ancillary data (control messages)\n\
4139as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4140cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4141protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004142is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004143argument defaults to 0 and has the same meaning as for send(). If\n\
4144address is supplied and not None, it sets a destination address for\n\
4145the message. The return value is the number of bytes of non-ancillary\n\
4146data sent.");
4147#endif /* CMSG_LEN */
4148
Christian Heimesdffa3942016-09-05 23:54:41 +02004149#ifdef HAVE_SOCKADDR_ALG
4150static PyObject*
4151sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4152{
4153 PyObject *retval = NULL;
4154
4155 Py_ssize_t i, ndatabufs = 0;
4156 Py_buffer *databufs = NULL;
4157 PyObject *data_arg = NULL;
4158
4159 Py_buffer iv = {NULL, NULL};
4160
4161 PyObject *opobj = NULL;
4162 int op = -1;
4163
4164 PyObject *assoclenobj = NULL;
4165 int assoclen = -1;
4166
4167 unsigned int *uiptr;
4168 int flags = 0;
4169
4170 struct msghdr msg;
4171 struct cmsghdr *header = NULL;
4172 struct af_alg_iv *alg_iv = NULL;
4173 struct sock_sendmsg ctx;
4174 Py_ssize_t controllen;
4175 void *controlbuf = NULL;
4176 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4177
4178 if (self->sock_family != AF_ALG) {
4179 PyErr_SetString(PyExc_OSError,
4180 "algset is only supported for AF_ALG");
4181 return NULL;
4182 }
4183
4184 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4185 "|O$O!y*O!i:sendmsg_afalg", keywords,
4186 &data_arg,
4187 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004188 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004189 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004190 }
4191
4192 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004193
4194 /* op is a required, keyword-only argument >= 0 */
4195 if (opobj != NULL) {
4196 op = _PyLong_AsInt(opobj);
4197 }
4198 if (op < 0) {
4199 /* override exception from _PyLong_AsInt() */
4200 PyErr_SetString(PyExc_TypeError,
4201 "Invalid or missing argument 'op'");
4202 goto finally;
4203 }
4204 /* assoclen is optional but must be >= 0 */
4205 if (assoclenobj != NULL) {
4206 assoclen = _PyLong_AsInt(assoclenobj);
4207 if (assoclen == -1 && PyErr_Occurred()) {
4208 goto finally;
4209 }
4210 if (assoclen < 0) {
4211 PyErr_SetString(PyExc_TypeError,
4212 "assoclen must be positive");
4213 goto finally;
4214 }
4215 }
4216
4217 controllen = CMSG_SPACE(4);
4218 if (iv.buf != NULL) {
4219 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4220 }
4221 if (assoclen >= 0) {
4222 controllen += CMSG_SPACE(4);
4223 }
4224
4225 controlbuf = PyMem_Malloc(controllen);
4226 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004227 PyErr_NoMemory();
4228 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004229 }
4230 memset(controlbuf, 0, controllen);
4231
Christian Heimesdffa3942016-09-05 23:54:41 +02004232 msg.msg_controllen = controllen;
4233 msg.msg_control = controlbuf;
4234
4235 /* Fill in an iovec for each message part, and save the Py_buffer
4236 structs to release afterwards. */
4237 if (data_arg != NULL) {
4238 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4239 goto finally;
4240 }
4241 }
4242
4243 /* set operation to encrypt or decrypt */
4244 header = CMSG_FIRSTHDR(&msg);
4245 if (header == NULL) {
4246 PyErr_SetString(PyExc_RuntimeError,
4247 "unexpected NULL result from CMSG_FIRSTHDR");
4248 goto finally;
4249 }
4250 header->cmsg_level = SOL_ALG;
4251 header->cmsg_type = ALG_SET_OP;
4252 header->cmsg_len = CMSG_LEN(4);
4253 uiptr = (void*)CMSG_DATA(header);
4254 *uiptr = (unsigned int)op;
4255
4256 /* set initialization vector */
4257 if (iv.buf != NULL) {
4258 header = CMSG_NXTHDR(&msg, header);
4259 if (header == NULL) {
4260 PyErr_SetString(PyExc_RuntimeError,
4261 "unexpected NULL result from CMSG_NXTHDR(iv)");
4262 goto finally;
4263 }
4264 header->cmsg_level = SOL_ALG;
4265 header->cmsg_type = ALG_SET_IV;
4266 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4267 alg_iv = (void*)CMSG_DATA(header);
4268 alg_iv->ivlen = iv.len;
4269 memcpy(alg_iv->iv, iv.buf, iv.len);
4270 }
4271
4272 /* set length of associated data for AEAD */
4273 if (assoclen >= 0) {
4274 header = CMSG_NXTHDR(&msg, header);
4275 if (header == NULL) {
4276 PyErr_SetString(PyExc_RuntimeError,
4277 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4278 goto finally;
4279 }
4280 header->cmsg_level = SOL_ALG;
4281 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4282 header->cmsg_len = CMSG_LEN(4);
4283 uiptr = (void*)CMSG_DATA(header);
4284 *uiptr = (unsigned int)assoclen;
4285 }
4286
4287 ctx.msg = &msg;
4288 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004289 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004290 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004291 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004292
4293 retval = PyLong_FromSsize_t(ctx.result);
4294
4295 finally:
4296 PyMem_Free(controlbuf);
4297 if (iv.buf != NULL) {
4298 PyBuffer_Release(&iv);
4299 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004300 PyMem_Free(msg.msg_iov);
4301 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004302 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004303 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004304 PyMem_Free(databufs);
4305 return retval;
4306}
4307
4308PyDoc_STRVAR(sendmsg_afalg_doc,
4309"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4310\n\
4311Set operation mode, IV and length of associated data for an AF_ALG\n\
4312operation socket.");
4313#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004314
Guido van Rossum30a685f1991-06-27 15:51:29 +00004315/* s.shutdown(how) method */
4316
Guido van Rossum73624e91994-10-10 17:59:00 +00004317static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004318sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 int how;
4321 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004322
Serhiy Storchaka78980432013-01-15 01:12:17 +02004323 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 if (how == -1 && PyErr_Occurred())
4325 return NULL;
4326 Py_BEGIN_ALLOW_THREADS
4327 res = shutdown(s->sock_fd, how);
4328 Py_END_ALLOW_THREADS
4329 if (res < 0)
4330 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004331 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004332}
4333
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004334PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004335"shutdown(flag)\n\
4336\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004337Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4338of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004339
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004340#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004341static PyObject*
4342sock_ioctl(PySocketSockObject *s, PyObject *arg)
4343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 unsigned long cmd = SIO_RCVALL;
4345 PyObject *argO;
4346 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4349 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 switch (cmd) {
4352 case SIO_RCVALL: {
4353 unsigned int option = RCVALL_ON;
4354 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4355 return NULL;
4356 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4357 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4358 return set_error();
4359 }
4360 return PyLong_FromUnsignedLong(recv); }
4361 case SIO_KEEPALIVE_VALS: {
4362 struct tcp_keepalive ka;
4363 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4364 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4365 return NULL;
4366 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4367 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4368 return set_error();
4369 }
4370 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004371#if defined(SIO_LOOPBACK_FAST_PATH)
4372 case SIO_LOOPBACK_FAST_PATH: {
4373 unsigned int option;
4374 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4375 return NULL;
4376 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4377 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4378 return set_error();
4379 }
4380 return PyLong_FromUnsignedLong(recv); }
4381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 default:
4383 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4384 return NULL;
4385 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004386}
4387PyDoc_STRVAR(sock_ioctl_doc,
4388"ioctl(cmd, option) -> long\n\
4389\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004390Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4391SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004392SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4393SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004394#endif
4395
4396#if defined(MS_WINDOWS)
4397static PyObject*
4398sock_share(PySocketSockObject *s, PyObject *arg)
4399{
4400 WSAPROTOCOL_INFO info;
4401 DWORD processId;
4402 int result;
4403
4404 if (!PyArg_ParseTuple(arg, "I", &processId))
4405 return NULL;
4406
4407 Py_BEGIN_ALLOW_THREADS
4408 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4409 Py_END_ALLOW_THREADS
4410 if (result == SOCKET_ERROR)
4411 return set_error();
4412 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4413}
4414PyDoc_STRVAR(sock_share_doc,
4415"share(process_id) -> bytes\n\
4416\n\
4417Share the socket with another process. The target process id\n\
4418must be provided and the resulting bytes object passed to the target\n\
4419process. There the shared socket can be instantiated by calling\n\
4420socket.fromshare().");
4421
Christian Heimesfaf2f632008-01-06 16:59:19 +00004422
4423#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004424
4425/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004426
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004427static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4429 accept_doc},
4430 {"bind", (PyCFunction)sock_bind, METH_O,
4431 bind_doc},
4432 {"close", (PyCFunction)sock_close, METH_NOARGS,
4433 close_doc},
4434 {"connect", (PyCFunction)sock_connect, METH_O,
4435 connect_doc},
4436 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4437 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004438 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4439 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004440 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4441 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004442#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 {"getpeername", (PyCFunction)sock_getpeername,
4444 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 {"getsockname", (PyCFunction)sock_getsockname,
4447 METH_NOARGS, getsockname_doc},
4448 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4449 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004450#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4452 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004453#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004454#if defined(MS_WINDOWS)
4455 {"share", (PyCFunction)sock_share, METH_VARARGS,
4456 sock_share_doc},
4457#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004458 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 listen_doc},
4460 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4461 recv_doc},
4462 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4463 recv_into_doc},
4464 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4465 recvfrom_doc},
4466 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4467 recvfrom_into_doc},
4468 {"send", (PyCFunction)sock_send, METH_VARARGS,
4469 send_doc},
4470 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4471 sendall_doc},
4472 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4473 sendto_doc},
4474 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4475 setblocking_doc},
4476 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4477 settimeout_doc},
4478 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4479 gettimeout_doc},
4480 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4481 setsockopt_doc},
4482 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4483 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004484#ifdef CMSG_LEN
4485 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4486 recvmsg_doc},
4487 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4488 recvmsg_into_doc,},
4489 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4490 sendmsg_doc},
4491#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004492#ifdef HAVE_SOCKADDR_ALG
4493 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4494 sendmsg_afalg_doc},
4495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004497};
4498
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004499/* SockObject members */
4500static PyMemberDef sock_memberlist[] = {
4501 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4502 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4503 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004504 {0},
4505};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004506
Victor Stinner71694d52015-03-28 01:18:54 +01004507static PyGetSetDef sock_getsetlist[] = {
4508 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4509 {NULL} /* sentinel */
4510};
4511
Guido van Rossum73624e91994-10-10 17:59:00 +00004512/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004513 First close the file description. */
4514
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004515static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004516sock_finalize(PySocketSockObject *s)
4517{
4518 SOCKET_T fd;
4519 PyObject *error_type, *error_value, *error_traceback;
4520
4521 /* Save the current exception, if any. */
4522 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4523
Victor Stinnerd3afb622016-07-22 17:47:09 +02004524 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004525 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4526 /* Spurious errors can appear at shutdown */
4527 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4528 PyErr_WriteUnraisable((PyObject *)s);
4529 }
4530 }
4531
4532 /* Only close the socket *after* logging the ResourceWarning warning
4533 to allow the logger to call socket methods like
4534 socket.getsockname(). If the socket is closed before, socket
4535 methods fails with the EBADF error. */
4536 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004537 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004538
4539 /* We do not want to retry upon EINTR: see sock_close() */
4540 Py_BEGIN_ALLOW_THREADS
4541 (void) SOCKETCLOSE(fd);
4542 Py_END_ALLOW_THREADS
4543 }
4544
4545 /* Restore the saved exception. */
4546 PyErr_Restore(error_type, error_value, error_traceback);
4547}
4548
4549static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004550sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004551{
Victor Stinner19a8e842016-03-21 16:36:48 +01004552 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4553 return;
4554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004556}
4557
Guido van Rossum30a685f1991-06-27 15:51:29 +00004558
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004560sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004561{
Victor Stinnere254e532014-07-26 14:36:55 +02004562 long sock_fd;
4563 /* On Windows, this test is needed because SOCKET_T is unsigned */
4564 if (s->sock_fd == INVALID_SOCKET) {
4565 sock_fd = -1;
4566 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004567#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004568 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 /* this can occur on Win64, and actually there is a special
4570 ugly printf formatter for decimal pointer length integer
4571 printing, only bother if necessary*/
4572 PyErr_SetString(PyExc_OverflowError,
4573 "no printf formatter to display "
4574 "the socket descriptor in decimal");
4575 return NULL;
4576 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004577#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004578 else
4579 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 return PyUnicode_FromFormat(
4581 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004582 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 s->sock_type,
4584 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004585}
4586
4587
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004588/* Create a new, uninitialized socket object. */
4589
4590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004591sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 new = type->tp_alloc(type, 0);
4596 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004597 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004598 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 ((PySocketSockObject *)new)->errorhandler = &set_error;
4600 }
4601 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004602}
4603
4604
4605/* Initialize a new socket object. */
4606
Victor Stinnerdaf45552013-08-28 00:53:59 +02004607#ifdef SOCK_CLOEXEC
4608/* socket() and socketpair() fail with EINVAL on Linux kernel older
4609 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4610static int sock_cloexec_works = -1;
4611#endif
4612
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004613/*ARGSUSED*/
4614static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004615sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 PySocketSockObject *s = (PySocketSockObject *)self;
4618 PyObject *fdobj = NULL;
4619 SOCKET_T fd = INVALID_SOCKET;
4620 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4621 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004622#ifndef MS_WINDOWS
4623#ifdef SOCK_CLOEXEC
4624 int *atomic_flag_works = &sock_cloexec_works;
4625#else
4626 int *atomic_flag_works = NULL;
4627#endif
4628#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4631 "|iiiO:socket", keywords,
4632 &family, &type, &proto, &fdobj))
4633 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004636#ifdef MS_WINDOWS
4637 /* recreate a socket that was duplicated */
4638 if (PyBytes_Check(fdobj)) {
4639 WSAPROTOCOL_INFO info;
4640 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4641 PyErr_Format(PyExc_ValueError,
4642 "socket descriptor string has wrong size, "
4643 "should be %zu bytes.", sizeof(info));
4644 return -1;
4645 }
4646 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4647 Py_BEGIN_ALLOW_THREADS
4648 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4649 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4650 Py_END_ALLOW_THREADS
4651 if (fd == INVALID_SOCKET) {
4652 set_error();
4653 return -1;
4654 }
4655 family = info.iAddressFamily;
4656 type = info.iSocketType;
4657 proto = info.iProtocol;
4658 }
4659 else
4660#endif
4661 {
4662 fd = PyLong_AsSocket_t(fdobj);
4663 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4664 return -1;
4665 if (fd == INVALID_SOCKET) {
4666 PyErr_SetString(PyExc_ValueError,
4667 "can't use invalid socket value");
4668 return -1;
4669 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 }
4671 }
4672 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004673#ifdef MS_WINDOWS
4674 /* Windows implementation */
4675#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4676#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4677#endif
4678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004680 if (support_wsa_no_inherit) {
4681 fd = WSASocket(family, type, proto,
4682 NULL, 0,
4683 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4684 if (fd == INVALID_SOCKET) {
4685 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4686 support_wsa_no_inherit = 0;
4687 fd = socket(family, type, proto);
4688 }
4689 }
4690 else {
4691 fd = socket(family, type, proto);
4692 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 if (fd == INVALID_SOCKET) {
4696 set_error();
4697 return -1;
4698 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004699
4700 if (!support_wsa_no_inherit) {
4701 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4702 closesocket(fd);
4703 PyErr_SetFromWindowsErr(0);
4704 return -1;
4705 }
4706 }
4707#else
4708 /* UNIX */
4709 Py_BEGIN_ALLOW_THREADS
4710#ifdef SOCK_CLOEXEC
4711 if (sock_cloexec_works != 0) {
4712 fd = socket(family, type | SOCK_CLOEXEC, proto);
4713 if (sock_cloexec_works == -1) {
4714 if (fd >= 0) {
4715 sock_cloexec_works = 1;
4716 }
4717 else if (errno == EINVAL) {
4718 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4719 sock_cloexec_works = 0;
4720 fd = socket(family, type, proto);
4721 }
4722 }
4723 }
4724 else
4725#endif
4726 {
4727 fd = socket(family, type, proto);
4728 }
4729 Py_END_ALLOW_THREADS
4730
4731 if (fd == INVALID_SOCKET) {
4732 set_error();
4733 return -1;
4734 }
4735
4736 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4737 SOCKETCLOSE(fd);
4738 return -1;
4739 }
4740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004741 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004742 if (init_sockobject(s, fd, family, type, proto) == -1) {
4743 SOCKETCLOSE(fd);
4744 return -1;
4745 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004748
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004749}
4750
4751
Guido van Rossumb6775db1994-08-01 11:34:53 +00004752/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004753
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004754static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4756 "_socket.socket", /* tp_name */
4757 sizeof(PySocketSockObject), /* tp_basicsize */
4758 0, /* tp_itemsize */
4759 (destructor)sock_dealloc, /* tp_dealloc */
4760 0, /* tp_print */
4761 0, /* tp_getattr */
4762 0, /* tp_setattr */
4763 0, /* tp_reserved */
4764 (reprfunc)sock_repr, /* tp_repr */
4765 0, /* tp_as_number */
4766 0, /* tp_as_sequence */
4767 0, /* tp_as_mapping */
4768 0, /* tp_hash */
4769 0, /* tp_call */
4770 0, /* tp_str */
4771 PyObject_GenericGetAttr, /* tp_getattro */
4772 0, /* tp_setattro */
4773 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004774 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4775 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 sock_doc, /* tp_doc */
4777 0, /* tp_traverse */
4778 0, /* tp_clear */
4779 0, /* tp_richcompare */
4780 0, /* tp_weaklistoffset */
4781 0, /* tp_iter */
4782 0, /* tp_iternext */
4783 sock_methods, /* tp_methods */
4784 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004785 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004786 0, /* tp_base */
4787 0, /* tp_dict */
4788 0, /* tp_descr_get */
4789 0, /* tp_descr_set */
4790 0, /* tp_dictoffset */
4791 sock_initobj, /* tp_init */
4792 PyType_GenericAlloc, /* tp_alloc */
4793 sock_new, /* tp_new */
4794 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004795 0, /* tp_is_gc */
4796 0, /* tp_bases */
4797 0, /* tp_mro */
4798 0, /* tp_cache */
4799 0, /* tp_subclasses */
4800 0, /* tp_weaklist */
4801 0, /* tp_del */
4802 0, /* tp_version_tag */
4803 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004804};
4805
Guido van Rossum30a685f1991-06-27 15:51:29 +00004806
Guido van Rossum81194471991-07-27 21:42:02 +00004807/* Python interface to gethostname(). */
4808
4809/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004810static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004811socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004812{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004813#ifdef MS_WINDOWS
4814 /* Don't use winsock's gethostname, as this returns the ANSI
4815 version of the hostname, whereas we need a Unicode string.
4816 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004817 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004818 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004819 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004820 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004821
4822 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004823 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004824
4825 if (GetLastError() != ERROR_MORE_DATA)
4826 return PyErr_SetFromWindowsErr(0);
4827
4828 if (size == 0)
4829 return PyUnicode_New(0, 0);
4830
4831 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4832 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004833 name = PyMem_New(wchar_t, size);
4834 if (!name) {
4835 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004836 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004837 }
Victor Stinner74168972011-11-17 01:11:36 +01004838 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4839 name,
4840 &size))
4841 {
4842 PyMem_Free(name);
4843 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004844 }
Victor Stinner74168972011-11-17 01:11:36 +01004845
4846 result = PyUnicode_FromWideChar(name, size);
4847 PyMem_Free(name);
4848 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004849#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 char buf[1024];
4851 int res;
4852 Py_BEGIN_ALLOW_THREADS
4853 res = gethostname(buf, (int) sizeof buf - 1);
4854 Py_END_ALLOW_THREADS
4855 if (res < 0)
4856 return set_error();
4857 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004858 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004859#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004860}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004861
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004862PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004863"gethostname() -> string\n\
4864\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004865Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004866
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004867#ifdef HAVE_SETHOSTNAME
4868PyDoc_STRVAR(sethostname_doc,
4869"sethostname(name)\n\n\
4870Sets the hostname to name.");
4871
4872static PyObject *
4873socket_sethostname(PyObject *self, PyObject *args)
4874{
4875 PyObject *hnobj;
4876 Py_buffer buf;
4877 int res, flag = 0;
4878
Christian Heimesd2774c72013-06-19 02:06:29 +02004879#ifdef _AIX
4880/* issue #18259, not declared in any useful header file */
4881extern int sethostname(const char *, size_t);
4882#endif
4883
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004884 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4885 PyErr_Clear();
4886 if (!PyArg_ParseTuple(args, "O&:sethostname",
4887 PyUnicode_FSConverter, &hnobj))
4888 return NULL;
4889 flag = 1;
4890 }
4891 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4892 if (!res) {
4893 res = sethostname(buf.buf, buf.len);
4894 PyBuffer_Release(&buf);
4895 }
4896 if (flag)
4897 Py_DECREF(hnobj);
4898 if (res)
4899 return set_error();
4900 Py_RETURN_NONE;
4901}
4902#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004903
Guido van Rossum30a685f1991-06-27 15:51:29 +00004904/* Python interface to gethostbyname(name). */
4905
4906/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004907static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004908socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 char *name;
4911 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004912 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004913
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004914 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 return NULL;
4916 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004917 goto finally;
4918 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4919finally:
4920 PyMem_Free(name);
4921 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004922}
4923
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004924PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004925"gethostbyname(host) -> address\n\
4926\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004927Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004928
4929
Victor Stinner72400302016-01-28 15:41:01 +01004930static PyObject*
4931sock_decode_hostname(const char *name)
4932{
4933#ifdef MS_WINDOWS
4934 /* Issue #26227: gethostbyaddr() returns a string encoded
4935 * to the ANSI code page */
4936 return PyUnicode_DecodeFSDefault(name);
4937#else
4938 /* Decode from UTF-8 */
4939 return PyUnicode_FromString(name);
4940#endif
4941}
4942
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004943/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4944
4945static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004946gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 char **pch;
4949 PyObject *rtn_tuple = (PyObject *)NULL;
4950 PyObject *name_list = (PyObject *)NULL;
4951 PyObject *addr_list = (PyObject *)NULL;
4952 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004953 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 if (h == NULL) {
4956 /* Let's get real error message to return */
4957 set_herror(h_errno);
4958 return NULL;
4959 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 if (h->h_addrtype != af) {
4962 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004963 errno = EAFNOSUPPORT;
4964 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 return NULL;
4966 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 case AF_INET:
4971 if (alen < sizeof(struct sockaddr_in))
4972 return NULL;
4973 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004974
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004975#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 case AF_INET6:
4977 if (alen < sizeof(struct sockaddr_in6))
4978 return NULL;
4979 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004980#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 if ((name_list = PyList_New(0)) == NULL)
4985 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 if ((addr_list = PyList_New(0)) == NULL)
4988 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 /* SF #1511317: h_aliases can be NULL */
4991 if (h->h_aliases) {
4992 for (pch = h->h_aliases; *pch != NULL; pch++) {
4993 int status;
4994 tmp = PyUnicode_FromString(*pch);
4995 if (tmp == NULL)
4996 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 status = PyList_Append(name_list, tmp);
4999 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 if (status)
5002 goto err;
5003 }
5004 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5007 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 case AF_INET:
5012 {
5013 struct sockaddr_in sin;
5014 memset(&sin, 0, sizeof(sin));
5015 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005016#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005018#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5020 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 if (pch == h->h_addr_list && alen >= sizeof(sin))
5023 memcpy((char *) addr, &sin, sizeof(sin));
5024 break;
5025 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005026
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005027#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 case AF_INET6:
5029 {
5030 struct sockaddr_in6 sin6;
5031 memset(&sin6, 0, sizeof(sin6));
5032 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005033#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5037 tmp = makeipaddr((struct sockaddr *)&sin6,
5038 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5041 memcpy((char *) addr, &sin6, sizeof(sin6));
5042 break;
5043 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005044#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005047 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005048 "unsupported address family");
5049 return NULL;
5050 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 if (tmp == NULL)
5053 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 status = PyList_Append(addr_list, tmp);
5056 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if (status)
5059 goto err;
5060 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005061
Victor Stinner72400302016-01-28 15:41:01 +01005062 name = sock_decode_hostname(h->h_name);
5063 if (name == NULL)
5064 goto err;
5065 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005066
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005067 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 Py_XDECREF(name_list);
5069 Py_XDECREF(addr_list);
5070 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005071}
5072
5073
5074/* Python interface to gethostbyname_ex(name). */
5075
5076/*ARGSUSED*/
5077static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005078socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005079{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 char *name;
5081 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005082 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005084 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005085#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005087#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005089#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 char buf[16384];
5091 int buf_len = (sizeof buf) - 1;
5092 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005093#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005094#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005096#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005097#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005098
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005099 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005101 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005102 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005104#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005105#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005106 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005108#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005109 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005110#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 memset((void *) &data, '\0', sizeof(data));
5112 result = gethostbyname_r(name, &hp_allocated, &data);
5113 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005114#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005115#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005116#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005120#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 Py_END_ALLOW_THREADS
5122 /* Some C libraries would require addr.__ss_family instead of
5123 addr.ss_family.
5124 Therefore, we cast the sockaddr_storage into sockaddr to
5125 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005126 sa = SAS2SA(&addr);
5127 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005128 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005129#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005131#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005132finally:
5133 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005135}
5136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005137PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005138"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5139\n\
5140Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005141for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005142
5143
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005144/* Python interface to gethostbyaddr(IP). */
5145
5146/*ARGSUSED*/
5147static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005148socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005149{
Charles-François Natali8b759652011-12-23 16:44:51 +01005150 sock_addr_t addr;
5151 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 char *ip_num;
5153 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005154 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005155#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005157#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005159#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 /* glibcs up to 2.10 assume that the buf argument to
5161 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5162 does not ensure. The attribute below instructs the compiler
5163 to maintain this alignment. */
5164 char buf[16384] Py_ALIGNED(8);
5165 int buf_len = (sizeof buf) - 1;
5166 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005167#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005168#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005170#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005171#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 char *ap;
5173 int al;
5174 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005175
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005176 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 return NULL;
5178 af = AF_UNSPEC;
5179 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005180 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 af = sa->sa_family;
5182 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005183 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 switch (af) {
5185 case AF_INET:
5186 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5187 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5188 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005189#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 case AF_INET6:
5191 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5192 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5193 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005196 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005197 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 }
5199 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005200#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005201#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005202 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 &hp_allocated, buf, buf_len,
5204 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005205#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 h = gethostbyaddr_r(ap, al, af,
5207 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005208#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 memset((void *) &data, '\0', sizeof(data));
5210 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5211 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005212#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005213#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005214#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005218#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005220 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005221#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005223#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005224finally:
5225 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005227}
5228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005229PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005230"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5231\n\
5232Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005233for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005234
Guido van Rossum30a685f1991-06-27 15:51:29 +00005235
5236/* Python interface to getservbyname(name).
5237 This only returns the port number, since the other info is already
5238 known or not useful (like the list of aliases). */
5239
5240/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005242socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 char *name, *proto=NULL;
5245 struct servent *sp;
5246 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5247 return NULL;
5248 Py_BEGIN_ALLOW_THREADS
5249 sp = getservbyname(name, proto);
5250 Py_END_ALLOW_THREADS
5251 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005252 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 return NULL;
5254 }
5255 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005256}
5257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005258PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005259"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005260\n\
5261Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005262The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5263otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005264
Guido van Rossum30a685f1991-06-27 15:51:29 +00005265
Barry Warsaw11b91a02004-06-28 00:50:43 +00005266/* Python interface to getservbyport(port).
5267 This only returns the service name, since the other info is already
5268 known or not useful (like the list of aliases). */
5269
5270/*ARGSUSED*/
5271static PyObject *
5272socket_getservbyport(PyObject *self, PyObject *args)
5273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 int port;
5275 char *proto=NULL;
5276 struct servent *sp;
5277 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5278 return NULL;
5279 if (port < 0 || port > 0xffff) {
5280 PyErr_SetString(
5281 PyExc_OverflowError,
5282 "getservbyport: port must be 0-65535.");
5283 return NULL;
5284 }
5285 Py_BEGIN_ALLOW_THREADS
5286 sp = getservbyport(htons((short)port), proto);
5287 Py_END_ALLOW_THREADS
5288 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005289 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 return NULL;
5291 }
5292 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005293}
5294
5295PyDoc_STRVAR(getservbyport_doc,
5296"getservbyport(port[, protocolname]) -> string\n\
5297\n\
5298Return the service name from a port number and protocol name.\n\
5299The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5300otherwise any protocol will match.");
5301
Guido van Rossum3901d851996-12-19 16:35:04 +00005302/* Python interface to getprotobyname(name).
5303 This only returns the protocol number, since the other info is
5304 already known or not useful (like the list of aliases). */
5305
5306/*ARGSUSED*/
5307static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005308socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 char *name;
5311 struct protoent *sp;
5312 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5313 return NULL;
5314 Py_BEGIN_ALLOW_THREADS
5315 sp = getprotobyname(name);
5316 Py_END_ALLOW_THREADS
5317 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005318 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 return NULL;
5320 }
5321 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005322}
5323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005324PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005325"getprotobyname(name) -> integer\n\
5326\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005327Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005328
Guido van Rossum3901d851996-12-19 16:35:04 +00005329
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005330#ifndef NO_DUP
5331/* dup() function for socket fds */
5332
5333static PyObject *
5334socket_dup(PyObject *self, PyObject *fdobj)
5335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 SOCKET_T fd, newfd;
5337 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005338#ifdef MS_WINDOWS
5339 WSAPROTOCOL_INFO info;
5340#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 fd = PyLong_AsSocket_t(fdobj);
5343 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5344 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005345
Victor Stinnerdaf45552013-08-28 00:53:59 +02005346#ifdef MS_WINDOWS
5347 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5348 return set_error();
5349
5350 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5351 FROM_PROTOCOL_INFO,
5352 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 if (newfd == INVALID_SOCKET)
5354 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005355
Victor Stinnerdaf45552013-08-28 00:53:59 +02005356 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5357 closesocket(newfd);
5358 PyErr_SetFromWindowsErr(0);
5359 return NULL;
5360 }
5361#else
5362 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5363 newfd = _Py_dup(fd);
5364 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005365 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005366#endif
5367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 newfdobj = PyLong_FromSocket_t(newfd);
5369 if (newfdobj == NULL)
5370 SOCKETCLOSE(newfd);
5371 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005372}
5373
5374PyDoc_STRVAR(dup_doc,
5375"dup(integer) -> integer\n\
5376\n\
5377Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5378sockets; on some platforms os.dup() won't work for socket file descriptors.");
5379#endif
5380
5381
Dave Cole331708b2004-08-09 04:51:41 +00005382#ifdef HAVE_SOCKETPAIR
5383/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005384 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005385 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005386
5387/*ARGSUSED*/
5388static PyObject *
5389socket_socketpair(PyObject *self, PyObject *args)
5390{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005391 PySocketSockObject *s0 = NULL, *s1 = NULL;
5392 SOCKET_T sv[2];
5393 int family, type = SOCK_STREAM, proto = 0;
5394 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005395#ifdef SOCK_CLOEXEC
5396 int *atomic_flag_works = &sock_cloexec_works;
5397#else
5398 int *atomic_flag_works = NULL;
5399#endif
5400 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005401
5402#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005404#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5408 &family, &type, &proto))
5409 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005412 Py_BEGIN_ALLOW_THREADS
5413#ifdef SOCK_CLOEXEC
5414 if (sock_cloexec_works != 0) {
5415 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5416 if (sock_cloexec_works == -1) {
5417 if (ret >= 0) {
5418 sock_cloexec_works = 1;
5419 }
5420 else if (errno == EINVAL) {
5421 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5422 sock_cloexec_works = 0;
5423 ret = socketpair(family, type, proto, sv);
5424 }
5425 }
5426 }
5427 else
5428#endif
5429 {
5430 ret = socketpair(family, type, proto, sv);
5431 }
5432 Py_END_ALLOW_THREADS
5433
5434 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005436
5437 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5438 goto finally;
5439 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5440 goto finally;
5441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 s0 = new_sockobject(sv[0], family, type, proto);
5443 if (s0 == NULL)
5444 goto finally;
5445 s1 = new_sockobject(sv[1], family, type, proto);
5446 if (s1 == NULL)
5447 goto finally;
5448 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005449
5450finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 if (res == NULL) {
5452 if (s0 == NULL)
5453 SOCKETCLOSE(sv[0]);
5454 if (s1 == NULL)
5455 SOCKETCLOSE(sv[1]);
5456 }
5457 Py_XDECREF(s0);
5458 Py_XDECREF(s1);
5459 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005460}
5461
5462PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005463"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005464\n\
5465Create a pair of socket objects from the sockets returned by the platform\n\
5466socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005467The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005468AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005469
5470#endif /* HAVE_SOCKETPAIR */
5471
5472
Guido van Rossum006bf911996-06-12 04:04:55 +00005473static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005474socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005475{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005476 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005477
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005478 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 return NULL;
5480 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005481 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005483 "ntohs: can't convert negative Python int to C "
5484 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 return NULL;
5486 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005487 if (x > 0xffff) {
5488 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5489 "ntohs: Python int too large to convert to C "
5490 "16-bit unsigned integer (The silent truncation "
5491 "is deprecated)",
5492 1)) {
5493 return NULL;
5494 }
5495 }
5496 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005497}
5498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005499PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005500"ntohs(integer) -> integer\n\
5501\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005502Convert a 16-bit unsigned integer from network to host byte order.\n\
5503Note that in case the received integer does not fit in 16-bit unsigned\n\
5504integer, but does fit in a positive C int, it is silently truncated to\n\
550516-bit unsigned integer.\n\
5506However, this silent truncation feature is deprecated, and will raise an \n\
5507exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005508
5509
Guido van Rossum006bf911996-06-12 04:04:55 +00005510static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005511socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 if (PyLong_Check(arg)) {
5516 x = PyLong_AsUnsignedLong(arg);
5517 if (x == (unsigned long) -1 && PyErr_Occurred())
5518 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005519#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 {
5521 unsigned long y;
5522 /* only want the trailing 32 bits */
5523 y = x & 0xFFFFFFFFUL;
5524 if (y ^ x)
5525 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005526 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005527 x = y;
5528 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005530 }
5531 else
5532 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005533 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005536}
5537
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005538PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005539"ntohl(integer) -> integer\n\
5540\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005541Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005542
5543
Guido van Rossum006bf911996-06-12 04:04:55 +00005544static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005545socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005546{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005547 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005548
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005549 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005550 return NULL;
5551 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005552 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005554 "htons: can't convert negative Python int to C "
5555 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005556 return NULL;
5557 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005558 if (x > 0xffff) {
5559 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5560 "htons: Python int too large to convert to C "
5561 "16-bit unsigned integer (The silent truncation "
5562 "is deprecated)",
5563 1)) {
5564 return NULL;
5565 }
5566 }
5567 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005568}
5569
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005570PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005571"htons(integer) -> integer\n\
5572\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005573Convert a 16-bit unsigned integer from host to network byte order.\n\
5574Note that in case the received integer does not fit in 16-bit unsigned\n\
5575integer, but does fit in a positive C int, it is silently truncated to\n\
557616-bit unsigned integer.\n\
5577However, this silent truncation feature is deprecated, and will raise an \n\
5578exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005579
5580
Guido van Rossum006bf911996-06-12 04:04:55 +00005581static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005582socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 if (PyLong_Check(arg)) {
5587 x = PyLong_AsUnsignedLong(arg);
5588 if (x == (unsigned long) -1 && PyErr_Occurred())
5589 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005590#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 {
5592 unsigned long y;
5593 /* only want the trailing 32 bits */
5594 y = x & 0xFFFFFFFFUL;
5595 if (y ^ x)
5596 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005597 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 x = y;
5599 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 }
5602 else
5603 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005604 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 Py_TYPE(arg)->tp_name);
5606 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005607}
5608
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005609PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005610"htonl(integer) -> integer\n\
5611\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005612Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005613
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005614/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005616PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005617"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005618\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005619Convert 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 +00005620binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005621
5622static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005623socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005624{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005625#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005626 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005627#endif
5628
5629#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005630#if (SIZEOF_INT != 4)
5631#error "Not sure if in_addr_t exists and int is not 32-bits."
5632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005633 /* Have to use inet_addr() instead */
5634 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5639 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005640
Tim Peters1df9fdd2003-02-13 03:13:40 +00005641
5642#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005643
5644#ifdef USE_INET_ATON_WEAKLINK
5645 if (inet_aton != NULL) {
5646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 if (inet_aton(ip_addr, &buf))
5648 return PyBytes_FromStringAndSize((char *)(&buf),
5649 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005650
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005651 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 "illegal IP address string passed to inet_aton");
5653 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005654
Thomas Wouters477c8d52006-05-27 19:21:47 +00005655#ifdef USE_INET_ATON_WEAKLINK
5656 } else {
5657#endif
5658
5659#endif
5660
5661#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 /* special-case this address as inet_addr might return INADDR_NONE
5664 * for this */
5665 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005666 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005669 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005672 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 "illegal IP address string passed to inet_aton");
5674 return NULL;
5675 }
5676 }
5677 return PyBytes_FromStringAndSize((char *) &packed_addr,
5678 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005679
5680#ifdef USE_INET_ATON_WEAKLINK
5681 }
5682#endif
5683
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005684#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005685}
5686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005687PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005688"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005689\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005690Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005691
5692static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005693socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005694{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005695 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005697
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005698 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 return NULL;
5700 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005701
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005702 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005703 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005705 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 return NULL;
5707 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005708
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005709 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5710 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005713}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005714
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005715#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005716
5717PyDoc_STRVAR(inet_pton_doc,
5718"inet_pton(af, ip) -> packed IP address string\n\
5719\n\
5720Convert an IP address from string format to a packed string suitable\n\
5721for use with low-level network functions.");
5722
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005723#endif
5724
5725#ifdef HAVE_INET_PTON
5726
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005727static PyObject *
5728socket_inet_pton(PyObject *self, PyObject *args)
5729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 int af;
5731 char* ip;
5732 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005733#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005734 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005735#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5739 return NULL;
5740 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005741
Martin v. Löwis04697e82004-06-02 12:35:29 +00005742#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005744 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 "can't use AF_INET6, IPv6 is disabled");
5746 return NULL;
5747 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005748#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005749
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 retval = inet_pton(af, ip, packed);
5751 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005752 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 return NULL;
5754 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005755 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 "illegal IP address string passed to inet_pton");
5757 return NULL;
5758 } else if (af == AF_INET) {
5759 return PyBytes_FromStringAndSize(packed,
5760 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005761#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 } else if (af == AF_INET6) {
5763 return PyBytes_FromStringAndSize(packed,
5764 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005767 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 return NULL;
5769 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005770}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005771#elif defined(MS_WINDOWS)
5772
5773static PyObject *
5774socket_inet_pton(PyObject *self, PyObject *args)
5775{
5776 int af;
5777 char* ip;
5778 struct sockaddr_in6 addr;
5779 INT ret, size;
5780
5781 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5782 return NULL;
5783 }
5784
Victor Stinnere990c6e2013-11-16 00:18:58 +01005785 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005786 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5787
5788 if (ret) {
5789 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5790 return NULL;
5791 } else if(af == AF_INET) {
5792 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005793 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005794 sizeof(addr4->sin_addr));
5795 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005796 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005797 sizeof(addr.sin6_addr));
5798 } else {
5799 PyErr_SetString(PyExc_OSError, "unknown address family");
5800 return NULL;
5801 }
5802}
5803
5804#endif
5805
5806#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005807
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005808PyDoc_STRVAR(inet_ntop_doc,
5809"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5810\n\
5811Convert a packed IP address of the given family to string format.");
5812
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005813#endif
5814
5815
5816#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005817static PyObject *
5818socket_inet_ntop(PyObject *self, PyObject *args)
5819{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005821 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005823#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005824 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005825#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005827#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5830 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005831
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005832 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 return NULL;
5834 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005837 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 PyErr_SetString(PyExc_ValueError,
5839 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005840 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 return NULL;
5842 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005843#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005844 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005845 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 PyErr_SetString(PyExc_ValueError,
5847 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005848 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 return NULL;
5850 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852 } else {
5853 PyErr_Format(PyExc_ValueError,
5854 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005855 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 return NULL;
5857 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005858
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005859 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5860 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005862 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 return NULL;
5864 } else {
5865 return PyUnicode_FromString(retval);
5866 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005867}
5868
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005869#elif defined(MS_WINDOWS)
5870
5871static PyObject *
5872socket_inet_ntop(PyObject *self, PyObject *args)
5873{
5874 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005875 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005876 struct sockaddr_in6 addr;
5877 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005878#ifdef ENABLE_IPV6
5879 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5880#else
5881 char ip[INET_ADDRSTRLEN + 1];
5882#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005883
5884 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5885 memset((void *) &ip[0], '\0', sizeof(ip));
5886
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005887 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005888 return NULL;
5889 }
5890
5891 if (af == AF_INET) {
5892 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5893
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005894 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005895 PyErr_SetString(PyExc_ValueError,
5896 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005897 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005898 return NULL;
5899 }
5900 memset(addr4, 0, sizeof(struct sockaddr_in));
5901 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005902 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005903 addrlen = sizeof(struct sockaddr_in);
5904 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005905 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005906 PyErr_SetString(PyExc_ValueError,
5907 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005908 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005909 return NULL;
5910 }
5911
5912 memset(&addr, 0, sizeof(addr));
5913 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005914 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005915 addrlen = sizeof(addr);
5916 } else {
5917 PyErr_Format(PyExc_ValueError,
5918 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005919 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005920 return NULL;
5921 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005922 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005923
5924 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005925 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005926 ip, &retlen);
5927
5928 if (ret) {
5929 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5930 return NULL;
5931 } else {
5932 return PyUnicode_FromString(ip);
5933 }
5934}
5935
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005936#endif /* HAVE_INET_PTON */
5937
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005938/* Python interface to getaddrinfo(host, port). */
5939
5940/*ARGSUSED*/
5941static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005942socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005943{
Victor Stinner77af1722011-05-26 14:05:59 +02005944 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005945 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 struct addrinfo hints, *res;
5947 struct addrinfo *res0 = NULL;
5948 PyObject *hobj = NULL;
5949 PyObject *pobj = (PyObject *)NULL;
5950 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005951 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 int family, socktype, protocol, flags;
5953 int error;
5954 PyObject *all = (PyObject *)NULL;
5955 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005956
Georg Brandl6083a4b2013-10-14 06:51:46 +02005957 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005959 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005960 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 &protocol, &flags)) {
5962 return NULL;
5963 }
5964 if (hobj == Py_None) {
5965 hptr = NULL;
5966 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005967 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 if (!idna)
5969 return NULL;
5970 assert(PyBytes_Check(idna));
5971 hptr = PyBytes_AS_STRING(idna);
5972 } else if (PyBytes_Check(hobj)) {
5973 hptr = PyBytes_AsString(hobj);
5974 } else {
5975 PyErr_SetString(PyExc_TypeError,
5976 "getaddrinfo() argument 1 must be string or None");
5977 return NULL;
5978 }
5979 if (PyLong_CheckExact(pobj)) {
5980 long value = PyLong_AsLong(pobj);
5981 if (value == -1 && PyErr_Occurred())
5982 goto err;
5983 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5984 pptr = pbuf;
5985 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005986 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005987 if (pptr == NULL)
5988 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005990 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 } else if (pobj == Py_None) {
5992 pptr = (char *)NULL;
5993 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005994 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 goto err;
5996 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005997#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005998 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5999 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006000 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6001 * This workaround avoids a segfault in libsystem.
6002 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006003 pptr = "00";
6004 }
6005#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 memset(&hints, 0, sizeof(hints));
6007 hints.ai_family = family;
6008 hints.ai_socktype = socktype;
6009 hints.ai_protocol = protocol;
6010 hints.ai_flags = flags;
6011 Py_BEGIN_ALLOW_THREADS
6012 ACQUIRE_GETADDRINFO_LOCK
6013 error = getaddrinfo(hptr, pptr, &hints, &res0);
6014 Py_END_ALLOW_THREADS
6015 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6016 if (error) {
6017 set_gaierror(error);
6018 goto err;
6019 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006020
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006021 all = PyList_New(0);
6022 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 goto err;
6024 for (res = res0; res; res = res->ai_next) {
6025 PyObject *single;
6026 PyObject *addr =
6027 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6028 if (addr == NULL)
6029 goto err;
6030 single = Py_BuildValue("iiisO", res->ai_family,
6031 res->ai_socktype, res->ai_protocol,
6032 res->ai_canonname ? res->ai_canonname : "",
6033 addr);
6034 Py_DECREF(addr);
6035 if (single == NULL)
6036 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 if (PyList_Append(all, single))
6039 goto err;
6040 Py_XDECREF(single);
6041 }
6042 Py_XDECREF(idna);
6043 if (res0)
6044 freeaddrinfo(res0);
6045 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006046 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 Py_XDECREF(all);
6048 Py_XDECREF(idna);
6049 if (res0)
6050 freeaddrinfo(res0);
6051 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006052}
6053
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006054PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006055"getaddrinfo(host, port [, family, type, proto, flags])\n\
6056 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006057\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006058Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006059
6060/* Python interface to getnameinfo(sa, flags). */
6061
6062/*ARGSUSED*/
6063static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006064socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 PyObject *sa = (PyObject *)NULL;
6067 int flags;
6068 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006069 int port;
6070 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006071 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6072 struct addrinfo hints, *res = NULL;
6073 int error;
6074 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006075 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 flags = flowinfo = scope_id = 0;
6078 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6079 return NULL;
6080 if (!PyTuple_Check(sa)) {
6081 PyErr_SetString(PyExc_TypeError,
6082 "getnameinfo() argument 1 must be a tuple");
6083 return NULL;
6084 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006085 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006086 &hostp, &port, &flowinfo, &scope_id))
6087 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006088 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006089 PyErr_SetString(PyExc_OverflowError,
6090 "getsockaddrarg: flowinfo must be 0-1048575.");
6091 return NULL;
6092 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6094 memset(&hints, 0, sizeof(hints));
6095 hints.ai_family = AF_UNSPEC;
6096 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006097 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006098 Py_BEGIN_ALLOW_THREADS
6099 ACQUIRE_GETADDRINFO_LOCK
6100 error = getaddrinfo(hostp, pbuf, &hints, &res);
6101 Py_END_ALLOW_THREADS
6102 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6103 if (error) {
6104 set_gaierror(error);
6105 goto fail;
6106 }
6107 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006108 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 "sockaddr resolved to multiple addresses");
6110 goto fail;
6111 }
6112 switch (res->ai_family) {
6113 case AF_INET:
6114 {
6115 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006116 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 "IPv4 sockaddr must be 2 tuple");
6118 goto fail;
6119 }
6120 break;
6121 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006122#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 case AF_INET6:
6124 {
6125 struct sockaddr_in6 *sin6;
6126 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006127 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 sin6->sin6_scope_id = scope_id;
6129 break;
6130 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006133 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6135 if (error) {
6136 set_gaierror(error);
6137 goto fail;
6138 }
Victor Stinner72400302016-01-28 15:41:01 +01006139
6140 name = sock_decode_hostname(hbuf);
6141 if (name == NULL)
6142 goto fail;
6143 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006144
6145fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 if (res)
6147 freeaddrinfo(res);
6148 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006149}
6150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006151PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006152"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006153\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006154Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006155
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006156
6157/* Python API to getting and setting the default timeout value. */
6158
6159static PyObject *
6160socket_getdefaulttimeout(PyObject *self)
6161{
Victor Stinner71694d52015-03-28 01:18:54 +01006162 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006163 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 }
Victor Stinner71694d52015-03-28 01:18:54 +01006165 else {
6166 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6167 return PyFloat_FromDouble(seconds);
6168 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006169}
6170
6171PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006172"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006173\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006174Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006175A value of None indicates that new socket objects have no timeout.\n\
6176When the socket module is first imported, the default is None.");
6177
6178static PyObject *
6179socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6180{
Victor Stinner71694d52015-03-28 01:18:54 +01006181 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006182
Victor Stinner71694d52015-03-28 01:18:54 +01006183 if (socket_parse_timeout(&timeout, arg) < 0)
6184 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006187
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006188 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006189}
6190
6191PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006192"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006193\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006194Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006195A value of None indicates that new socket objects have no timeout.\n\
6196When the socket module is first imported, the default is None.");
6197
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006198#ifdef HAVE_IF_NAMEINDEX
6199/* Python API for getting interface indices and names */
6200
6201static PyObject *
6202socket_if_nameindex(PyObject *self, PyObject *arg)
6203{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006204 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006205 int i;
6206 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006207
Charles-François Natali60713592011-05-20 16:55:06 +02006208 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006209 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006210 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006211 return NULL;
6212 }
6213
6214 list = PyList_New(0);
6215 if (list == NULL) {
6216 if_freenameindex(ni);
6217 return NULL;
6218 }
6219
Charles-François Natali60713592011-05-20 16:55:06 +02006220 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6221 PyObject *ni_tuple = Py_BuildValue("IO&",
6222 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006223
6224 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6225 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006226 Py_DECREF(list);
6227 if_freenameindex(ni);
6228 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006229 }
6230 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006231 }
6232
6233 if_freenameindex(ni);
6234 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006235}
6236
6237PyDoc_STRVAR(if_nameindex_doc,
6238"if_nameindex()\n\
6239\n\
6240Returns a list of network interface information (index, name) tuples.");
6241
Charles-François Natali60713592011-05-20 16:55:06 +02006242static PyObject *
6243socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006244{
Charles-François Natali60713592011-05-20 16:55:06 +02006245 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006246 unsigned long index;
6247
Charles-François Natali60713592011-05-20 16:55:06 +02006248 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6249 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006250 return NULL;
6251
Charles-François Natali60713592011-05-20 16:55:06 +02006252 index = if_nametoindex(PyBytes_AS_STRING(oname));
6253 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006254 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006255 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006256 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006257 return NULL;
6258 }
6259
6260 return PyLong_FromUnsignedLong(index);
6261}
6262
6263PyDoc_STRVAR(if_nametoindex_doc,
6264"if_nametoindex(if_name)\n\
6265\n\
6266Returns the interface index corresponding to the interface name if_name.");
6267
Charles-François Natali60713592011-05-20 16:55:06 +02006268static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006269socket_if_indextoname(PyObject *self, PyObject *arg)
6270{
Charles-François Natali60713592011-05-20 16:55:06 +02006271 unsigned long index;
6272 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006273
Charles-François Natali60713592011-05-20 16:55:06 +02006274 index = PyLong_AsUnsignedLong(arg);
6275 if (index == (unsigned long) -1)
6276 return NULL;
6277
6278 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006279 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006280 return NULL;
6281 }
6282
Charles-François Natali60713592011-05-20 16:55:06 +02006283 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006284}
6285
6286PyDoc_STRVAR(if_indextoname_doc,
6287"if_indextoname(if_index)\n\
6288\n\
6289Returns the interface name corresponding to the interface index if_index.");
6290
6291#endif /* HAVE_IF_NAMEINDEX */
6292
6293
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006294#ifdef CMSG_LEN
6295/* Python interface to CMSG_LEN(length). */
6296
6297static PyObject *
6298socket_CMSG_LEN(PyObject *self, PyObject *args)
6299{
6300 Py_ssize_t length;
6301 size_t result;
6302
6303 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6304 return NULL;
6305 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6306 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6307 return NULL;
6308 }
6309 return PyLong_FromSize_t(result);
6310}
6311
6312PyDoc_STRVAR(CMSG_LEN_doc,
6313"CMSG_LEN(length) -> control message length\n\
6314\n\
6315Return the total length, without trailing padding, of an ancillary\n\
6316data item with associated data of the given length. This value can\n\
6317often be used as the buffer size for recvmsg() to receive a single\n\
6318item of ancillary data, but RFC 3542 requires portable applications to\n\
6319use CMSG_SPACE() and thus include space for padding, even when the\n\
6320item will be the last in the buffer. Raises OverflowError if length\n\
6321is outside the permissible range of values.");
6322
6323
6324#ifdef CMSG_SPACE
6325/* Python interface to CMSG_SPACE(length). */
6326
6327static PyObject *
6328socket_CMSG_SPACE(PyObject *self, PyObject *args)
6329{
6330 Py_ssize_t length;
6331 size_t result;
6332
6333 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6334 return NULL;
6335 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6336 PyErr_SetString(PyExc_OverflowError,
6337 "CMSG_SPACE() argument out of range");
6338 return NULL;
6339 }
6340 return PyLong_FromSize_t(result);
6341}
6342
6343PyDoc_STRVAR(CMSG_SPACE_doc,
6344"CMSG_SPACE(length) -> buffer size\n\
6345\n\
6346Return the buffer size needed for recvmsg() to receive an ancillary\n\
6347data item with associated data of the given length, along with any\n\
6348trailing padding. The buffer space needed to receive multiple items\n\
6349is the sum of the CMSG_SPACE() values for their associated data\n\
6350lengths. Raises OverflowError if length is outside the permissible\n\
6351range of values.");
6352#endif /* CMSG_SPACE */
6353#endif /* CMSG_LEN */
6354
6355
Guido van Rossum30a685f1991-06-27 15:51:29 +00006356/* List of functions exported by this module. */
6357
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006358static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359 {"gethostbyname", socket_gethostbyname,
6360 METH_VARARGS, gethostbyname_doc},
6361 {"gethostbyname_ex", socket_gethostbyname_ex,
6362 METH_VARARGS, ghbn_ex_doc},
6363 {"gethostbyaddr", socket_gethostbyaddr,
6364 METH_VARARGS, gethostbyaddr_doc},
6365 {"gethostname", socket_gethostname,
6366 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006367#ifdef HAVE_SETHOSTNAME
6368 {"sethostname", socket_sethostname,
6369 METH_VARARGS, sethostname_doc},
6370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 {"getservbyname", socket_getservbyname,
6372 METH_VARARGS, getservbyname_doc},
6373 {"getservbyport", socket_getservbyport,
6374 METH_VARARGS, getservbyport_doc},
6375 {"getprotobyname", socket_getprotobyname,
6376 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006377#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 {"dup", socket_dup,
6379 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006380#endif
Dave Cole331708b2004-08-09 04:51:41 +00006381#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 {"socketpair", socket_socketpair,
6383 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 {"ntohs", socket_ntohs,
6386 METH_VARARGS, ntohs_doc},
6387 {"ntohl", socket_ntohl,
6388 METH_O, ntohl_doc},
6389 {"htons", socket_htons,
6390 METH_VARARGS, htons_doc},
6391 {"htonl", socket_htonl,
6392 METH_O, htonl_doc},
6393 {"inet_aton", socket_inet_aton,
6394 METH_VARARGS, inet_aton_doc},
6395 {"inet_ntoa", socket_inet_ntoa,
6396 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006397#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 {"inet_pton", socket_inet_pton,
6399 METH_VARARGS, inet_pton_doc},
6400 {"inet_ntop", socket_inet_ntop,
6401 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006402#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006403 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6404 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 {"getnameinfo", socket_getnameinfo,
6406 METH_VARARGS, getnameinfo_doc},
6407 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6408 METH_NOARGS, getdefaulttimeout_doc},
6409 {"setdefaulttimeout", socket_setdefaulttimeout,
6410 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006411#ifdef HAVE_IF_NAMEINDEX
6412 {"if_nameindex", socket_if_nameindex,
6413 METH_NOARGS, if_nameindex_doc},
6414 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006415 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006416 {"if_indextoname", socket_if_indextoname,
6417 METH_O, if_indextoname_doc},
6418#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006419#ifdef CMSG_LEN
6420 {"CMSG_LEN", socket_CMSG_LEN,
6421 METH_VARARGS, CMSG_LEN_doc},
6422#ifdef CMSG_SPACE
6423 {"CMSG_SPACE", socket_CMSG_SPACE,
6424 METH_VARARGS, CMSG_SPACE_doc},
6425#endif
6426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006428};
6429
Guido van Rossum30a685f1991-06-27 15:51:29 +00006430
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006431#ifdef MS_WINDOWS
6432#define OS_INIT_DEFINED
6433
6434/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006435
6436static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006437os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006438{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006440}
6441
6442static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006443os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 WSADATA WSAData;
6446 int ret;
6447 ret = WSAStartup(0x0101, &WSAData);
6448 switch (ret) {
6449 case 0: /* No error */
6450 Py_AtExit(os_cleanup);
6451 return 1; /* Success */
6452 case WSASYSNOTREADY:
6453 PyErr_SetString(PyExc_ImportError,
6454 "WSAStartup failed: network not ready");
6455 break;
6456 case WSAVERNOTSUPPORTED:
6457 case WSAEINVAL:
6458 PyErr_SetString(
6459 PyExc_ImportError,
6460 "WSAStartup failed: requested version not supported");
6461 break;
6462 default:
6463 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6464 break;
6465 }
6466 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006467}
6468
Guido van Rossum8d665e61996-06-26 18:22:49 +00006469#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006470
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006471
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006472
6473#ifndef OS_INIT_DEFINED
6474static int
6475os_init(void)
6476{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006478}
6479#endif
6480
6481
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006482/* C API table - always add new things to the end for binary
6483 compatibility. */
6484static
6485PySocketModule_APIObject PySocketModuleAPI =
6486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006488 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006490};
6491
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006492
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006493/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006494
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006495 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006496 "socket.py" which implements some additional functionality.
6497 The import of "_socket" may fail with an ImportError exception if
6498 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006499 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006500 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006501*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006503PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006504"Implementation module for socket operations.\n\
6505\n\
6506See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006507
Martin v. Löwis1a214512008-06-11 05:26:20 +00006508static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 PyModuleDef_HEAD_INIT,
6510 PySocket_MODULE_NAME,
6511 socket_doc,
6512 -1,
6513 socket_methods,
6514 NULL,
6515 NULL,
6516 NULL,
6517 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006518};
6519
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006520PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006521PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 if (!os_init())
6526 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006527
Victor Stinnerdaf45552013-08-28 00:53:59 +02006528#ifdef MS_WINDOWS
6529 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006530#if defined(_MSC_VER) && _MSC_VER >= 1800
6531 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6532#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006533 DWORD version = GetVersion();
6534 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6535 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6536 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006537 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6538#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006539 }
6540#endif
6541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542 Py_TYPE(&sock_type) = &PyType_Type;
6543 m = PyModule_Create(&socketmodule);
6544 if (m == NULL)
6545 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006546
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006547 Py_INCREF(PyExc_OSError);
6548 PySocketModuleAPI.error = PyExc_OSError;
6549 Py_INCREF(PyExc_OSError);
6550 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006552 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 if (socket_herror == NULL)
6554 return NULL;
6555 Py_INCREF(socket_herror);
6556 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006557 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 NULL);
6559 if (socket_gaierror == NULL)
6560 return NULL;
6561 Py_INCREF(socket_gaierror);
6562 PyModule_AddObject(m, "gaierror", socket_gaierror);
6563 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006564 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 if (socket_timeout == NULL)
6566 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006567 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 Py_INCREF(socket_timeout);
6569 PyModule_AddObject(m, "timeout", socket_timeout);
6570 Py_INCREF((PyObject *)&sock_type);
6571 if (PyModule_AddObject(m, "SocketType",
6572 (PyObject *)&sock_type) != 0)
6573 return NULL;
6574 Py_INCREF((PyObject *)&sock_type);
6575 if (PyModule_AddObject(m, "socket",
6576 (PyObject *)&sock_type) != 0)
6577 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006578
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006579#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006581#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 Py_INCREF(has_ipv6);
6585 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587 /* Export C API */
6588 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6589 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6590 ) != 0)
6591 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006594#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006595 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006596#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006598#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006600#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006601#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006604#endif
6605#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006607#endif
6608#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006611#endif
6612#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006615#endif
6616#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006619#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006620#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006623#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006627#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006628#ifdef HAVE_SOCKADDR_ALG
6629 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6630#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006631#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006634#endif
6635#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006637#endif
6638#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006641#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006642#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006645#endif
6646#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006649#endif
6650#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006653#endif
6654#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006657#endif
6658#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, AF_NETLINK);
6661 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006662#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006664#endif
6665#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006667#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6669 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006670#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006672#endif
6673#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006675#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006676#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006678#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006679#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006681#endif
6682#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006683 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006684#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006686#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006688#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006689#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006691#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006692#ifdef NETLINK_CRYPTO
6693 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6694#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006695#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006696#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006699#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006700#ifdef AF_LINK
6701 PyModule_AddIntMacro(m, AF_LINK);
6702#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006703#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006706#endif
6707#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006708 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006710#endif
6711#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006714#endif
6715#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006716 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006718#endif
6719#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006722#endif
6723#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006726#endif
6727#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006730#endif
6731#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006732 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006734#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006735
Hye-Shik Chang81268602004-02-02 06:05:24 +00006736#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6738 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6739 PyModule_AddIntMacro(m, BTPROTO_HCI);
6740 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006741#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006743#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006744#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006745#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006747#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6749 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006750#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6753 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006754#endif
6755
Charles-François Natali47413c12011-10-06 19:47:44 +02006756#ifdef AF_CAN
6757 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006759#endif
6760#ifdef PF_CAN
6761 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006763#endif
6764
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006765/* Reliable Datagram Sockets */
6766#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006768#endif
6769#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006771#endif
6772
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006773/* Kernel event messages */
6774#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006776#endif
6777#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006779#endif
6780
Antoine Pitroub156a462010-10-27 20:13:57 +00006781#ifdef AF_PACKET
6782 PyModule_AddIntMacro(m, AF_PACKET);
6783#endif
6784#ifdef PF_PACKET
6785 PyModule_AddIntMacro(m, PF_PACKET);
6786#endif
6787#ifdef PACKET_HOST
6788 PyModule_AddIntMacro(m, PACKET_HOST);
6789#endif
6790#ifdef PACKET_BROADCAST
6791 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6792#endif
6793#ifdef PACKET_MULTICAST
6794 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6795#endif
6796#ifdef PACKET_OTHERHOST
6797 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6798#endif
6799#ifdef PACKET_OUTGOING
6800 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6801#endif
6802#ifdef PACKET_LOOPBACK
6803 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6804#endif
6805#ifdef PACKET_FASTROUTE
6806 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006807#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006808
Christian Heimes043d6f62008-01-07 17:19:16 +00006809#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006812 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6814 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6815 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006816
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6818 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6819 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006821 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, SOL_TIPC);
6823 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6824 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6825 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6826 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006827
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6829 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6830 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6831 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006833 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6835 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006836#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006837 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006839#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6841 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6842 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6843 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6844 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6845 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006846#endif
6847
Christian Heimesdffa3942016-09-05 23:54:41 +02006848#ifdef HAVE_SOCKADDR_ALG
6849 /* Socket options */
6850 PyModule_AddIntMacro(m, ALG_SET_KEY);
6851 PyModule_AddIntMacro(m, ALG_SET_IV);
6852 PyModule_AddIntMacro(m, ALG_SET_OP);
6853 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6854 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6855 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6856
6857 /* Operations */
6858 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6859 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6860 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6861 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6862#endif
6863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, SOCK_STREAM);
6866 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006867/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006868#ifdef SOCK_RAW
6869 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006871#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006873#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006875#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006876#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006878#endif
6879#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006881#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006891#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006892#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006894#endif
6895
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006905#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006908#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006911#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006913#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006914#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006917#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006931#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006936#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006945#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006946#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006948#endif
6949#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006951#endif
6952#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006954#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006955#ifdef SO_PASSSEC
6956 PyModule_AddIntMacro(m, SO_PASSSEC);
6957#endif
6958#ifdef SO_PEERSEC
6959 PyModule_AddIntMacro(m, SO_PEERSEC);
6960#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006961#ifdef SO_BINDTODEVICE
6962 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6963#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006964#ifdef SO_PRIORITY
6965 PyModule_AddIntMacro(m, SO_PRIORITY);
6966#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006967#ifdef SO_MARK
6968 PyModule_AddIntMacro(m, SO_MARK);
6969#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006970#ifdef SO_DOMAIN
6971 PyModule_AddIntMacro(m, SO_DOMAIN);
6972#endif
6973#ifdef SO_PROTOCOL
6974 PyModule_AddIntMacro(m, SO_PROTOCOL);
6975#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 /* Maximum number of connections for "listen" */
6978#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006980#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006982#endif
6983
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006984 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006985#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006987#endif
6988#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006990#endif
6991#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006992 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006993#endif
6994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006995 /* Flags for send, recv */
6996#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006999#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007002#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007005#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007008#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007020#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007023#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007025#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007026#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007028#endif
7029#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007031#endif
7032#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007034#endif
7035#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007037#endif
7038#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007040#endif
7041#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007043#endif
7044#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007046#endif
7047#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007049#endif
7050#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007052#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007053#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007055#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007057 /* Protocol level and numbers, usable for [gs]etsockopt */
7058#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007060#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007063#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007064 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007065#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007066#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007069#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007071#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007074#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007075#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007078#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007081#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007083#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007084 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007088#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007089 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007090#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007091#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007093#endif
7094#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7096 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007097#endif
7098#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7100 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7101 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007102
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007103 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7104 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7105 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007106#endif
7107#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7109 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7110 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7111 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007112#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007113#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7114 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7115#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007116#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007118 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7119 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7120 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7121 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7122 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7123 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7124 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7125 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7126 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7127 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7128 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7129 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7130#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007131#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007133#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007134#ifdef HAVE_SOCKADDR_ALG
7135 PyModule_AddIntMacro(m, SOL_ALG);
7136#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007137#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007139#endif
7140#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007142#endif
7143#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007145#endif
7146#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007148#endif
7149#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007151#endif
7152#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007157#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007160#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007162#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007165#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007171#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007172 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007185#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007187#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007188#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007194#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007196#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007211#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007224 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007227 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007230 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007233 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007236 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007238#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007239 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007240#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007241#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007249#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007251 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007252#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007255#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007256#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007257 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007258#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007260 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007261#endif
7262/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007265#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007268#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007269 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007270#endif
7271
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007272#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007274#endif
7275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007276 /* Some port configuration */
7277#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007278 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007279#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007282#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007283 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007284#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007286#endif
7287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288 /* Some reserved IP v.4 addresses */
7289#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007290 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007291#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007292 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007295 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007296#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007298#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007300 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007301#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007302 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007306#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007309#ifdef INADDR_ALLHOSTS_GROUP
7310 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7311 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007312#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007315#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007316 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007317#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007322#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007324#endif
7325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326 /* IPv4 [gs]etsockopt options */
7327#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007328 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007330#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007331 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007334 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007340 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007342#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007343 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007345#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007346 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007348#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007349 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007352 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007354#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007355 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007361 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007364 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007365#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007366#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007367 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007368#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007369#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007370 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007372#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007373 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007374#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007375#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007376 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007377#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007379 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7380#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007384 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007386#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007387 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007389#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007390 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007392#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007393 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007395#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007396 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007398 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007399#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007402 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007403#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007405#endif
7406#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007408#endif
7409#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007411#endif
7412#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007414#endif
7415#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007416 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007417#endif
7418#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007419 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007420#endif
7421#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007422 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007423#endif
7424#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007425 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007426#endif
7427#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007428 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007429#endif
7430#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007431 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007432#endif
7433#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007434 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007435#endif
7436#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007438#endif
7439#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007440 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007441#endif
7442#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007443 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007444#endif
7445#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007446 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007447#endif
7448#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007449 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007450#endif
7451#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007452 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007453#endif
7454#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007455 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007456#endif
7457#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007458 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007459#endif
7460#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007461 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007462#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464 /* TCP options */
7465#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007466 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007468#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007469 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007471#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007472 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007474#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007475 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007477#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007478 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007480#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007481 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007483#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007484 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007486#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007487 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007489#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007490 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007492#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007493 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007495#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007496 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007498#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007500#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007501#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007503#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007504#ifdef TCP_CONGESTION
7505 PyModule_AddIntMacro(m, TCP_CONGESTION);
7506#endif
7507#ifdef TCP_USER_TIMEOUT
7508 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7509#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007510#ifdef TCP_NOTSENT_LOWAT
7511 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7512#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514 /* IPX options */
7515#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007516 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007517#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007518
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007519/* Reliable Datagram Sockets */
7520#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007522#endif
7523#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007525#endif
7526#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007528#endif
7529#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007531#endif
7532#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007534#endif
7535#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007537#endif
7538#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007540#endif
7541#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007542 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007543#endif
7544#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007545 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007546#endif
7547#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007548 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007549#endif
7550#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007551 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007552#endif
7553#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007554 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007555#endif
7556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007557 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007558#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007559 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007560#endif
7561#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007562 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007563#endif
7564#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007565 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007566#endif
7567#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007568 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007569#endif
7570#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007571 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007572#endif
7573#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007574 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007575#endif
7576#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007577 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007578#endif
7579#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007580 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007581#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007582#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007583 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007584#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007585#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007586 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007587#endif
7588#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007589 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007590#endif
7591#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007592 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#endif
7594#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007595 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007596#endif
7597#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007598 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007599#endif
7600#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007601 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007602#endif
7603#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007604 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007605#endif
7606#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007607 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007608#endif
7609#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007610 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007611#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007612#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007613 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007614#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007615#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007616 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007617#endif
7618#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007619 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007620#endif
7621#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007622 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007623#endif
7624#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007625 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007626#endif
7627#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007628 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007629#endif
7630#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007631 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007632#endif
7633#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007634 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007635#endif
7636#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007637 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007638#endif
7639#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007640 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007641#endif
7642#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007643 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007644#endif
7645#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007646 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007647#endif
7648#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007650#endif
7651#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007652 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007653#endif
7654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007655 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007656#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007657 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007658#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007659 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007660#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007661 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007662#endif
7663#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007664 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007665#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007666 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007667#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007669#endif
7670#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007672#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007673 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007674#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007675 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007676#endif
7677
Christian Heimesfaf2f632008-01-06 16:59:19 +00007678#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007679 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007680 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7681#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007682 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007683#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007684 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007685 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7686#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007687 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007688#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007689 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007690 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007691 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007692 PyObject *tmp;
7693 tmp = PyLong_FromUnsignedLong(codes[i]);
7694 if (tmp == NULL)
7695 return NULL;
7696 PyModule_AddObject(m, names[i], tmp);
7697 }
7698 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007699 PyModule_AddIntMacro(m, RCVALL_OFF);
7700 PyModule_AddIntMacro(m, RCVALL_ON);
7701 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007702#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007703 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007704#endif
7705#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007706 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007707#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007708#endif /* _MSTCPIP_ */
7709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007710 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007711#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007714 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007715}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007716
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007717
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007718#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007719#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007720
7721/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007722/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007723
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007724int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007725inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007727 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007728#if (SIZEOF_INT != 4)
7729#error "Not sure if in_addr_t exists and int is not 32-bits."
7730#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007731 unsigned int packed_addr;
7732 packed_addr = inet_addr(src);
7733 if (packed_addr == INADDR_NONE)
7734 return 0;
7735 memcpy(dst, &packed_addr, 4);
7736 return 1;
7737 }
7738 /* Should set errno to EAFNOSUPPORT */
7739 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007740}
7741
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007742const char *
7743inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007744{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007745 if (af == AF_INET) {
7746 struct in_addr packed_addr;
7747 if (size < 16)
7748 /* Should set errno to ENOSPC. */
7749 return NULL;
7750 memcpy(&packed_addr, src, sizeof(packed_addr));
7751 return strncpy(dst, inet_ntoa(packed_addr), size);
7752 }
7753 /* Should set errno to EAFNOSUPPORT */
7754 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007755}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007756
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007757#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007758#endif