blob: f3654c97e76ce910f655e46c2cc14a2ab4a28b60 [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 */
1191 Py_INCREF(Py_None);
1192 return Py_None;
1193 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 case AF_INET:
1198 {
1199 struct sockaddr_in *a;
1200 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1201 PyObject *ret = NULL;
1202 if (addrobj) {
1203 a = (struct sockaddr_in *)addr;
1204 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1205 Py_DECREF(addrobj);
1206 }
1207 return ret;
1208 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001209
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001210#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 case AF_UNIX:
1212 {
1213 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001214#ifdef __linux__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1216 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001217 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 }
1219 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001220#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 {
1222 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001223 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 }
1225 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001226#endif /* AF_UNIX */
1227
Martin v. Löwis11017b12006-01-14 18:12:57 +00001228#if defined(AF_NETLINK)
1229 case AF_NETLINK:
1230 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1232 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001233 }
1234#endif /* AF_NETLINK */
1235
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001236#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 case AF_INET6:
1238 {
1239 struct sockaddr_in6 *a;
1240 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1241 PyObject *ret = NULL;
1242 if (addrobj) {
1243 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001244 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 addrobj,
1246 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001247 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 a->sin6_scope_id);
1249 Py_DECREF(addrobj);
1250 }
1251 return ret;
1252 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001253#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001254
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 case AF_BLUETOOTH:
1257 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 case BTPROTO_L2CAP:
1260 {
1261 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1262 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1263 PyObject *ret = NULL;
1264 if (addrobj) {
1265 ret = Py_BuildValue("Oi",
1266 addrobj,
1267 _BT_L2_MEMB(a, psm));
1268 Py_DECREF(addrobj);
1269 }
1270 return ret;
1271 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 case BTPROTO_RFCOMM:
1274 {
1275 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1276 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1277 PyObject *ret = NULL;
1278 if (addrobj) {
1279 ret = Py_BuildValue("Oi",
1280 addrobj,
1281 _BT_RC_MEMB(a, channel));
1282 Py_DECREF(addrobj);
1283 }
1284 return ret;
1285 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 case BTPROTO_HCI:
1288 {
1289 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001290#if defined(__NetBSD__) || defined(__DragonFly__)
1291 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1292#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 PyObject *ret = NULL;
1294 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1295 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001298
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001299#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 case BTPROTO_SCO:
1301 {
1302 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1303 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1304 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001305#endif
1306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 default:
1308 PyErr_SetString(PyExc_ValueError,
1309 "Unknown Bluetooth protocol");
1310 return NULL;
1311 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001312#endif
1313
Antoine Pitroub156a462010-10-27 20:13:57 +00001314#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001315 case AF_PACKET:
1316 {
1317 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1318 char *ifname = "";
1319 struct ifreq ifr;
1320 /* need to look up interface name give index */
1321 if (a->sll_ifindex) {
1322 ifr.ifr_ifindex = a->sll_ifindex;
1323 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1324 ifname = ifr.ifr_name;
1325 }
1326 return Py_BuildValue("shbhy#",
1327 ifname,
1328 ntohs(a->sll_protocol),
1329 a->sll_pkttype,
1330 a->sll_hatype,
1331 a->sll_addr,
1332 a->sll_halen);
1333 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001334#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001335
Christian Heimes043d6f62008-01-07 17:19:16 +00001336#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 case AF_TIPC:
1338 {
1339 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1340 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1341 return Py_BuildValue("IIIII",
1342 a->addrtype,
1343 a->addr.nameseq.type,
1344 a->addr.nameseq.lower,
1345 a->addr.nameseq.upper,
1346 a->scope);
1347 } else if (a->addrtype == TIPC_ADDR_NAME) {
1348 return Py_BuildValue("IIIII",
1349 a->addrtype,
1350 a->addr.name.name.type,
1351 a->addr.name.name.instance,
1352 a->addr.name.name.instance,
1353 a->scope);
1354 } else if (a->addrtype == TIPC_ADDR_ID) {
1355 return Py_BuildValue("IIIII",
1356 a->addrtype,
1357 a->addr.id.node,
1358 a->addr.id.ref,
1359 0,
1360 a->scope);
1361 } else {
1362 PyErr_SetString(PyExc_ValueError,
1363 "Invalid address type");
1364 return NULL;
1365 }
1366 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001367#endif
1368
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001369#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001370 case AF_CAN:
1371 {
1372 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1373 char *ifname = "";
1374 struct ifreq ifr;
1375 /* need to look up interface name given index */
1376 if (a->can_ifindex) {
1377 ifr.ifr_ifindex = a->can_ifindex;
1378 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1379 ifname = ifr.ifr_name;
1380 }
1381
1382 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1383 ifname,
1384 a->can_family);
1385 }
1386#endif
1387
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001388#ifdef PF_SYSTEM
1389 case PF_SYSTEM:
1390 switch(proto) {
1391#ifdef SYSPROTO_CONTROL
1392 case SYSPROTO_CONTROL:
1393 {
1394 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1395 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1396 }
1397#endif
1398 default:
1399 PyErr_SetString(PyExc_ValueError,
1400 "Invalid address type");
1401 return 0;
1402 }
1403#endif
1404
Christian Heimesdffa3942016-09-05 23:54:41 +02001405#ifdef HAVE_SOCKADDR_ALG
1406 case AF_ALG:
1407 {
1408 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1409 return Py_BuildValue("s#s#HH",
1410 a->salg_type,
1411 strnlen((const char*)a->salg_type,
1412 sizeof(a->salg_type)),
1413 a->salg_name,
1414 strnlen((const char*)a->salg_name,
1415 sizeof(a->salg_name)),
1416 a->salg_feat,
1417 a->salg_mask);
1418 }
1419#endif
1420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001423 default:
1424 /* If we don't know the address family, don't raise an
1425 exception -- return it as an (int, bytes) tuple. */
1426 return Py_BuildValue("iy#",
1427 addr->sa_family,
1428 addr->sa_data,
1429 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001432}
1433
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001434/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1435 (in particular, numeric IP addresses). */
1436struct maybe_idna {
1437 PyObject *obj;
1438 char *buf;
1439};
1440
1441static void
1442idna_cleanup(struct maybe_idna *data)
1443{
1444 Py_CLEAR(data->obj);
1445}
1446
1447static int
1448idna_converter(PyObject *obj, struct maybe_idna *data)
1449{
1450 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001451 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001452 if (obj == NULL) {
1453 idna_cleanup(data);
1454 return 1;
1455 }
1456 data->obj = NULL;
1457 len = -1;
1458 if (PyBytes_Check(obj)) {
1459 data->buf = PyBytes_AsString(obj);
1460 len = PyBytes_Size(obj);
1461 }
1462 else if (PyByteArray_Check(obj)) {
1463 data->buf = PyByteArray_AsString(obj);
1464 len = PyByteArray_Size(obj);
1465 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001466 else if (PyUnicode_Check(obj)) {
1467 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1468 data->buf = PyUnicode_DATA(obj);
1469 len = PyUnicode_GET_LENGTH(obj);
1470 }
1471 else {
1472 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1473 if (!obj2) {
1474 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1475 return 0;
1476 }
1477 assert(PyBytes_Check(obj2));
1478 data->obj = obj2;
1479 data->buf = PyBytes_AS_STRING(obj2);
1480 len = PyBytes_GET_SIZE(obj2);
1481 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001482 }
1483 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001484 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1485 obj->ob_type->tp_name);
1486 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001487 }
1488 if (strlen(data->buf) != len) {
1489 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001490 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001491 return 0;
1492 }
1493 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001494}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001495
1496/* Parse a socket address argument according to the socket object's
1497 address family. Return 1 if the address was in the proper format,
1498 0 of not. The address is returned through addr_ret, its length
1499 through len_ret. */
1500
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001501static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001502getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001506
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001507#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 case AF_UNIX:
1509 {
1510 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001511 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001512 int retval = 0;
1513
1514 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1515 allow embedded nulls on Linux. */
1516 if (PyUnicode_Check(args)) {
1517 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1518 return 0;
1519 }
1520 else
1521 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001522 if (!PyArg_Parse(args, "y*", &path)) {
1523 Py_DECREF(args);
1524 return retval;
1525 }
1526 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001529#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001530 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001532 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001533 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001535 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 }
1537 }
1538 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001539#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 {
1541 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001542 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001543 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001545 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001547 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 }
1549 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001550 memcpy(addr->sun_path, path.buf, path.len);
1551 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001552 retval = 1;
1553 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001554 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001555 Py_DECREF(args);
1556 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001558#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001559
Martin v. Löwis11017b12006-01-14 18:12:57 +00001560#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 case AF_NETLINK:
1562 {
1563 struct sockaddr_nl* addr;
1564 int pid, groups;
1565 addr = (struct sockaddr_nl *)addr_ret;
1566 if (!PyTuple_Check(args)) {
1567 PyErr_Format(
1568 PyExc_TypeError,
1569 "getsockaddrarg: "
1570 "AF_NETLINK address must be tuple, not %.500s",
1571 Py_TYPE(args)->tp_name);
1572 return 0;
1573 }
1574 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1575 return 0;
1576 addr->nl_family = AF_NETLINK;
1577 addr->nl_pid = pid;
1578 addr->nl_groups = groups;
1579 *len_ret = sizeof(*addr);
1580 return 1;
1581 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001582#endif
1583
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001584#ifdef AF_RDS
1585 case AF_RDS:
1586 /* RDS sockets use sockaddr_in: fall-through */
1587#endif
1588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 case AF_INET:
1590 {
1591 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001592 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 int port, result;
1594 if (!PyTuple_Check(args)) {
1595 PyErr_Format(
1596 PyExc_TypeError,
1597 "getsockaddrarg: "
1598 "AF_INET address must be tuple, not %.500s",
1599 Py_TYPE(args)->tp_name);
1600 return 0;
1601 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001602 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1603 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 return 0;
1605 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001606 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001608 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001609 if (result < 0)
1610 return 0;
1611 if (port < 0 || port > 0xffff) {
1612 PyErr_SetString(
1613 PyExc_OverflowError,
1614 "getsockaddrarg: port must be 0-65535.");
1615 return 0;
1616 }
1617 addr->sin_family = AF_INET;
1618 addr->sin_port = htons((short)port);
1619 *len_ret = sizeof *addr;
1620 return 1;
1621 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001622
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001623#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 case AF_INET6:
1625 {
1626 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001627 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001628 int port, result;
1629 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 flowinfo = scope_id = 0;
1631 if (!PyTuple_Check(args)) {
1632 PyErr_Format(
1633 PyExc_TypeError,
1634 "getsockaddrarg: "
1635 "AF_INET6 address must be tuple, not %.500s",
1636 Py_TYPE(args)->tp_name);
1637 return 0;
1638 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001639 if (!PyArg_ParseTuple(args, "O&i|II",
1640 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 &scope_id)) {
1642 return 0;
1643 }
1644 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001645 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001647 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 if (result < 0)
1649 return 0;
1650 if (port < 0 || port > 0xffff) {
1651 PyErr_SetString(
1652 PyExc_OverflowError,
1653 "getsockaddrarg: port must be 0-65535.");
1654 return 0;
1655 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001656 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001657 PyErr_SetString(
1658 PyExc_OverflowError,
1659 "getsockaddrarg: flowinfo must be 0-1048575.");
1660 return 0;
1661 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 addr->sin6_family = s->sock_family;
1663 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001664 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 addr->sin6_scope_id = scope_id;
1666 *len_ret = sizeof *addr;
1667 return 1;
1668 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001669#endif
1670
Hye-Shik Chang81268602004-02-02 06:05:24 +00001671#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 case AF_BLUETOOTH:
1673 {
1674 switch (s->sock_proto) {
1675 case BTPROTO_L2CAP:
1676 {
1677 struct sockaddr_l2 *addr;
1678 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 addr = (struct sockaddr_l2 *)addr_ret;
1681 memset(addr, 0, sizeof(struct sockaddr_l2));
1682 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1683 if (!PyArg_ParseTuple(args, "si", &straddr,
1684 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001685 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 "wrong format");
1687 return 0;
1688 }
1689 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1690 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001692 *len_ret = sizeof *addr;
1693 return 1;
1694 }
1695 case BTPROTO_RFCOMM:
1696 {
1697 struct sockaddr_rc *addr;
1698 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 addr = (struct sockaddr_rc *)addr_ret;
1701 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1702 if (!PyArg_ParseTuple(args, "si", &straddr,
1703 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001704 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 "wrong format");
1706 return 0;
1707 }
1708 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1709 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 *len_ret = sizeof *addr;
1712 return 1;
1713 }
1714 case BTPROTO_HCI:
1715 {
1716 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001717#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001718 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001719
Alexander Belopolskye239d232010-12-08 23:31:48 +00001720 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001721 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001722 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001723 "wrong format");
1724 return 0;
1725 }
1726 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1727 return 0;
1728#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1730 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001731 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 "wrong format");
1733 return 0;
1734 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 *len_ret = sizeof *addr;
1737 return 1;
1738 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001739#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 case BTPROTO_SCO:
1741 {
1742 struct sockaddr_sco *addr;
1743 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 addr = (struct sockaddr_sco *)addr_ret;
1746 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1747 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001748 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 "wrong format");
1750 return 0;
1751 }
1752 straddr = PyBytes_AS_STRING(args);
1753 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1754 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 *len_ret = sizeof *addr;
1757 return 1;
1758 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001761 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 return 0;
1763 }
1764 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001765#endif
1766
Antoine Pitroub156a462010-10-27 20:13:57 +00001767#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 case AF_PACKET:
1769 {
1770 struct sockaddr_ll* addr;
1771 struct ifreq ifr;
1772 char *interfaceName;
1773 int protoNumber;
1774 int hatype = 0;
1775 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001776 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 if (!PyTuple_Check(args)) {
1779 PyErr_Format(
1780 PyExc_TypeError,
1781 "getsockaddrarg: "
1782 "AF_PACKET address must be tuple, not %.500s",
1783 Py_TYPE(args)->tp_name);
1784 return 0;
1785 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001786 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001788 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 return 0;
1790 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1791 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1792 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1793 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001794 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 return 0;
1796 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001797 if (haddr.buf && haddr.len > 8) {
1798 PyErr_SetString(PyExc_ValueError,
1799 "Hardware address must be 8 bytes or less");
1800 PyBuffer_Release(&haddr);
1801 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 }
1803 if (protoNumber < 0 || protoNumber > 0xffff) {
1804 PyErr_SetString(
1805 PyExc_OverflowError,
1806 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001807 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 return 0;
1809 }
1810 addr = (struct sockaddr_ll*)addr_ret;
1811 addr->sll_family = AF_PACKET;
1812 addr->sll_protocol = htons((short)protoNumber);
1813 addr->sll_ifindex = ifr.ifr_ifindex;
1814 addr->sll_pkttype = pkttype;
1815 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001816 if (haddr.buf) {
1817 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1818 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001820 else
1821 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001823 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 return 1;
1825 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001826#endif
1827
Christian Heimes043d6f62008-01-07 17:19:16 +00001828#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 case AF_TIPC:
1830 {
1831 unsigned int atype, v1, v2, v3;
1832 unsigned int scope = TIPC_CLUSTER_SCOPE;
1833 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 if (!PyTuple_Check(args)) {
1836 PyErr_Format(
1837 PyExc_TypeError,
1838 "getsockaddrarg: "
1839 "AF_TIPC address must be tuple, not %.500s",
1840 Py_TYPE(args)->tp_name);
1841 return 0;
1842 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 if (!PyArg_ParseTuple(args,
1845 "IIII|I;Invalid TIPC address format",
1846 &atype, &v1, &v2, &v3, &scope))
1847 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 addr = (struct sockaddr_tipc *) addr_ret;
1850 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001852 addr->family = AF_TIPC;
1853 addr->scope = scope;
1854 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 if (atype == TIPC_ADDR_NAMESEQ) {
1857 addr->addr.nameseq.type = v1;
1858 addr->addr.nameseq.lower = v2;
1859 addr->addr.nameseq.upper = v3;
1860 } else if (atype == TIPC_ADDR_NAME) {
1861 addr->addr.name.name.type = v1;
1862 addr->addr.name.name.instance = v2;
1863 } else if (atype == TIPC_ADDR_ID) {
1864 addr->addr.id.node = v1;
1865 addr->addr.id.ref = v2;
1866 } else {
1867 /* Shouldn't happen */
1868 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1869 return 0;
1870 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001871
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 return 1;
1875 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001876#endif
1877
Vinay Sajiped6783f2014-03-21 11:44:32 +00001878#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001879 case AF_CAN:
1880 switch (s->sock_proto) {
1881 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001882 /* fall-through */
1883 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001884 {
1885 struct sockaddr_can *addr;
1886 PyObject *interfaceName;
1887 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001888 Py_ssize_t len;
1889
Benjamin Peterson18b71912013-05-16 15:29:44 -05001890 addr = (struct sockaddr_can *)addr_ret;
1891
Charles-François Natali47413c12011-10-06 19:47:44 +02001892 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1893 &interfaceName))
1894 return 0;
1895
1896 len = PyBytes_GET_SIZE(interfaceName);
1897
1898 if (len == 0) {
1899 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001900 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001901 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1902 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001903 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1904 s->errorhandler();
1905 Py_DECREF(interfaceName);
1906 return 0;
1907 }
1908 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001909 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001910 "AF_CAN interface name too long");
1911 Py_DECREF(interfaceName);
1912 return 0;
1913 }
1914
1915 addr->can_family = AF_CAN;
1916 addr->can_ifindex = ifr.ifr_ifindex;
1917
1918 *len_ret = sizeof(*addr);
1919 Py_DECREF(interfaceName);
1920 return 1;
1921 }
1922 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001923 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001924 "getsockaddrarg: unsupported CAN protocol");
1925 return 0;
1926 }
1927#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001928
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001929#ifdef PF_SYSTEM
1930 case PF_SYSTEM:
1931 switch (s->sock_proto) {
1932#ifdef SYSPROTO_CONTROL
1933 case SYSPROTO_CONTROL:
1934 {
1935 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001936
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001937 addr = (struct sockaddr_ctl *)addr_ret;
1938 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001939 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001940
1941 if (PyUnicode_Check(args)) {
1942 struct ctl_info info;
1943 PyObject *ctl_name;
1944
1945 if (!PyArg_Parse(args, "O&",
1946 PyUnicode_FSConverter, &ctl_name)) {
1947 return 0;
1948 }
1949
Victor Stinnerf50e1872015-03-20 11:32:24 +01001950 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001951 PyErr_SetString(PyExc_ValueError,
1952 "provided string is too long");
1953 Py_DECREF(ctl_name);
1954 return 0;
1955 }
1956 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1957 sizeof(info.ctl_name));
1958 Py_DECREF(ctl_name);
1959
1960 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1961 PyErr_SetString(PyExc_OSError,
1962 "cannot find kernel control with provided name");
1963 return 0;
1964 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001965
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001966 addr->sc_id = info.ctl_id;
1967 addr->sc_unit = 0;
1968 } else if (!PyArg_ParseTuple(args, "II",
1969 &(addr->sc_id), &(addr->sc_unit))) {
1970 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1971 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001972
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001973 return 0;
1974 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001975
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001976 *len_ret = sizeof(*addr);
1977 return 1;
1978 }
1979#endif
1980 default:
1981 PyErr_SetString(PyExc_OSError,
1982 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1983 return 0;
1984 }
1985#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02001986#ifdef HAVE_SOCKADDR_ALG
1987 case AF_ALG:
1988 {
1989 struct sockaddr_alg *sa;
1990 char *type;
1991 char *name;
1992 sa = (struct sockaddr_alg *)addr_ret;
1993
1994 memset(sa, 0, sizeof(*sa));
1995 sa->salg_family = AF_ALG;
1996
1997 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
1998 &type, &name, &sa->salg_feat, &sa->salg_mask))
1999 return 0;
2000 /* sockaddr_alg has fixed-sized char arrays for type and name */
2001 if (strlen(type) > sizeof(sa->salg_type)) {
2002 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2003 return 0;
2004 }
2005 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2006 if (strlen(name) > sizeof(sa->salg_name)) {
2007 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2008 return 0;
2009 }
2010 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2011
2012 *len_ret = sizeof(*sa);
2013 return 1;
2014 }
2015#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002020 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002024}
2025
Guido van Rossum30a685f1991-06-27 15:51:29 +00002026
Guido van Rossum48a680c2001-03-02 06:34:14 +00002027/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002028 Return 1 if the family is known, 0 otherwise. The length is returned
2029 through len_ret. */
2030
2031static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002032getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002035
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002036#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 case AF_UNIX:
2038 {
2039 *len_ret = sizeof (struct sockaddr_un);
2040 return 1;
2041 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002042#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002043
Martin v. Löwis11017b12006-01-14 18:12:57 +00002044#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002045 case AF_NETLINK:
2046 {
2047 *len_ret = sizeof (struct sockaddr_nl);
2048 return 1;
2049 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002050#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002051
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002052#ifdef AF_RDS
2053 case AF_RDS:
2054 /* RDS sockets use sockaddr_in: fall-through */
2055#endif
2056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 case AF_INET:
2058 {
2059 *len_ret = sizeof (struct sockaddr_in);
2060 return 1;
2061 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002062
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002063#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 case AF_INET6:
2065 {
2066 *len_ret = sizeof (struct sockaddr_in6);
2067 return 1;
2068 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002069#endif
2070
Hye-Shik Chang81268602004-02-02 06:05:24 +00002071#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 case AF_BLUETOOTH:
2073 {
2074 switch(s->sock_proto)
2075 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002077 case BTPROTO_L2CAP:
2078 *len_ret = sizeof (struct sockaddr_l2);
2079 return 1;
2080 case BTPROTO_RFCOMM:
2081 *len_ret = sizeof (struct sockaddr_rc);
2082 return 1;
2083 case BTPROTO_HCI:
2084 *len_ret = sizeof (struct sockaddr_hci);
2085 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002086#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 case BTPROTO_SCO:
2088 *len_ret = sizeof (struct sockaddr_sco);
2089 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002092 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002093 "unknown BT protocol");
2094 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 }
2097 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002098#endif
2099
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002100#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 case AF_PACKET:
2102 {
2103 *len_ret = sizeof (struct sockaddr_ll);
2104 return 1;
2105 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002106#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002107
Christian Heimes043d6f62008-01-07 17:19:16 +00002108#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 case AF_TIPC:
2110 {
2111 *len_ret = sizeof (struct sockaddr_tipc);
2112 return 1;
2113 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002114#endif
2115
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002116#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002117 case AF_CAN:
2118 {
2119 *len_ret = sizeof (struct sockaddr_can);
2120 return 1;
2121 }
2122#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002123
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002124#ifdef PF_SYSTEM
2125 case PF_SYSTEM:
2126 switch(s->sock_proto) {
2127#ifdef SYSPROTO_CONTROL
2128 case SYSPROTO_CONTROL:
2129 *len_ret = sizeof (struct sockaddr_ctl);
2130 return 1;
2131#endif
2132 default:
2133 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2134 "unknown PF_SYSTEM protocol");
2135 return 0;
2136 }
2137#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002138#ifdef HAVE_SOCKADDR_ALG
2139 case AF_ALG:
2140 {
2141 *len_ret = sizeof (struct sockaddr_alg);
2142 return 1;
2143 }
2144#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002149 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002150 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002153}
2154
2155
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002156/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2157 Currently, these methods are only compiled if the RFC 2292/3542
2158 CMSG_LEN() macro is available. Older systems seem to have used
2159 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2160 it may be possible to define CMSG_LEN() that way if it's not
2161 provided. Some architectures might need extra padding after the
2162 cmsghdr, however, and CMSG_LEN() would have to take account of
2163 this. */
2164#ifdef CMSG_LEN
2165/* If length is in range, set *result to CMSG_LEN(length) and return
2166 true; otherwise, return false. */
2167static int
2168get_CMSG_LEN(size_t length, size_t *result)
2169{
2170 size_t tmp;
2171
2172 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2173 return 0;
2174 tmp = CMSG_LEN(length);
2175 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2176 return 0;
2177 *result = tmp;
2178 return 1;
2179}
2180
2181#ifdef CMSG_SPACE
2182/* If length is in range, set *result to CMSG_SPACE(length) and return
2183 true; otherwise, return false. */
2184static int
2185get_CMSG_SPACE(size_t length, size_t *result)
2186{
2187 size_t tmp;
2188
2189 /* Use CMSG_SPACE(1) here in order to take account of the padding
2190 necessary before *and* after the data. */
2191 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2192 return 0;
2193 tmp = CMSG_SPACE(length);
2194 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2195 return 0;
2196 *result = tmp;
2197 return 1;
2198}
2199#endif
2200
2201/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2202 pointer in msg->msg_control with at least "space" bytes after it,
2203 and its cmsg_len member inside the buffer. */
2204static int
2205cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2206{
2207 size_t cmsg_offset;
2208 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2209 sizeof(cmsgh->cmsg_len));
2210
Charles-François Natali466517d2011-08-28 18:23:43 +02002211 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002212 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002213 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002214 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2215 annoying under OS X as it's unsigned there and so it triggers a
2216 tautological comparison warning under Clang when compared against 0.
2217 Since the check is valid on other platforms, silence the warning under
2218 Clang. */
2219 #ifdef __clang__
2220 #pragma clang diagnostic push
2221 #pragma clang diagnostic ignored "-Wtautological-compare"
2222 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002223 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002224 #pragma GCC diagnostic push
2225 #pragma GCC diagnostic ignored "-Wtype-limits"
2226 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002227 if (msg->msg_controllen < 0)
2228 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002229 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002230 #pragma GCC diagnostic pop
2231 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002232 #ifdef __clang__
2233 #pragma clang diagnostic pop
2234 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002235 if (space < cmsg_len_end)
2236 space = cmsg_len_end;
2237 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2238 return (cmsg_offset <= (size_t)-1 - space &&
2239 cmsg_offset + space <= msg->msg_controllen);
2240}
2241
2242/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2243 *space to number of bytes following it in the buffer and return
2244 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2245 msg->msg_controllen are valid. */
2246static int
2247get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2248{
2249 size_t data_offset;
2250 char *data_ptr;
2251
2252 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2253 return 0;
2254 data_offset = data_ptr - (char *)msg->msg_control;
2255 if (data_offset > msg->msg_controllen)
2256 return 0;
2257 *space = msg->msg_controllen - data_offset;
2258 return 1;
2259}
2260
2261/* If cmsgh is invalid or not contained in the buffer pointed to by
2262 msg->msg_control, return -1. If cmsgh is valid and its associated
2263 data is entirely contained in the buffer, set *data_len to the
2264 length of the associated data and return 0. If only part of the
2265 associated data is contained in the buffer but cmsgh is otherwise
2266 valid, set *data_len to the length contained in the buffer and
2267 return 1. */
2268static int
2269get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2270{
2271 size_t space, cmsg_data_len;
2272
2273 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2274 cmsgh->cmsg_len < CMSG_LEN(0))
2275 return -1;
2276 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2277 if (!get_cmsg_data_space(msg, cmsgh, &space))
2278 return -1;
2279 if (space >= cmsg_data_len) {
2280 *data_len = cmsg_data_len;
2281 return 0;
2282 }
2283 *data_len = space;
2284 return 1;
2285}
2286#endif /* CMSG_LEN */
2287
2288
Victor Stinner31bf2d52015-04-01 21:57:09 +02002289struct sock_accept {
2290 socklen_t *addrlen;
2291 sock_addr_t *addrbuf;
2292 SOCKET_T result;
2293};
2294
2295#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2296/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2297static int accept4_works = -1;
2298#endif
2299
2300static int
2301sock_accept_impl(PySocketSockObject *s, void *data)
2302{
2303 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002304 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2305 socklen_t *paddrlen = ctx->addrlen;
2306#ifdef HAVE_SOCKADDR_ALG
2307 /* AF_ALG does not support accept() with addr and raises
2308 * ECONNABORTED instead. */
2309 if (s->sock_family == AF_ALG) {
2310 addr = NULL;
2311 paddrlen = NULL;
2312 *ctx->addrlen = 0;
2313 }
2314#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002315
2316#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2317 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002318 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002319 SOCK_CLOEXEC);
2320 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2321 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2322 accept4_works = (errno != ENOSYS);
2323 }
2324 }
2325 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002326 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002327#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002328 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002329#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002330
2331#ifdef MS_WINDOWS
2332 return (ctx->result != INVALID_SOCKET);
2333#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002334 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002335#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002336}
2337
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002338/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002339
Guido van Rossum73624e91994-10-10 17:59:00 +00002340static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002341sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002342{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002344 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002345 socklen_t addrlen;
2346 PyObject *sock = NULL;
2347 PyObject *addr = NULL;
2348 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002349 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 if (!getsockaddrlen(s, &addrlen))
2352 return NULL;
2353 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 if (!IS_SELECTABLE(s))
2356 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002357
Victor Stinner31bf2d52015-04-01 21:57:09 +02002358 ctx.addrlen = &addrlen;
2359 ctx.addrbuf = &addrbuf;
2360 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002361 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002362 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002363
Victor Stinnerdaf45552013-08-28 00:53:59 +02002364#ifdef MS_WINDOWS
2365 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2366 PyErr_SetFromWindowsErr(0);
2367 SOCKETCLOSE(newfd);
2368 goto finally;
2369 }
2370#else
2371
2372#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2373 if (!accept4_works)
2374#endif
2375 {
2376 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2377 SOCKETCLOSE(newfd);
2378 goto finally;
2379 }
2380 }
2381#endif
2382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 sock = PyLong_FromSocket_t(newfd);
2384 if (sock == NULL) {
2385 SOCKETCLOSE(newfd);
2386 goto finally;
2387 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002389 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2390 addrlen, s->sock_proto);
2391 if (addr == NULL)
2392 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002395
Guido van Rossum67f7a382002-06-06 21:08:16 +00002396finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 Py_XDECREF(sock);
2398 Py_XDECREF(addr);
2399 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002400}
2401
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002402PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002403"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002404\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002405Wait for an incoming connection. Return a new socket file descriptor\n\
2406representing the connection, and the address of the client.\n\
2407For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002408
Guido van Rossum11ba0942002-06-13 15:07:44 +00002409/* s.setblocking(flag) method. Argument:
2410 False -- non-blocking mode; same as settimeout(0)
2411 True -- blocking mode; same as settimeout(None)
2412*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002413
Guido van Rossum73624e91994-10-10 17:59:00 +00002414static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002415sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002416{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002417 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 block = PyLong_AsLong(arg);
2420 if (block == -1 && PyErr_Occurred())
2421 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002422
Victor Stinner9001d802015-04-06 23:06:01 +02002423 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002424 if (internal_setblocking(s, block) == -1) {
2425 return NULL;
2426 }
2427 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002428}
Guido van Rossume4485b01994-09-07 14:32:49 +00002429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002430PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002431"setblocking(flag)\n\
2432\n\
2433Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002434setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002436
Victor Stinner71694d52015-03-28 01:18:54 +01002437static int
2438socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2439{
2440#ifdef MS_WINDOWS
2441 struct timeval tv;
2442#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002443#ifndef HAVE_POLL
2444 _PyTime_t ms;
2445#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002446 int overflow = 0;
2447
2448 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002449 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002450 return 0;
2451 }
2452
Victor Stinner869e1772015-03-30 03:49:14 +02002453 if (_PyTime_FromSecondsObject(timeout,
2454 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002455 return -1;
2456
2457 if (*timeout < 0) {
2458 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2459 return -1;
2460 }
2461
2462#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002463 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002464#endif
2465#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002466 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2467 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002468#endif
2469 if (overflow) {
2470 PyErr_SetString(PyExc_OverflowError,
2471 "timeout doesn't fit into C timeval");
2472 return -1;
2473 }
2474
2475 return 0;
2476}
2477
Guido van Rossum11ba0942002-06-13 15:07:44 +00002478/* s.settimeout(timeout) method. Argument:
2479 None -- no timeout, blocking mode; same as setblocking(True)
2480 0.0 -- non-blocking mode; same as setblocking(False)
2481 > 0 -- timeout mode; operations time out after timeout seconds
2482 < 0 -- illegal; raises an exception
2483*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002484static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002485sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002486{
Victor Stinner71694d52015-03-28 01:18:54 +01002487 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002488
Victor Stinner71694d52015-03-28 01:18:54 +01002489 if (socket_parse_timeout(&timeout, arg) < 0)
2490 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002493 if (internal_setblocking(s, timeout < 0) == -1) {
2494 return NULL;
2495 }
2496 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002497}
2498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002499PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002500"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002501\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002502Set a timeout on socket operations. 'timeout' can be a float,\n\
2503giving in seconds, or None. Setting a timeout of None disables\n\
2504the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002505Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002506
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002507/* s.gettimeout() method.
2508 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002510sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511{
Victor Stinner71694d52015-03-28 01:18:54 +01002512 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 Py_INCREF(Py_None);
2514 return Py_None;
2515 }
Victor Stinner71694d52015-03-28 01:18:54 +01002516 else {
2517 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2518 return PyFloat_FromDouble(seconds);
2519 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002520}
2521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002522PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002523"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002524\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002525Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002526operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002527operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002528
Guido van Rossumaee08791992-09-08 09:05:33 +00002529/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002530 With an integer third argument, sets an integer optval with optlen=4.
2531 With None as third argument and an integer fourth argument, set
2532 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002533 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002534 use optional built-in module 'struct' to encode the string.
2535*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002536
Guido van Rossum73624e91994-10-10 17:59:00 +00002537static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002538sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 int level;
2541 int optname;
2542 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002543 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002545 unsigned int optlen;
2546 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002547
Christian Heimesdffa3942016-09-05 23:54:41 +02002548 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if (PyArg_ParseTuple(args, "iii:setsockopt",
2550 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002551 res = setsockopt(s->sock_fd, level, optname,
2552 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002553 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002555
2556 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002557 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002558 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2559 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2560 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002561 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002562 NULL, (socklen_t)optlen);
2563 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002565
2566 PyErr_Clear();
2567 /* setsockopt(level, opt, buffer) */
2568 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2569 &level, &optname, &optval))
2570 return NULL;
2571
2572#ifdef MS_WINDOWS
2573 if (optval.len > INT_MAX) {
2574 PyBuffer_Release(&optval);
2575 PyErr_Format(PyExc_OverflowError,
2576 "socket option is larger than %i bytes",
2577 INT_MAX);
2578 return NULL;
2579 }
2580 res = setsockopt(s->sock_fd, level, optname,
2581 optval.buf, (int)optval.len);
2582#else
2583 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2584#endif
2585 PyBuffer_Release(&optval);
2586
2587done:
Victor Stinnercc739322016-03-23 21:35:29 +01002588 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002590 }
2591
2592 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002593}
2594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002595PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002596"setsockopt(level, option, value: int)\n\
2597setsockopt(level, option, value: buffer)\n\
2598setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002599\n\
2600Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002601The value argument can either be an integer, a string buffer, or \n\
2602None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002603
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002604
Guido van Rossumaee08791992-09-08 09:05:33 +00002605/* s.getsockopt() method.
2606 With two arguments, retrieves an integer option.
2607 With a third integer argument, retrieves a string buffer of that size;
2608 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002609
Guido van Rossum73624e91994-10-10 17:59:00 +00002610static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002611sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002612{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 int level;
2614 int optname;
2615 int res;
2616 PyObject *buf;
2617 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002619 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2620 &level, &optname, &buflen))
2621 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002623 if (buflen == 0) {
2624 int flag = 0;
2625 socklen_t flagsize = sizeof flag;
2626 res = getsockopt(s->sock_fd, level, optname,
2627 (void *)&flag, &flagsize);
2628 if (res < 0)
2629 return s->errorhandler();
2630 return PyLong_FromLong(flag);
2631 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002633 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 "getsockopt buflen out of range");
2635 return NULL;
2636 }
2637 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2638 if (buf == NULL)
2639 return NULL;
2640 res = getsockopt(s->sock_fd, level, optname,
2641 (void *)PyBytes_AS_STRING(buf), &buflen);
2642 if (res < 0) {
2643 Py_DECREF(buf);
2644 return s->errorhandler();
2645 }
2646 _PyBytes_Resize(&buf, buflen);
2647 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002648}
2649
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002650PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002651"getsockopt(level, option[, buffersize]) -> value\n\
2652\n\
2653Get a socket option. See the Unix manual for level and option.\n\
2654If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002655string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002656
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002657
Fred Drake728819a2000-07-01 03:40:12 +00002658/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002659
Guido van Rossum73624e91994-10-10 17:59:00 +00002660static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002661sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 sock_addr_t addrbuf;
2664 int addrlen;
2665 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2668 return NULL;
2669 Py_BEGIN_ALLOW_THREADS
2670 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2671 Py_END_ALLOW_THREADS
2672 if (res < 0)
2673 return s->errorhandler();
2674 Py_INCREF(Py_None);
2675 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002676}
2677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002678PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002679"bind(address)\n\
2680\n\
2681Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002682pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002683sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002684
Guido van Rossum30a685f1991-06-27 15:51:29 +00002685
2686/* s.close() method.
2687 Set the file descriptor to -1 so operations tried subsequently
2688 will surely fail. */
2689
Guido van Rossum73624e91994-10-10 17:59:00 +00002690static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002691sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002694 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002695
Victor Stinner19a8e842016-03-21 16:36:48 +01002696 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002697 if (fd != INVALID_SOCKET) {
2698 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002699
2700 /* We do not want to retry upon EINTR: see
2701 http://lwn.net/Articles/576478/ and
2702 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2703 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002705 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002707 if (res < 0) {
2708 return s->errorhandler();
2709 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 }
2711 Py_INCREF(Py_None);
2712 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002713}
2714
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002715PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002716"close()\n\
2717\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002718Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002719
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002720static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002721sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002722{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002723 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002724 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002725 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002726}
2727
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002728PyDoc_STRVAR(detach_doc,
2729"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002730\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002731Close the socket object without closing the underlying file descriptor.\n\
2732The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002733can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002734
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002735static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002736sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002737{
Victor Stinner81c41db2015-04-02 11:50:57 +02002738 int err;
2739 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002740
Victor Stinner81c41db2015-04-02 11:50:57 +02002741 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2742 /* getsockopt() failed */
2743 return 0;
2744 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002745
Victor Stinner81c41db2015-04-02 11:50:57 +02002746 if (err == EISCONN)
2747 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002748 if (err != 0) {
2749 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2750 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002751 return 0;
2752 }
2753 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002754}
2755
2756static int
2757internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2758 int raise)
2759{
2760 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002761
2762 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002764 Py_END_ALLOW_THREADS
2765
Victor Stinner70a46f62015-03-31 22:03:59 +02002766 if (!res) {
2767 /* connect() succeeded, the socket is connected */
2768 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002770
Victor Stinner81c41db2015-04-02 11:50:57 +02002771 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002772
Victor Stinner81c41db2015-04-02 11:50:57 +02002773 /* save error, PyErr_CheckSignals() can replace it */
2774 err = GET_SOCK_ERROR;
2775 if (CHECK_ERRNO(EINTR)) {
2776 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002777 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002778
2779 /* Issue #23618: when connect() fails with EINTR, the connection is
2780 running asynchronously.
2781
2782 If the socket is blocking or has a timeout, wait until the
2783 connection completes, fails or timed out using select(), and then
2784 get the connection status using getsockopt(SO_ERROR).
2785
2786 If the socket is non-blocking, raise InterruptedError. The caller is
2787 responsible to wait until the connection completes, fails or timed
2788 out (it's the case in asyncio for example). */
2789 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2790 }
2791 else {
2792 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2793 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002794 }
2795
Victor Stinner81c41db2015-04-02 11:50:57 +02002796 if (!wait_connect) {
2797 if (raise) {
2798 /* restore error, maybe replaced by PyErr_CheckSignals() */
2799 SET_SOCK_ERROR(err);
2800 s->errorhandler();
2801 return -1;
2802 }
2803 else
2804 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002805 }
2806
Victor Stinner81c41db2015-04-02 11:50:57 +02002807 if (raise) {
2808 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002809 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2810 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002811 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002812 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002813 else {
2814 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002815 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2816 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002817 return err;
2818 }
2819 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002820}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002821
Fred Drake728819a2000-07-01 03:40:12 +00002822/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002823
Guido van Rossum73624e91994-10-10 17:59:00 +00002824static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002825sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002826{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 sock_addr_t addrbuf;
2828 int addrlen;
2829 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2832 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002833
Victor Stinner81c41db2015-04-02 11:50:57 +02002834 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002835 if (res < 0)
2836 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002837
Victor Stinneree699e92015-03-31 21:28:42 +02002838 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002839}
2840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842"connect(address)\n\
2843\n\
2844Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002845is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002846
Guido van Rossum30a685f1991-06-27 15:51:29 +00002847
Fred Drake728819a2000-07-01 03:40:12 +00002848/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002849
2850static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002851sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 sock_addr_t addrbuf;
2854 int addrlen;
2855 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2858 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002859
Victor Stinner81c41db2015-04-02 11:50:57 +02002860 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002861 if (res < 0)
2862 return NULL;
2863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002865}
2866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002867PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002868"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002869\n\
2870This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002871instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002872
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002873
Guido van Rossumed233a51992-06-23 09:07:03 +00002874/* s.fileno() method */
2875
Guido van Rossum73624e91994-10-10 17:59:00 +00002876static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002877sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002878{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002880}
2881
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002882PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002883"fileno() -> integer\n\
2884\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002885Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002886
Guido van Rossumed233a51992-06-23 09:07:03 +00002887
Guido van Rossumc89705d1992-11-26 08:54:07 +00002888/* s.getsockname() method */
2889
Guido van Rossum73624e91994-10-10 17:59:00 +00002890static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002891sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002892{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 sock_addr_t addrbuf;
2894 int res;
2895 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 if (!getsockaddrlen(s, &addrlen))
2898 return NULL;
2899 memset(&addrbuf, 0, addrlen);
2900 Py_BEGIN_ALLOW_THREADS
2901 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2902 Py_END_ALLOW_THREADS
2903 if (res < 0)
2904 return s->errorhandler();
2905 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2906 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002907}
2908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002909PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002910"getsockname() -> address info\n\
2911\n\
2912Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002913info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002914
Guido van Rossumc89705d1992-11-26 08:54:07 +00002915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002917/* s.getpeername() method */
2918
Guido van Rossum73624e91994-10-10 17:59:00 +00002919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002920sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 sock_addr_t addrbuf;
2923 int res;
2924 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 if (!getsockaddrlen(s, &addrlen))
2927 return NULL;
2928 memset(&addrbuf, 0, addrlen);
2929 Py_BEGIN_ALLOW_THREADS
2930 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2931 Py_END_ALLOW_THREADS
2932 if (res < 0)
2933 return s->errorhandler();
2934 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2935 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002936}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002937
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002938PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002939"getpeername() -> address info\n\
2940\n\
2941Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002942info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002943
Guido van Rossumb6775db1994-08-01 11:34:53 +00002944#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002945
2946
Guido van Rossum30a685f1991-06-27 15:51:29 +00002947/* s.listen(n) method */
2948
Guido van Rossum73624e91994-10-10 17:59:00 +00002949static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002950sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002951{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002952 /* We try to choose a default backlog high enough to avoid connection drops
2953 * for common workloads, yet not too high to limit resource usage. */
2954 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002956
Charles-François Natali644b8f52014-05-22 19:45:39 +01002957 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002961 /* To avoid problems on systems that don't allow a negative backlog
2962 * (which doesn't make sense anyway) we force a minimum value of 0. */
2963 if (backlog < 0)
2964 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002965 res = listen(s->sock_fd, backlog);
2966 Py_END_ALLOW_THREADS
2967 if (res < 0)
2968 return s->errorhandler();
2969 Py_INCREF(Py_None);
2970 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002971}
2972
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002973PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002974"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002975\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002976Enable a server to accept connections. If backlog is specified, it must be\n\
2977at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002978unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002979connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002980
Victor Stinner31bf2d52015-04-01 21:57:09 +02002981struct sock_recv {
2982 char *cbuf;
2983 Py_ssize_t len;
2984 int flags;
2985 Py_ssize_t result;
2986};
2987
2988static int
2989sock_recv_impl(PySocketSockObject *s, void *data)
2990{
2991 struct sock_recv *ctx = data;
2992
2993#ifdef MS_WINDOWS
2994 if (ctx->len > INT_MAX)
2995 ctx->len = INT_MAX;
2996 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2997#else
2998 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2999#endif
3000 return (ctx->result >= 0);
3001}
3002
Guido van Rossum82a5c661998-07-07 20:45:43 +00003003
Thomas Wouters477c8d52006-05-27 19:21:47 +00003004/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003005 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003006 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003007 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003008 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003009 * also possible that we return a number of bytes smaller than the request
3010 * bytes.
3011 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003012
Antoine Pitrou19467d22010-08-17 19:33:30 +00003013static Py_ssize_t
3014sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003015{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003016 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 if (!IS_SELECTABLE(s)) {
3019 select_error();
3020 return -1;
3021 }
3022 if (len == 0) {
3023 /* If 0 bytes were requested, do nothing. */
3024 return 0;
3025 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003026
Victor Stinner31bf2d52015-04-01 21:57:09 +02003027 ctx.cbuf = cbuf;
3028 ctx.len = len;
3029 ctx.flags = flags;
3030 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003032
3033 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003034}
3035
Guido van Rossum48a680c2001-03-02 06:34:14 +00003036
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003037/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003038
Guido van Rossum73624e91994-10-10 17:59:00 +00003039static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003040sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003041{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003042 Py_ssize_t recvlen, outlen;
3043 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003045
Antoine Pitrou19467d22010-08-17 19:33:30 +00003046 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003049 if (recvlen < 0) {
3050 PyErr_SetString(PyExc_ValueError,
3051 "negative buffersize in recv");
3052 return NULL;
3053 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 /* Allocate a new string. */
3056 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3057 if (buf == NULL)
3058 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 /* Call the guts */
3061 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3062 if (outlen < 0) {
3063 /* An error occurred, release the string and return an
3064 error. */
3065 Py_DECREF(buf);
3066 return NULL;
3067 }
3068 if (outlen != recvlen) {
3069 /* We did not read as many bytes as we anticipated, resize the
3070 string if possible and be successful. */
3071 _PyBytes_Resize(&buf, outlen);
3072 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003075}
3076
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003077PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003078"recv(buffersize[, flags]) -> data\n\
3079\n\
3080Receive up to buffersize bytes from the socket. For the optional flags\n\
3081argument, see the Unix manual. When no data is available, block until\n\
3082at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003083the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003084
Guido van Rossum30a685f1991-06-27 15:51:29 +00003085
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003086/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003087
Thomas Wouters477c8d52006-05-27 19:21:47 +00003088static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003089sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003092
Antoine Pitrou19467d22010-08-17 19:33:30 +00003093 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 Py_buffer pbuf;
3095 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003096 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003099 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 &pbuf, &recvlen, &flags))
3101 return NULL;
3102 buf = pbuf.buf;
3103 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 if (recvlen < 0) {
3106 PyBuffer_Release(&pbuf);
3107 PyErr_SetString(PyExc_ValueError,
3108 "negative buffersize in recv_into");
3109 return NULL;
3110 }
3111 if (recvlen == 0) {
3112 /* If nbytes was not specified, use the buffer's length */
3113 recvlen = buflen;
3114 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 /* Check if the buffer is large enough */
3117 if (buflen < recvlen) {
3118 PyBuffer_Release(&pbuf);
3119 PyErr_SetString(PyExc_ValueError,
3120 "buffer too small for requested bytes");
3121 return NULL;
3122 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 /* Call the guts */
3125 readlen = sock_recv_guts(s, buf, recvlen, flags);
3126 if (readlen < 0) {
3127 /* Return an error. */
3128 PyBuffer_Release(&pbuf);
3129 return NULL;
3130 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 PyBuffer_Release(&pbuf);
3133 /* Return the number of bytes read. Note that we do not do anything
3134 special here in the case that readlen < recvlen. */
3135 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003136}
3137
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003138PyDoc_STRVAR(recv_into_doc,
3139"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003140\n\
3141A version of recv() that stores its data into a buffer rather than creating \n\
3142a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3143is not specified (or 0), receive up to the size available in the given buffer.\n\
3144\n\
3145See recv() for documentation about the flags.");
3146
Victor Stinner31bf2d52015-04-01 21:57:09 +02003147struct sock_recvfrom {
3148 char* cbuf;
3149 Py_ssize_t len;
3150 int flags;
3151 socklen_t *addrlen;
3152 sock_addr_t *addrbuf;
3153 Py_ssize_t result;
3154};
3155
3156static int
3157sock_recvfrom_impl(PySocketSockObject *s, void *data)
3158{
3159 struct sock_recvfrom *ctx = data;
3160
3161 memset(ctx->addrbuf, 0, *ctx->addrlen);
3162
3163#ifdef MS_WINDOWS
3164 if (ctx->len > INT_MAX)
3165 ctx->len = INT_MAX;
3166 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3167 SAS2SA(ctx->addrbuf), ctx->addrlen);
3168#else
3169 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3170 SAS2SA(ctx->addrbuf), ctx->addrlen);
3171#endif
3172 return (ctx->result >= 0);
3173}
3174
Thomas Wouters477c8d52006-05-27 19:21:47 +00003175
3176/*
Christian Heimes99170a52007-12-19 02:07:34 +00003177 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3178 * into a char buffer. If you have any inc/def ref to do to the objects that
3179 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003180 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003181 * that it is also possible that we return a number of bytes smaller than the
3182 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003183 *
3184 * 'addr' is a return value for the address object. Note that you must decref
3185 * it yourself.
3186 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003187static Py_ssize_t
3188sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003192 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003193 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003197 if (!getsockaddrlen(s, &addrlen))
3198 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003200 if (!IS_SELECTABLE(s)) {
3201 select_error();
3202 return -1;
3203 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003204
Victor Stinner31bf2d52015-04-01 21:57:09 +02003205 ctx.cbuf = cbuf;
3206 ctx.len = len;
3207 ctx.flags = flags;
3208 ctx.addrbuf = &addrbuf;
3209 ctx.addrlen = &addrlen;
3210 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003211 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003212
Victor Stinner31bf2d52015-04-01 21:57:09 +02003213 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3214 s->sock_proto);
3215 if (*addr == NULL)
3216 return -1;
3217
3218 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003219}
3220
3221/* s.recvfrom(nbytes [,flags]) method */
3222
3223static PyObject *
3224sock_recvfrom(PySocketSockObject *s, PyObject *args)
3225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 PyObject *buf = NULL;
3227 PyObject *addr = NULL;
3228 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003229 int flags = 0;
3230 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003231
Antoine Pitrou19467d22010-08-17 19:33:30 +00003232 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003233 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 if (recvlen < 0) {
3236 PyErr_SetString(PyExc_ValueError,
3237 "negative buffersize in recvfrom");
3238 return NULL;
3239 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003241 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3242 if (buf == NULL)
3243 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3246 recvlen, flags, &addr);
3247 if (outlen < 0) {
3248 goto finally;
3249 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003251 if (outlen != recvlen) {
3252 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003253 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003254 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003255 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003256 goto finally;
3257 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003259 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003260
3261finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 Py_XDECREF(buf);
3263 Py_XDECREF(addr);
3264 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003265}
3266
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003267PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003268"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3269\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003270Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003271
Thomas Wouters477c8d52006-05-27 19:21:47 +00003272
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003273/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003274
3275static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003276sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003278 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003279
Antoine Pitrou19467d22010-08-17 19:33:30 +00003280 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003281 Py_buffer pbuf;
3282 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003283 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003285 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003286
Antoine Pitrou19467d22010-08-17 19:33:30 +00003287 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 kwlist, &pbuf,
3289 &recvlen, &flags))
3290 return NULL;
3291 buf = pbuf.buf;
3292 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003294 if (recvlen < 0) {
3295 PyBuffer_Release(&pbuf);
3296 PyErr_SetString(PyExc_ValueError,
3297 "negative buffersize in recvfrom_into");
3298 return NULL;
3299 }
3300 if (recvlen == 0) {
3301 /* If nbytes was not specified, use the buffer's length */
3302 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003303 } else if (recvlen > buflen) {
3304 PyBuffer_Release(&pbuf);
3305 PyErr_SetString(PyExc_ValueError,
3306 "nbytes is greater than the length of the buffer");
3307 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3311 if (readlen < 0) {
3312 PyBuffer_Release(&pbuf);
3313 /* Return an error */
3314 Py_XDECREF(addr);
3315 return NULL;
3316 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 PyBuffer_Release(&pbuf);
3319 /* Return the number of bytes read and the address. Note that we do
3320 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003321 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003322}
3323
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003324PyDoc_STRVAR(recvfrom_into_doc,
3325"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003326\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003327Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003328
Victor Stinner35bee932015-04-02 12:28:07 +02003329/* The sendmsg() and recvmsg[_into]() methods require a working
3330 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3331#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003332struct sock_recvmsg {
3333 struct msghdr *msg;
3334 int flags;
3335 ssize_t result;
3336};
3337
3338static int
3339sock_recvmsg_impl(PySocketSockObject *s, void *data)
3340{
3341 struct sock_recvmsg *ctx = data;
3342
3343 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3344 return (ctx->result >= 0);
3345}
3346
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003347/*
3348 * Call recvmsg() with the supplied iovec structures, flags, and
3349 * ancillary data buffer size (controllen). Returns the tuple return
3350 * value for recvmsg() or recvmsg_into(), with the first item provided
3351 * by the supplied makeval() function. makeval() will be called with
3352 * the length read and makeval_data as arguments, and must return a
3353 * new reference (which will be decrefed if there is a subsequent
3354 * error). On error, closes any file descriptors received via
3355 * SCM_RIGHTS.
3356 */
3357static PyObject *
3358sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3359 int flags, Py_ssize_t controllen,
3360 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3361{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003362 sock_addr_t addrbuf;
3363 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003364 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003365 PyObject *cmsg_list = NULL, *retval = NULL;
3366 void *controlbuf = NULL;
3367 struct cmsghdr *cmsgh;
3368 size_t cmsgdatalen = 0;
3369 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003370 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003371
3372 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3373 ignored" when the socket is connected (Linux fills them in
3374 anyway for AF_UNIX sockets at least). Normally msg_namelen
3375 seems to be set to 0 if there's no address, but try to
3376 initialize msg_name to something that won't be mistaken for a
3377 real address if that doesn't happen. */
3378 if (!getsockaddrlen(s, &addrbuflen))
3379 return NULL;
3380 memset(&addrbuf, 0, addrbuflen);
3381 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3382
3383 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3384 PyErr_SetString(PyExc_ValueError,
3385 "invalid ancillary data buffer length");
3386 return NULL;
3387 }
3388 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3389 return PyErr_NoMemory();
3390
3391 /* Make the system call. */
3392 if (!IS_SELECTABLE(s)) {
3393 select_error();
3394 goto finally;
3395 }
3396
Victor Stinner31bf2d52015-04-01 21:57:09 +02003397 msg.msg_name = SAS2SA(&addrbuf);
3398 msg.msg_namelen = addrbuflen;
3399 msg.msg_iov = iov;
3400 msg.msg_iovlen = iovlen;
3401 msg.msg_control = controlbuf;
3402 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003403
Victor Stinner31bf2d52015-04-01 21:57:09 +02003404 ctx.msg = &msg;
3405 ctx.flags = flags;
3406 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003407 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003408
3409 /* Make list of (level, type, data) tuples from control messages. */
3410 if ((cmsg_list = PyList_New(0)) == NULL)
3411 goto err_closefds;
3412 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3413 implementations didn't do so. */
3414 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3415 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3416 PyObject *bytes, *tuple;
3417 int tmp;
3418
3419 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3420 if (cmsg_status != 0) {
3421 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3422 "received malformed or improperly-truncated "
3423 "ancillary data", 1) == -1)
3424 goto err_closefds;
3425 }
3426 if (cmsg_status < 0)
3427 break;
3428 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003429 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003430 goto err_closefds;
3431 }
3432
3433 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3434 cmsgdatalen);
3435 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3436 (int)cmsgh->cmsg_type, bytes);
3437 if (tuple == NULL)
3438 goto err_closefds;
3439 tmp = PyList_Append(cmsg_list, tuple);
3440 Py_DECREF(tuple);
3441 if (tmp != 0)
3442 goto err_closefds;
3443
3444 if (cmsg_status != 0)
3445 break;
3446 }
3447
3448 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003449 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450 cmsg_list,
3451 (int)msg.msg_flags,
3452 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3453 ((msg.msg_namelen > addrbuflen) ?
3454 addrbuflen : msg.msg_namelen),
3455 s->sock_proto));
3456 if (retval == NULL)
3457 goto err_closefds;
3458
3459finally:
3460 Py_XDECREF(cmsg_list);
3461 PyMem_Free(controlbuf);
3462 return retval;
3463
3464err_closefds:
3465#ifdef SCM_RIGHTS
3466 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3467 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3468 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3469 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3470 if (cmsg_status < 0)
3471 break;
3472 if (cmsgh->cmsg_level == SOL_SOCKET &&
3473 cmsgh->cmsg_type == SCM_RIGHTS) {
3474 size_t numfds;
3475 int *fdp;
3476
3477 numfds = cmsgdatalen / sizeof(int);
3478 fdp = (int *)CMSG_DATA(cmsgh);
3479 while (numfds-- > 0)
3480 close(*fdp++);
3481 }
3482 if (cmsg_status != 0)
3483 break;
3484 }
3485#endif /* SCM_RIGHTS */
3486 goto finally;
3487}
3488
3489
3490static PyObject *
3491makeval_recvmsg(ssize_t received, void *data)
3492{
3493 PyObject **buf = data;
3494
3495 if (received < PyBytes_GET_SIZE(*buf))
3496 _PyBytes_Resize(buf, received);
3497 Py_XINCREF(*buf);
3498 return *buf;
3499}
3500
3501/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3502
3503static PyObject *
3504sock_recvmsg(PySocketSockObject *s, PyObject *args)
3505{
3506 Py_ssize_t bufsize, ancbufsize = 0;
3507 int flags = 0;
3508 struct iovec iov;
3509 PyObject *buf = NULL, *retval = NULL;
3510
3511 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3512 return NULL;
3513
3514 if (bufsize < 0) {
3515 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3516 return NULL;
3517 }
3518 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3519 return NULL;
3520 iov.iov_base = PyBytes_AS_STRING(buf);
3521 iov.iov_len = bufsize;
3522
3523 /* Note that we're passing a pointer to *our pointer* to the bytes
3524 object here (&buf); makeval_recvmsg() may incref the object, or
3525 deallocate it and set our pointer to NULL. */
3526 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3527 &makeval_recvmsg, &buf);
3528 Py_XDECREF(buf);
3529 return retval;
3530}
3531
3532PyDoc_STRVAR(recvmsg_doc,
3533"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3534\n\
3535Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3536socket. The ancbufsize argument sets the size in bytes of the\n\
3537internal buffer used to receive the ancillary data; it defaults to 0,\n\
3538meaning that no ancillary data will be received. Appropriate buffer\n\
3539sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3540CMSG_LEN(), and items which do not fit into the buffer might be\n\
3541truncated or discarded. The flags argument defaults to 0 and has the\n\
3542same meaning as for recv().\n\
3543\n\
3544The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3545The data item is a bytes object holding the non-ancillary data\n\
3546received. The ancdata item is a list of zero or more tuples\n\
3547(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3548(control messages) received: cmsg_level and cmsg_type are integers\n\
3549specifying the protocol level and protocol-specific type respectively,\n\
3550and cmsg_data is a bytes object holding the associated data. The\n\
3551msg_flags item is the bitwise OR of various flags indicating\n\
3552conditions on the received message; see your system documentation for\n\
3553details. If the receiving socket is unconnected, address is the\n\
3554address of the sending socket, if available; otherwise, its value is\n\
3555unspecified.\n\
3556\n\
3557If recvmsg() raises an exception after the system call returns, it\n\
3558will first attempt to close any file descriptors received via the\n\
3559SCM_RIGHTS mechanism.");
3560
3561
3562static PyObject *
3563makeval_recvmsg_into(ssize_t received, void *data)
3564{
3565 return PyLong_FromSsize_t(received);
3566}
3567
3568/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3569
3570static PyObject *
3571sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3572{
3573 Py_ssize_t ancbufsize = 0;
3574 int flags = 0;
3575 struct iovec *iovs = NULL;
3576 Py_ssize_t i, nitems, nbufs = 0;
3577 Py_buffer *bufs = NULL;
3578 PyObject *buffers_arg, *fast, *retval = NULL;
3579
3580 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3581 &buffers_arg, &ancbufsize, &flags))
3582 return NULL;
3583
3584 if ((fast = PySequence_Fast(buffers_arg,
3585 "recvmsg_into() argument 1 must be an "
3586 "iterable")) == NULL)
3587 return NULL;
3588 nitems = PySequence_Fast_GET_SIZE(fast);
3589 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003590 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003591 goto finally;
3592 }
3593
3594 /* Fill in an iovec for each item, and save the Py_buffer
3595 structs to release afterwards. */
3596 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3597 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3598 PyErr_NoMemory();
3599 goto finally;
3600 }
3601 for (; nbufs < nitems; nbufs++) {
3602 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3603 "w*;recvmsg_into() argument 1 must be an iterable "
3604 "of single-segment read-write buffers",
3605 &bufs[nbufs]))
3606 goto finally;
3607 iovs[nbufs].iov_base = bufs[nbufs].buf;
3608 iovs[nbufs].iov_len = bufs[nbufs].len;
3609 }
3610
3611 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3612 &makeval_recvmsg_into, NULL);
3613finally:
3614 for (i = 0; i < nbufs; i++)
3615 PyBuffer_Release(&bufs[i]);
3616 PyMem_Free(bufs);
3617 PyMem_Free(iovs);
3618 Py_DECREF(fast);
3619 return retval;
3620}
3621
3622PyDoc_STRVAR(recvmsg_into_doc,
3623"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3624\n\
3625Receive normal data and ancillary data from the socket, scattering the\n\
3626non-ancillary data into a series of buffers. The buffers argument\n\
3627must be an iterable of objects that export writable buffers\n\
3628(e.g. bytearray objects); these will be filled with successive chunks\n\
3629of the non-ancillary data until it has all been written or there are\n\
3630no more buffers. The ancbufsize argument sets the size in bytes of\n\
3631the internal buffer used to receive the ancillary data; it defaults to\n\
36320, meaning that no ancillary data will be received. Appropriate\n\
3633buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3634or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3635truncated or discarded. The flags argument defaults to 0 and has the\n\
3636same meaning as for recv().\n\
3637\n\
3638The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3639The nbytes item is the total number of bytes of non-ancillary data\n\
3640written into the buffers. The ancdata item is a list of zero or more\n\
3641tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3642data (control messages) received: cmsg_level and cmsg_type are\n\
3643integers specifying the protocol level and protocol-specific type\n\
3644respectively, and cmsg_data is a bytes object holding the associated\n\
3645data. The msg_flags item is the bitwise OR of various flags\n\
3646indicating conditions on the received message; see your system\n\
3647documentation for details. If the receiving socket is unconnected,\n\
3648address is the address of the sending socket, if available; otherwise,\n\
3649its value is unspecified.\n\
3650\n\
3651If recvmsg_into() raises an exception after the system call returns,\n\
3652it will first attempt to close any file descriptors received via the\n\
3653SCM_RIGHTS mechanism.");
3654#endif /* CMSG_LEN */
3655
3656
Victor Stinner31bf2d52015-04-01 21:57:09 +02003657struct sock_send {
3658 char *buf;
3659 Py_ssize_t len;
3660 int flags;
3661 Py_ssize_t result;
3662};
3663
3664static int
3665sock_send_impl(PySocketSockObject *s, void *data)
3666{
3667 struct sock_send *ctx = data;
3668
3669#ifdef MS_WINDOWS
3670 if (ctx->len > INT_MAX)
3671 ctx->len = INT_MAX;
3672 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3673#else
3674 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3675#endif
3676 return (ctx->result >= 0);
3677}
3678
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003679/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003680
Guido van Rossum73624e91994-10-10 17:59:00 +00003681static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003682sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003683{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003684 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003685 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003686 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3689 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 if (!IS_SELECTABLE(s)) {
3692 PyBuffer_Release(&pbuf);
3693 return select_error();
3694 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003695 ctx.buf = pbuf.buf;
3696 ctx.len = pbuf.len;
3697 ctx.flags = flags;
3698 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003699 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 return NULL;
3701 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003702 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003703
3704 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003705}
3706
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003707PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003708"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003709\n\
3710Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003711argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003712sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003713
3714
3715/* s.sendall(data [,flags]) method */
3716
3717static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003718sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003721 Py_ssize_t len, n;
3722 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003723 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003724 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003725 int has_timeout = (s->sock_timeout > 0);
3726 _PyTime_t interval = s->sock_timeout;
3727 _PyTime_t deadline = 0;
3728 int deadline_initialized = 0;
3729 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003731 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3732 return NULL;
3733 buf = pbuf.buf;
3734 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 if (!IS_SELECTABLE(s)) {
3737 PyBuffer_Release(&pbuf);
3738 return select_error();
3739 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003742 if (has_timeout) {
3743 if (deadline_initialized) {
3744 /* recompute the timeout */
3745 interval = deadline - _PyTime_GetMonotonicClock();
3746 }
3747 else {
3748 deadline_initialized = 1;
3749 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3750 }
3751
3752 if (interval <= 0) {
3753 PyErr_SetString(socket_timeout, "timed out");
3754 goto done;
3755 }
3756 }
3757
Victor Stinner02f32ab2015-04-01 22:53:26 +02003758 ctx.buf = buf;
3759 ctx.len = len;
3760 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003761 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3762 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003763 n = ctx.result;
3764 assert(n >= 0);
3765
3766 buf += n;
3767 len -= n;
3768
3769 /* We must run our signal handlers before looping again.
3770 send() can return a successful partial write when it is
3771 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003772 if (PyErr_CheckSignals())
3773 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003774 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003776
Victor Stinner8912d142015-04-06 23:16:34 +02003777 Py_INCREF(Py_None);
3778 res = Py_None;
3779
3780done:
3781 PyBuffer_Release(&pbuf);
3782 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003783}
3784
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003785PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003786"sendall(data[, flags])\n\
3787\n\
3788Send a data string to the socket. For the optional flags\n\
3789argument, see the Unix manual. This calls send() repeatedly\n\
3790until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003791to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003792
Guido van Rossum30a685f1991-06-27 15:51:29 +00003793
Victor Stinner31bf2d52015-04-01 21:57:09 +02003794struct sock_sendto {
3795 char *buf;
3796 Py_ssize_t len;
3797 int flags;
3798 int addrlen;
3799 sock_addr_t *addrbuf;
3800 Py_ssize_t result;
3801};
3802
3803static int
3804sock_sendto_impl(PySocketSockObject *s, void *data)
3805{
3806 struct sock_sendto *ctx = data;
3807
3808#ifdef MS_WINDOWS
3809 if (ctx->len > INT_MAX)
3810 ctx->len = INT_MAX;
3811 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3812 SAS2SA(ctx->addrbuf), ctx->addrlen);
3813#else
3814 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3815 SAS2SA(ctx->addrbuf), ctx->addrlen);
3816#endif
3817 return (ctx->result >= 0);
3818}
3819
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003820/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003821
Guido van Rossum73624e91994-10-10 17:59:00 +00003822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003823sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003825 Py_buffer pbuf;
3826 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003827 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003828 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003829 int addrlen, flags;
3830 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003832 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003833 arglen = PyTuple_Size(args);
3834 switch (arglen) {
3835 case 2:
3836 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3837 break;
3838 case 3:
3839 PyArg_ParseTuple(args, "y*iO:sendto",
3840 &pbuf, &flags, &addro);
3841 break;
3842 default:
3843 PyErr_Format(PyExc_TypeError,
3844 "sendto() takes 2 or 3 arguments (%d given)",
3845 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003846 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003848 if (PyErr_Occurred())
3849 return NULL;
3850
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 if (!IS_SELECTABLE(s)) {
3852 PyBuffer_Release(&pbuf);
3853 return select_error();
3854 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3857 PyBuffer_Release(&pbuf);
3858 return NULL;
3859 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003860
Victor Stinner31bf2d52015-04-01 21:57:09 +02003861 ctx.buf = pbuf.buf;
3862 ctx.len = pbuf.len;
3863 ctx.flags = flags;
3864 ctx.addrlen = addrlen;
3865 ctx.addrbuf = &addrbuf;
3866 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003867 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 return NULL;
3869 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003870 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003871
3872 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003873}
3874
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003875PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003876"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003877\n\
3878Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003879For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003880
Guido van Rossum30a685f1991-06-27 15:51:29 +00003881
Victor Stinner35bee932015-04-02 12:28:07 +02003882/* The sendmsg() and recvmsg[_into]() methods require a working
3883 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3884#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003885struct sock_sendmsg {
3886 struct msghdr *msg;
3887 int flags;
3888 ssize_t result;
3889};
3890
3891static int
Christian Heimesdffa3942016-09-05 23:54:41 +02003892sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
3893 struct msghdr *msg,
3894 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
3895 Py_ssize_t ndataparts, ndatabufs = 0;
3896 int result = -1;
3897 struct iovec *iovs = NULL;
3898 PyObject *data_fast = NULL;
3899 Py_buffer *databufs = NULL;
3900
3901 /* Fill in an iovec for each message part, and save the Py_buffer
3902 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02003903 data_fast = PySequence_Fast(data_arg,
3904 "sendmsg() argument 1 must be an "
3905 "iterable");
3906 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02003907 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003908 }
3909
Christian Heimesdffa3942016-09-05 23:54:41 +02003910 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3911 if (ndataparts > INT_MAX) {
3912 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
3913 goto finally;
3914 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02003915
Christian Heimesdffa3942016-09-05 23:54:41 +02003916 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003917 if (ndataparts > 0) {
3918 iovs = PyMem_New(struct iovec, ndataparts);
3919 if (iovs == NULL) {
3920 PyErr_NoMemory();
3921 goto finally;
3922 }
3923 msg->msg_iov = iovs;
3924
3925 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02003926 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02003927 PyErr_NoMemory();
3928 goto finally;
3929 }
Christian Heimesdffa3942016-09-05 23:54:41 +02003930 }
3931 for (; ndatabufs < ndataparts; ndatabufs++) {
3932 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3933 "y*;sendmsg() argument 1 must be an iterable of "
3934 "bytes-like objects",
3935 &databufs[ndatabufs]))
3936 goto finally;
3937 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3938 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3939 }
3940 result = 0;
3941 finally:
3942 *databufsout = databufs;
3943 *ndatabufsout = ndatabufs;
3944 Py_XDECREF(data_fast);
3945 return result;
3946}
3947
3948static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02003949sock_sendmsg_impl(PySocketSockObject *s, void *data)
3950{
3951 struct sock_sendmsg *ctx = data;
3952
3953 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3954 return (ctx->result >= 0);
3955}
3956
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003957/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3958
3959static PyObject *
3960sock_sendmsg(PySocketSockObject *s, PyObject *args)
3961{
Christian Heimesdffa3942016-09-05 23:54:41 +02003962 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003963 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003964 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003965 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003966 struct cmsginfo {
3967 int level;
3968 int type;
3969 Py_buffer data;
3970 } *cmsgs = NULL;
3971 void *controlbuf = NULL;
3972 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003973 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02003974 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003975 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003976 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977
3978 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02003979 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003980 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02003981 }
3982
3983 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003984
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003985 /* Parse destination address. */
3986 if (addr_arg != NULL && addr_arg != Py_None) {
3987 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3988 goto finally;
3989 msg.msg_name = &addrbuf;
3990 msg.msg_namelen = addrlen;
3991 }
3992
3993 /* Fill in an iovec for each message part, and save the Py_buffer
3994 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02003995 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003996 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003997 }
3998
3999 if (cmsg_arg == NULL)
4000 ncmsgs = 0;
4001 else {
4002 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4003 "sendmsg() argument 2 must be an "
4004 "iterable")) == NULL)
4005 goto finally;
4006 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4007 }
4008
4009#ifndef CMSG_SPACE
4010 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004011 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004012 "sending multiple control messages is not supported "
4013 "on this system");
4014 goto finally;
4015 }
4016#endif
4017 /* Save level, type and Py_buffer for each control message,
4018 and calculate total size. */
4019 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4020 PyErr_NoMemory();
4021 goto finally;
4022 }
4023 controllen = controllen_last = 0;
4024 while (ncmsgbufs < ncmsgs) {
4025 size_t bufsize, space;
4026
4027 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4028 "(iiy*):[sendmsg() ancillary data items]",
4029 &cmsgs[ncmsgbufs].level,
4030 &cmsgs[ncmsgbufs].type,
4031 &cmsgs[ncmsgbufs].data))
4032 goto finally;
4033 bufsize = cmsgs[ncmsgbufs++].data.len;
4034
4035#ifdef CMSG_SPACE
4036 if (!get_CMSG_SPACE(bufsize, &space)) {
4037#else
4038 if (!get_CMSG_LEN(bufsize, &space)) {
4039#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004040 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041 goto finally;
4042 }
4043 controllen += space;
4044 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004045 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004046 goto finally;
4047 }
4048 controllen_last = controllen;
4049 }
4050
4051 /* Construct ancillary data block from control message info. */
4052 if (ncmsgbufs > 0) {
4053 struct cmsghdr *cmsgh = NULL;
4054
Victor Stinner52d61e42016-09-12 11:41:58 +02004055 controlbuf = PyMem_Malloc(controllen);
4056 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004057 PyErr_NoMemory();
4058 goto finally;
4059 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004060 msg.msg_control = controlbuf;
4061
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004062 msg.msg_controllen = controllen;
4063
4064 /* Need to zero out the buffer as a workaround for glibc's
4065 CMSG_NXTHDR() implementation. After getting the pointer to
4066 the next header, it checks its (uninitialized) cmsg_len
4067 member to see if the "message" fits in the buffer, and
4068 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004069 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004070 memset(controlbuf, 0, controllen);
4071
4072 for (i = 0; i < ncmsgbufs; i++) {
4073 size_t msg_len, data_len = cmsgs[i].data.len;
4074 int enough_space = 0;
4075
4076 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4077 if (cmsgh == NULL) {
4078 PyErr_Format(PyExc_RuntimeError,
4079 "unexpected NULL result from %s()",
4080 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4081 goto finally;
4082 }
4083 if (!get_CMSG_LEN(data_len, &msg_len)) {
4084 PyErr_SetString(PyExc_RuntimeError,
4085 "item size out of range for CMSG_LEN()");
4086 goto finally;
4087 }
4088 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4089 size_t space;
4090
4091 cmsgh->cmsg_len = msg_len;
4092 if (get_cmsg_data_space(&msg, cmsgh, &space))
4093 enough_space = (space >= data_len);
4094 }
4095 if (!enough_space) {
4096 PyErr_SetString(PyExc_RuntimeError,
4097 "ancillary data does not fit in calculated "
4098 "space");
4099 goto finally;
4100 }
4101 cmsgh->cmsg_level = cmsgs[i].level;
4102 cmsgh->cmsg_type = cmsgs[i].type;
4103 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4104 }
4105 }
4106
4107 /* Make the system call. */
4108 if (!IS_SELECTABLE(s)) {
4109 select_error();
4110 goto finally;
4111 }
4112
Victor Stinner31bf2d52015-04-01 21:57:09 +02004113 ctx.msg = &msg;
4114 ctx.flags = flags;
4115 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004117
4118 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004119
4120finally:
4121 PyMem_Free(controlbuf);
4122 for (i = 0; i < ncmsgbufs; i++)
4123 PyBuffer_Release(&cmsgs[i].data);
4124 PyMem_Free(cmsgs);
4125 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004126 PyMem_Free(msg.msg_iov);
4127 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004128 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004129 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004130 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004131 return retval;
4132}
4133
4134PyDoc_STRVAR(sendmsg_doc,
4135"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4136\n\
4137Send normal and ancillary data to the socket, gathering the\n\
4138non-ancillary data from a series of buffers and concatenating it into\n\
4139a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004140data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004141The ancdata argument specifies the ancillary data (control messages)\n\
4142as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4143cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4144protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004145is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004146argument defaults to 0 and has the same meaning as for send(). If\n\
4147address is supplied and not None, it sets a destination address for\n\
4148the message. The return value is the number of bytes of non-ancillary\n\
4149data sent.");
4150#endif /* CMSG_LEN */
4151
Christian Heimesdffa3942016-09-05 23:54:41 +02004152#ifdef HAVE_SOCKADDR_ALG
4153static PyObject*
4154sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4155{
4156 PyObject *retval = NULL;
4157
4158 Py_ssize_t i, ndatabufs = 0;
4159 Py_buffer *databufs = NULL;
4160 PyObject *data_arg = NULL;
4161
4162 Py_buffer iv = {NULL, NULL};
4163
4164 PyObject *opobj = NULL;
4165 int op = -1;
4166
4167 PyObject *assoclenobj = NULL;
4168 int assoclen = -1;
4169
4170 unsigned int *uiptr;
4171 int flags = 0;
4172
4173 struct msghdr msg;
4174 struct cmsghdr *header = NULL;
4175 struct af_alg_iv *alg_iv = NULL;
4176 struct sock_sendmsg ctx;
4177 Py_ssize_t controllen;
4178 void *controlbuf = NULL;
4179 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4180
4181 if (self->sock_family != AF_ALG) {
4182 PyErr_SetString(PyExc_OSError,
4183 "algset is only supported for AF_ALG");
4184 return NULL;
4185 }
4186
4187 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4188 "|O$O!y*O!i:sendmsg_afalg", keywords,
4189 &data_arg,
4190 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004191 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004192 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004193 }
4194
4195 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004196
4197 /* op is a required, keyword-only argument >= 0 */
4198 if (opobj != NULL) {
4199 op = _PyLong_AsInt(opobj);
4200 }
4201 if (op < 0) {
4202 /* override exception from _PyLong_AsInt() */
4203 PyErr_SetString(PyExc_TypeError,
4204 "Invalid or missing argument 'op'");
4205 goto finally;
4206 }
4207 /* assoclen is optional but must be >= 0 */
4208 if (assoclenobj != NULL) {
4209 assoclen = _PyLong_AsInt(assoclenobj);
4210 if (assoclen == -1 && PyErr_Occurred()) {
4211 goto finally;
4212 }
4213 if (assoclen < 0) {
4214 PyErr_SetString(PyExc_TypeError,
4215 "assoclen must be positive");
4216 goto finally;
4217 }
4218 }
4219
4220 controllen = CMSG_SPACE(4);
4221 if (iv.buf != NULL) {
4222 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4223 }
4224 if (assoclen >= 0) {
4225 controllen += CMSG_SPACE(4);
4226 }
4227
4228 controlbuf = PyMem_Malloc(controllen);
4229 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004230 PyErr_NoMemory();
4231 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004232 }
4233 memset(controlbuf, 0, controllen);
4234
Christian Heimesdffa3942016-09-05 23:54:41 +02004235 msg.msg_controllen = controllen;
4236 msg.msg_control = controlbuf;
4237
4238 /* Fill in an iovec for each message part, and save the Py_buffer
4239 structs to release afterwards. */
4240 if (data_arg != NULL) {
4241 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4242 goto finally;
4243 }
4244 }
4245
4246 /* set operation to encrypt or decrypt */
4247 header = CMSG_FIRSTHDR(&msg);
4248 if (header == NULL) {
4249 PyErr_SetString(PyExc_RuntimeError,
4250 "unexpected NULL result from CMSG_FIRSTHDR");
4251 goto finally;
4252 }
4253 header->cmsg_level = SOL_ALG;
4254 header->cmsg_type = ALG_SET_OP;
4255 header->cmsg_len = CMSG_LEN(4);
4256 uiptr = (void*)CMSG_DATA(header);
4257 *uiptr = (unsigned int)op;
4258
4259 /* set initialization vector */
4260 if (iv.buf != NULL) {
4261 header = CMSG_NXTHDR(&msg, header);
4262 if (header == NULL) {
4263 PyErr_SetString(PyExc_RuntimeError,
4264 "unexpected NULL result from CMSG_NXTHDR(iv)");
4265 goto finally;
4266 }
4267 header->cmsg_level = SOL_ALG;
4268 header->cmsg_type = ALG_SET_IV;
4269 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4270 alg_iv = (void*)CMSG_DATA(header);
4271 alg_iv->ivlen = iv.len;
4272 memcpy(alg_iv->iv, iv.buf, iv.len);
4273 }
4274
4275 /* set length of associated data for AEAD */
4276 if (assoclen >= 0) {
4277 header = CMSG_NXTHDR(&msg, header);
4278 if (header == NULL) {
4279 PyErr_SetString(PyExc_RuntimeError,
4280 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4281 goto finally;
4282 }
4283 header->cmsg_level = SOL_ALG;
4284 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4285 header->cmsg_len = CMSG_LEN(4);
4286 uiptr = (void*)CMSG_DATA(header);
4287 *uiptr = (unsigned int)assoclen;
4288 }
4289
4290 ctx.msg = &msg;
4291 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004292 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004293 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004294 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004295
4296 retval = PyLong_FromSsize_t(ctx.result);
4297
4298 finally:
4299 PyMem_Free(controlbuf);
4300 if (iv.buf != NULL) {
4301 PyBuffer_Release(&iv);
4302 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004303 PyMem_Free(msg.msg_iov);
4304 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004305 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004306 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004307 PyMem_Free(databufs);
4308 return retval;
4309}
4310
4311PyDoc_STRVAR(sendmsg_afalg_doc,
4312"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4313\n\
4314Set operation mode, IV and length of associated data for an AF_ALG\n\
4315operation socket.");
4316#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004317
Guido van Rossum30a685f1991-06-27 15:51:29 +00004318/* s.shutdown(how) method */
4319
Guido van Rossum73624e91994-10-10 17:59:00 +00004320static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004321sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 int how;
4324 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004325
Serhiy Storchaka78980432013-01-15 01:12:17 +02004326 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 if (how == -1 && PyErr_Occurred())
4328 return NULL;
4329 Py_BEGIN_ALLOW_THREADS
4330 res = shutdown(s->sock_fd, how);
4331 Py_END_ALLOW_THREADS
4332 if (res < 0)
4333 return s->errorhandler();
4334 Py_INCREF(Py_None);
4335 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004336}
4337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004338PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004339"shutdown(flag)\n\
4340\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004341Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4342of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004343
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004344#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004345static PyObject*
4346sock_ioctl(PySocketSockObject *s, PyObject *arg)
4347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 unsigned long cmd = SIO_RCVALL;
4349 PyObject *argO;
4350 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4353 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 switch (cmd) {
4356 case SIO_RCVALL: {
4357 unsigned int option = RCVALL_ON;
4358 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4359 return NULL;
4360 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4361 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4362 return set_error();
4363 }
4364 return PyLong_FromUnsignedLong(recv); }
4365 case SIO_KEEPALIVE_VALS: {
4366 struct tcp_keepalive ka;
4367 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4368 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4369 return NULL;
4370 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4371 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4372 return set_error();
4373 }
4374 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004375#if defined(SIO_LOOPBACK_FAST_PATH)
4376 case SIO_LOOPBACK_FAST_PATH: {
4377 unsigned int option;
4378 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4379 return NULL;
4380 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4381 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4382 return set_error();
4383 }
4384 return PyLong_FromUnsignedLong(recv); }
4385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 default:
4387 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4388 return NULL;
4389 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004390}
4391PyDoc_STRVAR(sock_ioctl_doc,
4392"ioctl(cmd, option) -> long\n\
4393\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004394Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4395SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004396SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4397SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004398#endif
4399
4400#if defined(MS_WINDOWS)
4401static PyObject*
4402sock_share(PySocketSockObject *s, PyObject *arg)
4403{
4404 WSAPROTOCOL_INFO info;
4405 DWORD processId;
4406 int result;
4407
4408 if (!PyArg_ParseTuple(arg, "I", &processId))
4409 return NULL;
4410
4411 Py_BEGIN_ALLOW_THREADS
4412 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4413 Py_END_ALLOW_THREADS
4414 if (result == SOCKET_ERROR)
4415 return set_error();
4416 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4417}
4418PyDoc_STRVAR(sock_share_doc,
4419"share(process_id) -> bytes\n\
4420\n\
4421Share the socket with another process. The target process id\n\
4422must be provided and the resulting bytes object passed to the target\n\
4423process. There the shared socket can be instantiated by calling\n\
4424socket.fromshare().");
4425
Christian Heimesfaf2f632008-01-06 16:59:19 +00004426
4427#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004428
4429/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004430
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004431static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4433 accept_doc},
4434 {"bind", (PyCFunction)sock_bind, METH_O,
4435 bind_doc},
4436 {"close", (PyCFunction)sock_close, METH_NOARGS,
4437 close_doc},
4438 {"connect", (PyCFunction)sock_connect, METH_O,
4439 connect_doc},
4440 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4441 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004442 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4443 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4445 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004446#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 {"getpeername", (PyCFunction)sock_getpeername,
4448 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 {"getsockname", (PyCFunction)sock_getsockname,
4451 METH_NOARGS, getsockname_doc},
4452 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4453 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004454#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4456 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004457#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004458#if defined(MS_WINDOWS)
4459 {"share", (PyCFunction)sock_share, METH_VARARGS,
4460 sock_share_doc},
4461#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004462 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 listen_doc},
4464 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4465 recv_doc},
4466 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4467 recv_into_doc},
4468 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4469 recvfrom_doc},
4470 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4471 recvfrom_into_doc},
4472 {"send", (PyCFunction)sock_send, METH_VARARGS,
4473 send_doc},
4474 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4475 sendall_doc},
4476 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4477 sendto_doc},
4478 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4479 setblocking_doc},
4480 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4481 settimeout_doc},
4482 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4483 gettimeout_doc},
4484 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4485 setsockopt_doc},
4486 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4487 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004488#ifdef CMSG_LEN
4489 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4490 recvmsg_doc},
4491 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4492 recvmsg_into_doc,},
4493 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4494 sendmsg_doc},
4495#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004496#ifdef HAVE_SOCKADDR_ALG
4497 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4498 sendmsg_afalg_doc},
4499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004501};
4502
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004503/* SockObject members */
4504static PyMemberDef sock_memberlist[] = {
4505 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4506 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4507 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004508 {0},
4509};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004510
Victor Stinner71694d52015-03-28 01:18:54 +01004511static PyGetSetDef sock_getsetlist[] = {
4512 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4513 {NULL} /* sentinel */
4514};
4515
Guido van Rossum73624e91994-10-10 17:59:00 +00004516/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004517 First close the file description. */
4518
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004519static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004520sock_finalize(PySocketSockObject *s)
4521{
4522 SOCKET_T fd;
4523 PyObject *error_type, *error_value, *error_traceback;
4524
4525 /* Save the current exception, if any. */
4526 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4527
Victor Stinnerd3afb622016-07-22 17:47:09 +02004528 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004529 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4530 /* Spurious errors can appear at shutdown */
4531 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4532 PyErr_WriteUnraisable((PyObject *)s);
4533 }
4534 }
4535
4536 /* Only close the socket *after* logging the ResourceWarning warning
4537 to allow the logger to call socket methods like
4538 socket.getsockname(). If the socket is closed before, socket
4539 methods fails with the EBADF error. */
4540 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004541 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004542
4543 /* We do not want to retry upon EINTR: see sock_close() */
4544 Py_BEGIN_ALLOW_THREADS
4545 (void) SOCKETCLOSE(fd);
4546 Py_END_ALLOW_THREADS
4547 }
4548
4549 /* Restore the saved exception. */
4550 PyErr_Restore(error_type, error_value, error_traceback);
4551}
4552
4553static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004554sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004555{
Victor Stinner19a8e842016-03-21 16:36:48 +01004556 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4557 return;
4558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004560}
4561
Guido van Rossum30a685f1991-06-27 15:51:29 +00004562
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004564sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004565{
Victor Stinnere254e532014-07-26 14:36:55 +02004566 long sock_fd;
4567 /* On Windows, this test is needed because SOCKET_T is unsigned */
4568 if (s->sock_fd == INVALID_SOCKET) {
4569 sock_fd = -1;
4570 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004571#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004572 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 /* this can occur on Win64, and actually there is a special
4574 ugly printf formatter for decimal pointer length integer
4575 printing, only bother if necessary*/
4576 PyErr_SetString(PyExc_OverflowError,
4577 "no printf formatter to display "
4578 "the socket descriptor in decimal");
4579 return NULL;
4580 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004581#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004582 else
4583 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 return PyUnicode_FromFormat(
4585 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004586 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 s->sock_type,
4588 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004589}
4590
4591
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004592/* Create a new, uninitialized socket object. */
4593
4594static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004595sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004597 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 new = type->tp_alloc(type, 0);
4600 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004601 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004602 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 ((PySocketSockObject *)new)->errorhandler = &set_error;
4604 }
4605 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004606}
4607
4608
4609/* Initialize a new socket object. */
4610
Victor Stinnerdaf45552013-08-28 00:53:59 +02004611#ifdef SOCK_CLOEXEC
4612/* socket() and socketpair() fail with EINVAL on Linux kernel older
4613 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4614static int sock_cloexec_works = -1;
4615#endif
4616
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004617/*ARGSUSED*/
4618static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004619sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 PySocketSockObject *s = (PySocketSockObject *)self;
4622 PyObject *fdobj = NULL;
4623 SOCKET_T fd = INVALID_SOCKET;
4624 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4625 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004626#ifndef MS_WINDOWS
4627#ifdef SOCK_CLOEXEC
4628 int *atomic_flag_works = &sock_cloexec_works;
4629#else
4630 int *atomic_flag_works = NULL;
4631#endif
4632#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4635 "|iiiO:socket", keywords,
4636 &family, &type, &proto, &fdobj))
4637 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004640#ifdef MS_WINDOWS
4641 /* recreate a socket that was duplicated */
4642 if (PyBytes_Check(fdobj)) {
4643 WSAPROTOCOL_INFO info;
4644 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4645 PyErr_Format(PyExc_ValueError,
4646 "socket descriptor string has wrong size, "
4647 "should be %zu bytes.", sizeof(info));
4648 return -1;
4649 }
4650 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4651 Py_BEGIN_ALLOW_THREADS
4652 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4653 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4654 Py_END_ALLOW_THREADS
4655 if (fd == INVALID_SOCKET) {
4656 set_error();
4657 return -1;
4658 }
4659 family = info.iAddressFamily;
4660 type = info.iSocketType;
4661 proto = info.iProtocol;
4662 }
4663 else
4664#endif
4665 {
4666 fd = PyLong_AsSocket_t(fdobj);
4667 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4668 return -1;
4669 if (fd == INVALID_SOCKET) {
4670 PyErr_SetString(PyExc_ValueError,
4671 "can't use invalid socket value");
4672 return -1;
4673 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 }
4675 }
4676 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004677#ifdef MS_WINDOWS
4678 /* Windows implementation */
4679#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4680#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4681#endif
4682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004684 if (support_wsa_no_inherit) {
4685 fd = WSASocket(family, type, proto,
4686 NULL, 0,
4687 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4688 if (fd == INVALID_SOCKET) {
4689 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4690 support_wsa_no_inherit = 0;
4691 fd = socket(family, type, proto);
4692 }
4693 }
4694 else {
4695 fd = socket(family, type, proto);
4696 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 if (fd == INVALID_SOCKET) {
4700 set_error();
4701 return -1;
4702 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004703
4704 if (!support_wsa_no_inherit) {
4705 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4706 closesocket(fd);
4707 PyErr_SetFromWindowsErr(0);
4708 return -1;
4709 }
4710 }
4711#else
4712 /* UNIX */
4713 Py_BEGIN_ALLOW_THREADS
4714#ifdef SOCK_CLOEXEC
4715 if (sock_cloexec_works != 0) {
4716 fd = socket(family, type | SOCK_CLOEXEC, proto);
4717 if (sock_cloexec_works == -1) {
4718 if (fd >= 0) {
4719 sock_cloexec_works = 1;
4720 }
4721 else if (errno == EINVAL) {
4722 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4723 sock_cloexec_works = 0;
4724 fd = socket(family, type, proto);
4725 }
4726 }
4727 }
4728 else
4729#endif
4730 {
4731 fd = socket(family, type, proto);
4732 }
4733 Py_END_ALLOW_THREADS
4734
4735 if (fd == INVALID_SOCKET) {
4736 set_error();
4737 return -1;
4738 }
4739
4740 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4741 SOCKETCLOSE(fd);
4742 return -1;
4743 }
4744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004746 if (init_sockobject(s, fd, family, type, proto) == -1) {
4747 SOCKETCLOSE(fd);
4748 return -1;
4749 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004752
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004753}
4754
4755
Guido van Rossumb6775db1994-08-01 11:34:53 +00004756/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004757
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004758static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4760 "_socket.socket", /* tp_name */
4761 sizeof(PySocketSockObject), /* tp_basicsize */
4762 0, /* tp_itemsize */
4763 (destructor)sock_dealloc, /* tp_dealloc */
4764 0, /* tp_print */
4765 0, /* tp_getattr */
4766 0, /* tp_setattr */
4767 0, /* tp_reserved */
4768 (reprfunc)sock_repr, /* tp_repr */
4769 0, /* tp_as_number */
4770 0, /* tp_as_sequence */
4771 0, /* tp_as_mapping */
4772 0, /* tp_hash */
4773 0, /* tp_call */
4774 0, /* tp_str */
4775 PyObject_GenericGetAttr, /* tp_getattro */
4776 0, /* tp_setattro */
4777 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004778 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4779 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004780 sock_doc, /* tp_doc */
4781 0, /* tp_traverse */
4782 0, /* tp_clear */
4783 0, /* tp_richcompare */
4784 0, /* tp_weaklistoffset */
4785 0, /* tp_iter */
4786 0, /* tp_iternext */
4787 sock_methods, /* tp_methods */
4788 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004789 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 0, /* tp_base */
4791 0, /* tp_dict */
4792 0, /* tp_descr_get */
4793 0, /* tp_descr_set */
4794 0, /* tp_dictoffset */
4795 sock_initobj, /* tp_init */
4796 PyType_GenericAlloc, /* tp_alloc */
4797 sock_new, /* tp_new */
4798 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004799 0, /* tp_is_gc */
4800 0, /* tp_bases */
4801 0, /* tp_mro */
4802 0, /* tp_cache */
4803 0, /* tp_subclasses */
4804 0, /* tp_weaklist */
4805 0, /* tp_del */
4806 0, /* tp_version_tag */
4807 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004808};
4809
Guido van Rossum30a685f1991-06-27 15:51:29 +00004810
Guido van Rossum81194471991-07-27 21:42:02 +00004811/* Python interface to gethostname(). */
4812
4813/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004814static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004815socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004816{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004817#ifdef MS_WINDOWS
4818 /* Don't use winsock's gethostname, as this returns the ANSI
4819 version of the hostname, whereas we need a Unicode string.
4820 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004821 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004822 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004823 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004824 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004825
4826 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004827 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004828
4829 if (GetLastError() != ERROR_MORE_DATA)
4830 return PyErr_SetFromWindowsErr(0);
4831
4832 if (size == 0)
4833 return PyUnicode_New(0, 0);
4834
4835 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4836 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004837 name = PyMem_New(wchar_t, size);
4838 if (!name) {
4839 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004840 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004841 }
Victor Stinner74168972011-11-17 01:11:36 +01004842 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4843 name,
4844 &size))
4845 {
4846 PyMem_Free(name);
4847 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004848 }
Victor Stinner74168972011-11-17 01:11:36 +01004849
4850 result = PyUnicode_FromWideChar(name, size);
4851 PyMem_Free(name);
4852 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004853#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 char buf[1024];
4855 int res;
4856 Py_BEGIN_ALLOW_THREADS
4857 res = gethostname(buf, (int) sizeof buf - 1);
4858 Py_END_ALLOW_THREADS
4859 if (res < 0)
4860 return set_error();
4861 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004862 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004863#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004864}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004866PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004867"gethostname() -> string\n\
4868\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004869Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004870
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004871#ifdef HAVE_SETHOSTNAME
4872PyDoc_STRVAR(sethostname_doc,
4873"sethostname(name)\n\n\
4874Sets the hostname to name.");
4875
4876static PyObject *
4877socket_sethostname(PyObject *self, PyObject *args)
4878{
4879 PyObject *hnobj;
4880 Py_buffer buf;
4881 int res, flag = 0;
4882
Christian Heimesd2774c72013-06-19 02:06:29 +02004883#ifdef _AIX
4884/* issue #18259, not declared in any useful header file */
4885extern int sethostname(const char *, size_t);
4886#endif
4887
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004888 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4889 PyErr_Clear();
4890 if (!PyArg_ParseTuple(args, "O&:sethostname",
4891 PyUnicode_FSConverter, &hnobj))
4892 return NULL;
4893 flag = 1;
4894 }
4895 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4896 if (!res) {
4897 res = sethostname(buf.buf, buf.len);
4898 PyBuffer_Release(&buf);
4899 }
4900 if (flag)
4901 Py_DECREF(hnobj);
4902 if (res)
4903 return set_error();
4904 Py_RETURN_NONE;
4905}
4906#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004907
Guido van Rossum30a685f1991-06-27 15:51:29 +00004908/* Python interface to gethostbyname(name). */
4909
4910/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004911static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004912socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 char *name;
4915 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004916 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004917
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004918 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 return NULL;
4920 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004921 goto finally;
4922 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4923finally:
4924 PyMem_Free(name);
4925 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004926}
4927
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004928PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004929"gethostbyname(host) -> address\n\
4930\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004931Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004932
4933
Victor Stinner72400302016-01-28 15:41:01 +01004934static PyObject*
4935sock_decode_hostname(const char *name)
4936{
4937#ifdef MS_WINDOWS
4938 /* Issue #26227: gethostbyaddr() returns a string encoded
4939 * to the ANSI code page */
4940 return PyUnicode_DecodeFSDefault(name);
4941#else
4942 /* Decode from UTF-8 */
4943 return PyUnicode_FromString(name);
4944#endif
4945}
4946
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004947/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4948
4949static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004950gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 char **pch;
4953 PyObject *rtn_tuple = (PyObject *)NULL;
4954 PyObject *name_list = (PyObject *)NULL;
4955 PyObject *addr_list = (PyObject *)NULL;
4956 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004957 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 if (h == NULL) {
4960 /* Let's get real error message to return */
4961 set_herror(h_errno);
4962 return NULL;
4963 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 if (h->h_addrtype != af) {
4966 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004967 errno = EAFNOSUPPORT;
4968 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 return NULL;
4970 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004974 case AF_INET:
4975 if (alen < sizeof(struct sockaddr_in))
4976 return NULL;
4977 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004978
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004979#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 case AF_INET6:
4981 if (alen < sizeof(struct sockaddr_in6))
4982 return NULL;
4983 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004984#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 if ((name_list = PyList_New(0)) == NULL)
4989 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004991 if ((addr_list = PyList_New(0)) == NULL)
4992 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 /* SF #1511317: h_aliases can be NULL */
4995 if (h->h_aliases) {
4996 for (pch = h->h_aliases; *pch != NULL; pch++) {
4997 int status;
4998 tmp = PyUnicode_FromString(*pch);
4999 if (tmp == NULL)
5000 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005002 status = PyList_Append(name_list, tmp);
5003 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 if (status)
5006 goto err;
5007 }
5008 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5011 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 case AF_INET:
5016 {
5017 struct sockaddr_in sin;
5018 memset(&sin, 0, sizeof(sin));
5019 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005020#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5024 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 if (pch == h->h_addr_list && alen >= sizeof(sin))
5027 memcpy((char *) addr, &sin, sizeof(sin));
5028 break;
5029 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005030
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005031#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 case AF_INET6:
5033 {
5034 struct sockaddr_in6 sin6;
5035 memset(&sin6, 0, sizeof(sin6));
5036 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005037#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5041 tmp = makeipaddr((struct sockaddr *)&sin6,
5042 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5045 memcpy((char *) addr, &sin6, sizeof(sin6));
5046 break;
5047 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005048#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005051 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 "unsupported address family");
5053 return NULL;
5054 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005055
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 if (tmp == NULL)
5057 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 status = PyList_Append(addr_list, tmp);
5060 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005062 if (status)
5063 goto err;
5064 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005065
Victor Stinner72400302016-01-28 15:41:01 +01005066 name = sock_decode_hostname(h->h_name);
5067 if (name == NULL)
5068 goto err;
5069 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005070
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005071 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 Py_XDECREF(name_list);
5073 Py_XDECREF(addr_list);
5074 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005075}
5076
5077
5078/* Python interface to gethostbyname_ex(name). */
5079
5080/*ARGSUSED*/
5081static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005082socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005083{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 char *name;
5085 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005086 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005088 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005089#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005091#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005093#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 char buf[16384];
5095 int buf_len = (sizeof buf) - 1;
5096 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005097#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005098#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005099 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005100#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005101#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005102
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005103 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005105 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005106 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005108#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005109#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005110 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005112#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005114#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 memset((void *) &data, '\0', sizeof(data));
5116 result = gethostbyname_r(name, &hp_allocated, &data);
5117 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005118#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005119#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005120#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005121 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005122#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005123 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005124#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 Py_END_ALLOW_THREADS
5126 /* Some C libraries would require addr.__ss_family instead of
5127 addr.ss_family.
5128 Therefore, we cast the sockaddr_storage into sockaddr to
5129 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005130 sa = SAS2SA(&addr);
5131 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005133#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005135#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005136finally:
5137 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005139}
5140
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005141PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005142"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5143\n\
5144Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005145for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005146
5147
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005148/* Python interface to gethostbyaddr(IP). */
5149
5150/*ARGSUSED*/
5151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005152socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005153{
Charles-François Natali8b759652011-12-23 16:44:51 +01005154 sock_addr_t addr;
5155 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 char *ip_num;
5157 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005158 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005159#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005161#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005163#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 /* glibcs up to 2.10 assume that the buf argument to
5165 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5166 does not ensure. The attribute below instructs the compiler
5167 to maintain this alignment. */
5168 char buf[16384] Py_ALIGNED(8);
5169 int buf_len = (sizeof buf) - 1;
5170 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005171#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005172#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005174#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005175#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 char *ap;
5177 int al;
5178 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005179
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005180 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 return NULL;
5182 af = AF_UNSPEC;
5183 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005184 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 af = sa->sa_family;
5186 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005187 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 switch (af) {
5189 case AF_INET:
5190 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5191 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5192 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005193#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 case AF_INET6:
5195 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5196 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5197 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005200 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005201 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 }
5203 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005204#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005205#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005206 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 &hp_allocated, buf, buf_len,
5208 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005209#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 h = gethostbyaddr_r(ap, al, af,
5211 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005212#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 memset((void *) &data, '\0', sizeof(data));
5214 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5215 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005216#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005217#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005218#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005222#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005224 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005225#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005227#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005228finally:
5229 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005231}
5232
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005233PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005234"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5235\n\
5236Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005237for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005238
Guido van Rossum30a685f1991-06-27 15:51:29 +00005239
5240/* Python interface to getservbyname(name).
5241 This only returns the port number, since the other info is already
5242 known or not useful (like the list of aliases). */
5243
5244/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005245static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005246socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 char *name, *proto=NULL;
5249 struct servent *sp;
5250 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5251 return NULL;
5252 Py_BEGIN_ALLOW_THREADS
5253 sp = getservbyname(name, proto);
5254 Py_END_ALLOW_THREADS
5255 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005256 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 return NULL;
5258 }
5259 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005260}
5261
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005262PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005263"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005264\n\
5265Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005266The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5267otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005268
Guido van Rossum30a685f1991-06-27 15:51:29 +00005269
Barry Warsaw11b91a02004-06-28 00:50:43 +00005270/* Python interface to getservbyport(port).
5271 This only returns the service name, since the other info is already
5272 known or not useful (like the list of aliases). */
5273
5274/*ARGSUSED*/
5275static PyObject *
5276socket_getservbyport(PyObject *self, PyObject *args)
5277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 int port;
5279 char *proto=NULL;
5280 struct servent *sp;
5281 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5282 return NULL;
5283 if (port < 0 || port > 0xffff) {
5284 PyErr_SetString(
5285 PyExc_OverflowError,
5286 "getservbyport: port must be 0-65535.");
5287 return NULL;
5288 }
5289 Py_BEGIN_ALLOW_THREADS
5290 sp = getservbyport(htons((short)port), proto);
5291 Py_END_ALLOW_THREADS
5292 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005293 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 return NULL;
5295 }
5296 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005297}
5298
5299PyDoc_STRVAR(getservbyport_doc,
5300"getservbyport(port[, protocolname]) -> string\n\
5301\n\
5302Return the service name from a port number and protocol name.\n\
5303The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5304otherwise any protocol will match.");
5305
Guido van Rossum3901d851996-12-19 16:35:04 +00005306/* Python interface to getprotobyname(name).
5307 This only returns the protocol number, since the other info is
5308 already known or not useful (like the list of aliases). */
5309
5310/*ARGSUSED*/
5311static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005312socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 char *name;
5315 struct protoent *sp;
5316 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5317 return NULL;
5318 Py_BEGIN_ALLOW_THREADS
5319 sp = getprotobyname(name);
5320 Py_END_ALLOW_THREADS
5321 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005322 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 return NULL;
5324 }
5325 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005326}
5327
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005328PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005329"getprotobyname(name) -> integer\n\
5330\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005331Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005332
Guido van Rossum3901d851996-12-19 16:35:04 +00005333
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005334#ifndef NO_DUP
5335/* dup() function for socket fds */
5336
5337static PyObject *
5338socket_dup(PyObject *self, PyObject *fdobj)
5339{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 SOCKET_T fd, newfd;
5341 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005342#ifdef MS_WINDOWS
5343 WSAPROTOCOL_INFO info;
5344#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 fd = PyLong_AsSocket_t(fdobj);
5347 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5348 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005349
Victor Stinnerdaf45552013-08-28 00:53:59 +02005350#ifdef MS_WINDOWS
5351 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5352 return set_error();
5353
5354 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5355 FROM_PROTOCOL_INFO,
5356 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 if (newfd == INVALID_SOCKET)
5358 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005359
Victor Stinnerdaf45552013-08-28 00:53:59 +02005360 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5361 closesocket(newfd);
5362 PyErr_SetFromWindowsErr(0);
5363 return NULL;
5364 }
5365#else
5366 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5367 newfd = _Py_dup(fd);
5368 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005369 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005370#endif
5371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 newfdobj = PyLong_FromSocket_t(newfd);
5373 if (newfdobj == NULL)
5374 SOCKETCLOSE(newfd);
5375 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005376}
5377
5378PyDoc_STRVAR(dup_doc,
5379"dup(integer) -> integer\n\
5380\n\
5381Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5382sockets; on some platforms os.dup() won't work for socket file descriptors.");
5383#endif
5384
5385
Dave Cole331708b2004-08-09 04:51:41 +00005386#ifdef HAVE_SOCKETPAIR
5387/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005388 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005389 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005390
5391/*ARGSUSED*/
5392static PyObject *
5393socket_socketpair(PyObject *self, PyObject *args)
5394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 PySocketSockObject *s0 = NULL, *s1 = NULL;
5396 SOCKET_T sv[2];
5397 int family, type = SOCK_STREAM, proto = 0;
5398 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005399#ifdef SOCK_CLOEXEC
5400 int *atomic_flag_works = &sock_cloexec_works;
5401#else
5402 int *atomic_flag_works = NULL;
5403#endif
5404 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005405
5406#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005408#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5412 &family, &type, &proto))
5413 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005415 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005416 Py_BEGIN_ALLOW_THREADS
5417#ifdef SOCK_CLOEXEC
5418 if (sock_cloexec_works != 0) {
5419 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5420 if (sock_cloexec_works == -1) {
5421 if (ret >= 0) {
5422 sock_cloexec_works = 1;
5423 }
5424 else if (errno == EINVAL) {
5425 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5426 sock_cloexec_works = 0;
5427 ret = socketpair(family, type, proto, sv);
5428 }
5429 }
5430 }
5431 else
5432#endif
5433 {
5434 ret = socketpair(family, type, proto, sv);
5435 }
5436 Py_END_ALLOW_THREADS
5437
5438 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005440
5441 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5442 goto finally;
5443 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5444 goto finally;
5445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 s0 = new_sockobject(sv[0], family, type, proto);
5447 if (s0 == NULL)
5448 goto finally;
5449 s1 = new_sockobject(sv[1], family, type, proto);
5450 if (s1 == NULL)
5451 goto finally;
5452 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005453
5454finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005455 if (res == NULL) {
5456 if (s0 == NULL)
5457 SOCKETCLOSE(sv[0]);
5458 if (s1 == NULL)
5459 SOCKETCLOSE(sv[1]);
5460 }
5461 Py_XDECREF(s0);
5462 Py_XDECREF(s1);
5463 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005464}
5465
5466PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005467"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005468\n\
5469Create a pair of socket objects from the sockets returned by the platform\n\
5470socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005471The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005472AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005473
5474#endif /* HAVE_SOCKETPAIR */
5475
5476
Guido van Rossum006bf911996-06-12 04:04:55 +00005477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005478socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005482 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5483 return NULL;
5484 }
5485 if (x1 < 0) {
5486 PyErr_SetString(PyExc_OverflowError,
5487 "can't convert negative number to unsigned long");
5488 return NULL;
5489 }
5490 x2 = (unsigned int)ntohs((unsigned short)x1);
5491 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005492}
5493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005494PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005495"ntohs(integer) -> integer\n\
5496\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005497Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005498
5499
Guido van Rossum006bf911996-06-12 04:04:55 +00005500static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005501socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 if (PyLong_Check(arg)) {
5506 x = PyLong_AsUnsignedLong(arg);
5507 if (x == (unsigned long) -1 && PyErr_Occurred())
5508 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005509#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 {
5511 unsigned long y;
5512 /* only want the trailing 32 bits */
5513 y = x & 0xFFFFFFFFUL;
5514 if (y ^ x)
5515 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005516 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005517 x = y;
5518 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005520 }
5521 else
5522 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005523 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005526}
5527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005528PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005529"ntohl(integer) -> integer\n\
5530\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005531Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005532
5533
Guido van Rossum006bf911996-06-12 04:04:55 +00005534static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005535socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5540 return NULL;
5541 }
5542 if (x1 < 0) {
5543 PyErr_SetString(PyExc_OverflowError,
5544 "can't convert negative number to unsigned long");
5545 return NULL;
5546 }
5547 x2 = (unsigned int)htons((unsigned short)x1);
5548 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005549}
5550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005551PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005552"htons(integer) -> integer\n\
5553\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005554Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005555
5556
Guido van Rossum006bf911996-06-12 04:04:55 +00005557static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005558socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005559{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005560 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 if (PyLong_Check(arg)) {
5563 x = PyLong_AsUnsignedLong(arg);
5564 if (x == (unsigned long) -1 && PyErr_Occurred())
5565 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005566#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 {
5568 unsigned long y;
5569 /* only want the trailing 32 bits */
5570 y = x & 0xFFFFFFFFUL;
5571 if (y ^ x)
5572 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005573 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 x = y;
5575 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 }
5578 else
5579 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005580 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 Py_TYPE(arg)->tp_name);
5582 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005583}
5584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005585PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005586"htonl(integer) -> integer\n\
5587\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005588Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005589
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005590/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005592PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005593"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005594\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005595Convert 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 +00005596binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005597
5598static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005599socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005600{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005601#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005603#endif
5604
5605#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005606#if (SIZEOF_INT != 4)
5607#error "Not sure if in_addr_t exists and int is not 32-bits."
5608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 /* Have to use inet_addr() instead */
5610 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005614 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5615 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005616
Tim Peters1df9fdd2003-02-13 03:13:40 +00005617
5618#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005619
5620#ifdef USE_INET_ATON_WEAKLINK
5621 if (inet_aton != NULL) {
5622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 if (inet_aton(ip_addr, &buf))
5624 return PyBytes_FromStringAndSize((char *)(&buf),
5625 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005626
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005627 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 "illegal IP address string passed to inet_aton");
5629 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005630
Thomas Wouters477c8d52006-05-27 19:21:47 +00005631#ifdef USE_INET_ATON_WEAKLINK
5632 } else {
5633#endif
5634
5635#endif
5636
5637#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 /* special-case this address as inet_addr might return INADDR_NONE
5640 * for this */
5641 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005642 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005647 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005648 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005649 "illegal IP address string passed to inet_aton");
5650 return NULL;
5651 }
5652 }
5653 return PyBytes_FromStringAndSize((char *) &packed_addr,
5654 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005655
5656#ifdef USE_INET_ATON_WEAKLINK
5657 }
5658#endif
5659
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005660#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005661}
5662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005663PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005664"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005665\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005666Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005667
5668static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005669socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005670{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005671 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005672 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005673
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005674 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 return NULL;
5676 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005677
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005678 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005679 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005681 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 return NULL;
5683 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005684
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005685 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5686 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005689}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005690
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005691#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005692
5693PyDoc_STRVAR(inet_pton_doc,
5694"inet_pton(af, ip) -> packed IP address string\n\
5695\n\
5696Convert an IP address from string format to a packed string suitable\n\
5697for use with low-level network functions.");
5698
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005699#endif
5700
5701#ifdef HAVE_INET_PTON
5702
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005703static PyObject *
5704socket_inet_pton(PyObject *self, PyObject *args)
5705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005706 int af;
5707 char* ip;
5708 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005709#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005710 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5715 return NULL;
5716 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005717
Martin v. Löwis04697e82004-06-02 12:35:29 +00005718#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005720 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 "can't use AF_INET6, IPv6 is disabled");
5722 return NULL;
5723 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005724#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 retval = inet_pton(af, ip, packed);
5727 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005728 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 return NULL;
5730 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005731 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 "illegal IP address string passed to inet_pton");
5733 return NULL;
5734 } else if (af == AF_INET) {
5735 return PyBytes_FromStringAndSize(packed,
5736 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005737#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 } else if (af == AF_INET6) {
5739 return PyBytes_FromStringAndSize(packed,
5740 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005743 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744 return NULL;
5745 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005746}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005747#elif defined(MS_WINDOWS)
5748
5749static PyObject *
5750socket_inet_pton(PyObject *self, PyObject *args)
5751{
5752 int af;
5753 char* ip;
5754 struct sockaddr_in6 addr;
5755 INT ret, size;
5756
5757 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5758 return NULL;
5759 }
5760
Victor Stinnere990c6e2013-11-16 00:18:58 +01005761 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005762 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5763
5764 if (ret) {
5765 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5766 return NULL;
5767 } else if(af == AF_INET) {
5768 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005769 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005770 sizeof(addr4->sin_addr));
5771 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005772 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005773 sizeof(addr.sin6_addr));
5774 } else {
5775 PyErr_SetString(PyExc_OSError, "unknown address family");
5776 return NULL;
5777 }
5778}
5779
5780#endif
5781
5782#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005783
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005784PyDoc_STRVAR(inet_ntop_doc,
5785"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5786\n\
5787Convert a packed IP address of the given family to string format.");
5788
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005789#endif
5790
5791
5792#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005793static PyObject *
5794socket_inet_ntop(PyObject *self, PyObject *args)
5795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005797 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005799#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005800 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005801#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005803#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5806 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005807
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005808 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005809 return NULL;
5810 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005813 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 PyErr_SetString(PyExc_ValueError,
5815 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005816 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 return NULL;
5818 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005819#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005820 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005821 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 PyErr_SetString(PyExc_ValueError,
5823 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005824 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 return NULL;
5826 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 } else {
5829 PyErr_Format(PyExc_ValueError,
5830 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005831 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 return NULL;
5833 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005834
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005835 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5836 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005838 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 return NULL;
5840 } else {
5841 return PyUnicode_FromString(retval);
5842 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005843}
5844
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005845#elif defined(MS_WINDOWS)
5846
5847static PyObject *
5848socket_inet_ntop(PyObject *self, PyObject *args)
5849{
5850 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005851 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005852 struct sockaddr_in6 addr;
5853 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005854#ifdef ENABLE_IPV6
5855 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5856#else
5857 char ip[INET_ADDRSTRLEN + 1];
5858#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005859
5860 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5861 memset((void *) &ip[0], '\0', sizeof(ip));
5862
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005863 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005864 return NULL;
5865 }
5866
5867 if (af == AF_INET) {
5868 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5869
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005870 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005871 PyErr_SetString(PyExc_ValueError,
5872 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005873 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005874 return NULL;
5875 }
5876 memset(addr4, 0, sizeof(struct sockaddr_in));
5877 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005878 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005879 addrlen = sizeof(struct sockaddr_in);
5880 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005881 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005882 PyErr_SetString(PyExc_ValueError,
5883 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005884 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005885 return NULL;
5886 }
5887
5888 memset(&addr, 0, sizeof(addr));
5889 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005890 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005891 addrlen = sizeof(addr);
5892 } else {
5893 PyErr_Format(PyExc_ValueError,
5894 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005895 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005896 return NULL;
5897 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005898 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005899
5900 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005901 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005902 ip, &retlen);
5903
5904 if (ret) {
5905 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5906 return NULL;
5907 } else {
5908 return PyUnicode_FromString(ip);
5909 }
5910}
5911
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005912#endif /* HAVE_INET_PTON */
5913
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005914/* Python interface to getaddrinfo(host, port). */
5915
5916/*ARGSUSED*/
5917static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005918socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005919{
Victor Stinner77af1722011-05-26 14:05:59 +02005920 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005921 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 struct addrinfo hints, *res;
5923 struct addrinfo *res0 = NULL;
5924 PyObject *hobj = NULL;
5925 PyObject *pobj = (PyObject *)NULL;
5926 char pbuf[30];
5927 char *hptr, *pptr;
5928 int family, socktype, protocol, flags;
5929 int error;
5930 PyObject *all = (PyObject *)NULL;
5931 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005932
Georg Brandl6083a4b2013-10-14 06:51:46 +02005933 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005935 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005936 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 &protocol, &flags)) {
5938 return NULL;
5939 }
5940 if (hobj == Py_None) {
5941 hptr = NULL;
5942 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005943 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 if (!idna)
5945 return NULL;
5946 assert(PyBytes_Check(idna));
5947 hptr = PyBytes_AS_STRING(idna);
5948 } else if (PyBytes_Check(hobj)) {
5949 hptr = PyBytes_AsString(hobj);
5950 } else {
5951 PyErr_SetString(PyExc_TypeError,
5952 "getaddrinfo() argument 1 must be string or None");
5953 return NULL;
5954 }
5955 if (PyLong_CheckExact(pobj)) {
5956 long value = PyLong_AsLong(pobj);
5957 if (value == -1 && PyErr_Occurred())
5958 goto err;
5959 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5960 pptr = pbuf;
5961 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02005962 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005963 if (pptr == NULL)
5964 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005966 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 } else if (pobj == Py_None) {
5968 pptr = (char *)NULL;
5969 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005970 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 goto err;
5972 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005973#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005974 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5975 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005976 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5977 * This workaround avoids a segfault in libsystem.
5978 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005979 pptr = "00";
5980 }
5981#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 memset(&hints, 0, sizeof(hints));
5983 hints.ai_family = family;
5984 hints.ai_socktype = socktype;
5985 hints.ai_protocol = protocol;
5986 hints.ai_flags = flags;
5987 Py_BEGIN_ALLOW_THREADS
5988 ACQUIRE_GETADDRINFO_LOCK
5989 error = getaddrinfo(hptr, pptr, &hints, &res0);
5990 Py_END_ALLOW_THREADS
5991 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5992 if (error) {
5993 set_gaierror(error);
5994 goto err;
5995 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005996
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005997 all = PyList_New(0);
5998 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 goto err;
6000 for (res = res0; res; res = res->ai_next) {
6001 PyObject *single;
6002 PyObject *addr =
6003 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6004 if (addr == NULL)
6005 goto err;
6006 single = Py_BuildValue("iiisO", res->ai_family,
6007 res->ai_socktype, res->ai_protocol,
6008 res->ai_canonname ? res->ai_canonname : "",
6009 addr);
6010 Py_DECREF(addr);
6011 if (single == NULL)
6012 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 if (PyList_Append(all, single))
6015 goto err;
6016 Py_XDECREF(single);
6017 }
6018 Py_XDECREF(idna);
6019 if (res0)
6020 freeaddrinfo(res0);
6021 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006022 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 Py_XDECREF(all);
6024 Py_XDECREF(idna);
6025 if (res0)
6026 freeaddrinfo(res0);
6027 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006028}
6029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006030PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006031"getaddrinfo(host, port [, family, type, proto, flags])\n\
6032 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006033\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006034Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006035
6036/* Python interface to getnameinfo(sa, flags). */
6037
6038/*ARGSUSED*/
6039static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006040socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006041{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 PyObject *sa = (PyObject *)NULL;
6043 int flags;
6044 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006045 int port;
6046 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6048 struct addrinfo hints, *res = NULL;
6049 int error;
6050 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006051 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 flags = flowinfo = scope_id = 0;
6054 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6055 return NULL;
6056 if (!PyTuple_Check(sa)) {
6057 PyErr_SetString(PyExc_TypeError,
6058 "getnameinfo() argument 1 must be a tuple");
6059 return NULL;
6060 }
Charles-François Natali366999a2012-01-02 15:47:29 +01006061 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 &hostp, &port, &flowinfo, &scope_id))
6063 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006064 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006065 PyErr_SetString(PyExc_OverflowError,
6066 "getsockaddrarg: flowinfo must be 0-1048575.");
6067 return NULL;
6068 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6070 memset(&hints, 0, sizeof(hints));
6071 hints.ai_family = AF_UNSPEC;
6072 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006073 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 Py_BEGIN_ALLOW_THREADS
6075 ACQUIRE_GETADDRINFO_LOCK
6076 error = getaddrinfo(hostp, pbuf, &hints, &res);
6077 Py_END_ALLOW_THREADS
6078 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6079 if (error) {
6080 set_gaierror(error);
6081 goto fail;
6082 }
6083 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006084 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 "sockaddr resolved to multiple addresses");
6086 goto fail;
6087 }
6088 switch (res->ai_family) {
6089 case AF_INET:
6090 {
6091 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006092 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 "IPv4 sockaddr must be 2 tuple");
6094 goto fail;
6095 }
6096 break;
6097 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006098#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 case AF_INET6:
6100 {
6101 struct sockaddr_in6 *sin6;
6102 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006103 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006104 sin6->sin6_scope_id = scope_id;
6105 break;
6106 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006109 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6111 if (error) {
6112 set_gaierror(error);
6113 goto fail;
6114 }
Victor Stinner72400302016-01-28 15:41:01 +01006115
6116 name = sock_decode_hostname(hbuf);
6117 if (name == NULL)
6118 goto fail;
6119 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006120
6121fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 if (res)
6123 freeaddrinfo(res);
6124 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006125}
6126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006127PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006128"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006129\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006130Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006131
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006132
6133/* Python API to getting and setting the default timeout value. */
6134
6135static PyObject *
6136socket_getdefaulttimeout(PyObject *self)
6137{
Victor Stinner71694d52015-03-28 01:18:54 +01006138 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 Py_INCREF(Py_None);
6140 return Py_None;
6141 }
Victor Stinner71694d52015-03-28 01:18:54 +01006142 else {
6143 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6144 return PyFloat_FromDouble(seconds);
6145 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006146}
6147
6148PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006149"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006150\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006151Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006152A value of None indicates that new socket objects have no timeout.\n\
6153When the socket module is first imported, the default is None.");
6154
6155static PyObject *
6156socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6157{
Victor Stinner71694d52015-03-28 01:18:54 +01006158 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006159
Victor Stinner71694d52015-03-28 01:18:54 +01006160 if (socket_parse_timeout(&timeout, arg) < 0)
6161 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 Py_INCREF(Py_None);
6166 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006167}
6168
6169PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006170"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006171\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006172Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006173A value of None indicates that new socket objects have no timeout.\n\
6174When the socket module is first imported, the default is None.");
6175
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006176#ifdef HAVE_IF_NAMEINDEX
6177/* Python API for getting interface indices and names */
6178
6179static PyObject *
6180socket_if_nameindex(PyObject *self, PyObject *arg)
6181{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006182 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006183 int i;
6184 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006185
Charles-François Natali60713592011-05-20 16:55:06 +02006186 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006187 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006188 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006189 return NULL;
6190 }
6191
6192 list = PyList_New(0);
6193 if (list == NULL) {
6194 if_freenameindex(ni);
6195 return NULL;
6196 }
6197
Charles-François Natali60713592011-05-20 16:55:06 +02006198 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6199 PyObject *ni_tuple = Py_BuildValue("IO&",
6200 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006201
6202 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6203 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006204 Py_DECREF(list);
6205 if_freenameindex(ni);
6206 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006207 }
6208 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006209 }
6210
6211 if_freenameindex(ni);
6212 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006213}
6214
6215PyDoc_STRVAR(if_nameindex_doc,
6216"if_nameindex()\n\
6217\n\
6218Returns a list of network interface information (index, name) tuples.");
6219
Charles-François Natali60713592011-05-20 16:55:06 +02006220static PyObject *
6221socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006222{
Charles-François Natali60713592011-05-20 16:55:06 +02006223 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006224 unsigned long index;
6225
Charles-François Natali60713592011-05-20 16:55:06 +02006226 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6227 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006228 return NULL;
6229
Charles-François Natali60713592011-05-20 16:55:06 +02006230 index = if_nametoindex(PyBytes_AS_STRING(oname));
6231 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006232 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006233 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006234 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006235 return NULL;
6236 }
6237
6238 return PyLong_FromUnsignedLong(index);
6239}
6240
6241PyDoc_STRVAR(if_nametoindex_doc,
6242"if_nametoindex(if_name)\n\
6243\n\
6244Returns the interface index corresponding to the interface name if_name.");
6245
Charles-François Natali60713592011-05-20 16:55:06 +02006246static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006247socket_if_indextoname(PyObject *self, PyObject *arg)
6248{
Charles-François Natali60713592011-05-20 16:55:06 +02006249 unsigned long index;
6250 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006251
Charles-François Natali60713592011-05-20 16:55:06 +02006252 index = PyLong_AsUnsignedLong(arg);
6253 if (index == (unsigned long) -1)
6254 return NULL;
6255
6256 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006257 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006258 return NULL;
6259 }
6260
Charles-François Natali60713592011-05-20 16:55:06 +02006261 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006262}
6263
6264PyDoc_STRVAR(if_indextoname_doc,
6265"if_indextoname(if_index)\n\
6266\n\
6267Returns the interface name corresponding to the interface index if_index.");
6268
6269#endif /* HAVE_IF_NAMEINDEX */
6270
6271
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006272#ifdef CMSG_LEN
6273/* Python interface to CMSG_LEN(length). */
6274
6275static PyObject *
6276socket_CMSG_LEN(PyObject *self, PyObject *args)
6277{
6278 Py_ssize_t length;
6279 size_t result;
6280
6281 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6282 return NULL;
6283 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6284 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6285 return NULL;
6286 }
6287 return PyLong_FromSize_t(result);
6288}
6289
6290PyDoc_STRVAR(CMSG_LEN_doc,
6291"CMSG_LEN(length) -> control message length\n\
6292\n\
6293Return the total length, without trailing padding, of an ancillary\n\
6294data item with associated data of the given length. This value can\n\
6295often be used as the buffer size for recvmsg() to receive a single\n\
6296item of ancillary data, but RFC 3542 requires portable applications to\n\
6297use CMSG_SPACE() and thus include space for padding, even when the\n\
6298item will be the last in the buffer. Raises OverflowError if length\n\
6299is outside the permissible range of values.");
6300
6301
6302#ifdef CMSG_SPACE
6303/* Python interface to CMSG_SPACE(length). */
6304
6305static PyObject *
6306socket_CMSG_SPACE(PyObject *self, PyObject *args)
6307{
6308 Py_ssize_t length;
6309 size_t result;
6310
6311 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6312 return NULL;
6313 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6314 PyErr_SetString(PyExc_OverflowError,
6315 "CMSG_SPACE() argument out of range");
6316 return NULL;
6317 }
6318 return PyLong_FromSize_t(result);
6319}
6320
6321PyDoc_STRVAR(CMSG_SPACE_doc,
6322"CMSG_SPACE(length) -> buffer size\n\
6323\n\
6324Return the buffer size needed for recvmsg() to receive an ancillary\n\
6325data item with associated data of the given length, along with any\n\
6326trailing padding. The buffer space needed to receive multiple items\n\
6327is the sum of the CMSG_SPACE() values for their associated data\n\
6328lengths. Raises OverflowError if length is outside the permissible\n\
6329range of values.");
6330#endif /* CMSG_SPACE */
6331#endif /* CMSG_LEN */
6332
6333
Guido van Rossum30a685f1991-06-27 15:51:29 +00006334/* List of functions exported by this module. */
6335
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006336static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 {"gethostbyname", socket_gethostbyname,
6338 METH_VARARGS, gethostbyname_doc},
6339 {"gethostbyname_ex", socket_gethostbyname_ex,
6340 METH_VARARGS, ghbn_ex_doc},
6341 {"gethostbyaddr", socket_gethostbyaddr,
6342 METH_VARARGS, gethostbyaddr_doc},
6343 {"gethostname", socket_gethostname,
6344 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006345#ifdef HAVE_SETHOSTNAME
6346 {"sethostname", socket_sethostname,
6347 METH_VARARGS, sethostname_doc},
6348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 {"getservbyname", socket_getservbyname,
6350 METH_VARARGS, getservbyname_doc},
6351 {"getservbyport", socket_getservbyport,
6352 METH_VARARGS, getservbyport_doc},
6353 {"getprotobyname", socket_getprotobyname,
6354 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006355#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006356 {"dup", socket_dup,
6357 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006358#endif
Dave Cole331708b2004-08-09 04:51:41 +00006359#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360 {"socketpair", socket_socketpair,
6361 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 {"ntohs", socket_ntohs,
6364 METH_VARARGS, ntohs_doc},
6365 {"ntohl", socket_ntohl,
6366 METH_O, ntohl_doc},
6367 {"htons", socket_htons,
6368 METH_VARARGS, htons_doc},
6369 {"htonl", socket_htonl,
6370 METH_O, htonl_doc},
6371 {"inet_aton", socket_inet_aton,
6372 METH_VARARGS, inet_aton_doc},
6373 {"inet_ntoa", socket_inet_ntoa,
6374 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006375#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 {"inet_pton", socket_inet_pton,
6377 METH_VARARGS, inet_pton_doc},
6378 {"inet_ntop", socket_inet_ntop,
6379 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006380#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006381 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6382 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006383 {"getnameinfo", socket_getnameinfo,
6384 METH_VARARGS, getnameinfo_doc},
6385 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6386 METH_NOARGS, getdefaulttimeout_doc},
6387 {"setdefaulttimeout", socket_setdefaulttimeout,
6388 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006389#ifdef HAVE_IF_NAMEINDEX
6390 {"if_nameindex", socket_if_nameindex,
6391 METH_NOARGS, if_nameindex_doc},
6392 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006393 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006394 {"if_indextoname", socket_if_indextoname,
6395 METH_O, if_indextoname_doc},
6396#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006397#ifdef CMSG_LEN
6398 {"CMSG_LEN", socket_CMSG_LEN,
6399 METH_VARARGS, CMSG_LEN_doc},
6400#ifdef CMSG_SPACE
6401 {"CMSG_SPACE", socket_CMSG_SPACE,
6402 METH_VARARGS, CMSG_SPACE_doc},
6403#endif
6404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006406};
6407
Guido van Rossum30a685f1991-06-27 15:51:29 +00006408
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006409#ifdef MS_WINDOWS
6410#define OS_INIT_DEFINED
6411
6412/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006413
6414static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006415os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006418}
6419
6420static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006421os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423 WSADATA WSAData;
6424 int ret;
6425 ret = WSAStartup(0x0101, &WSAData);
6426 switch (ret) {
6427 case 0: /* No error */
6428 Py_AtExit(os_cleanup);
6429 return 1; /* Success */
6430 case WSASYSNOTREADY:
6431 PyErr_SetString(PyExc_ImportError,
6432 "WSAStartup failed: network not ready");
6433 break;
6434 case WSAVERNOTSUPPORTED:
6435 case WSAEINVAL:
6436 PyErr_SetString(
6437 PyExc_ImportError,
6438 "WSAStartup failed: requested version not supported");
6439 break;
6440 default:
6441 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6442 break;
6443 }
6444 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006445}
6446
Guido van Rossum8d665e61996-06-26 18:22:49 +00006447#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006448
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006449
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006450
6451#ifndef OS_INIT_DEFINED
6452static int
6453os_init(void)
6454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006456}
6457#endif
6458
6459
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006460/* C API table - always add new things to the end for binary
6461 compatibility. */
6462static
6463PySocketModule_APIObject PySocketModuleAPI =
6464{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006466 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006468};
6469
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006470
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006471/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006472
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006473 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006474 "socket.py" which implements some additional functionality.
6475 The import of "_socket" may fail with an ImportError exception if
6476 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006477 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006478 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006479*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006481PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006482"Implementation module for socket operations.\n\
6483\n\
6484See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006485
Martin v. Löwis1a214512008-06-11 05:26:20 +00006486static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 PyModuleDef_HEAD_INIT,
6488 PySocket_MODULE_NAME,
6489 socket_doc,
6490 -1,
6491 socket_methods,
6492 NULL,
6493 NULL,
6494 NULL,
6495 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006496};
6497
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006498PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006499PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006500{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 if (!os_init())
6504 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006505
Victor Stinnerdaf45552013-08-28 00:53:59 +02006506#ifdef MS_WINDOWS
6507 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006508#if defined(_MSC_VER) && _MSC_VER >= 1800
6509 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6510#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006511 DWORD version = GetVersion();
6512 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6513 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6514 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006515 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6516#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006517 }
6518#endif
6519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 Py_TYPE(&sock_type) = &PyType_Type;
6521 m = PyModule_Create(&socketmodule);
6522 if (m == NULL)
6523 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006524
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006525 Py_INCREF(PyExc_OSError);
6526 PySocketModuleAPI.error = PyExc_OSError;
6527 Py_INCREF(PyExc_OSError);
6528 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006530 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 if (socket_herror == NULL)
6532 return NULL;
6533 Py_INCREF(socket_herror);
6534 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006535 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 NULL);
6537 if (socket_gaierror == NULL)
6538 return NULL;
6539 Py_INCREF(socket_gaierror);
6540 PyModule_AddObject(m, "gaierror", socket_gaierror);
6541 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006542 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543 if (socket_timeout == NULL)
6544 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006545 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 Py_INCREF(socket_timeout);
6547 PyModule_AddObject(m, "timeout", socket_timeout);
6548 Py_INCREF((PyObject *)&sock_type);
6549 if (PyModule_AddObject(m, "SocketType",
6550 (PyObject *)&sock_type) != 0)
6551 return NULL;
6552 Py_INCREF((PyObject *)&sock_type);
6553 if (PyModule_AddObject(m, "socket",
6554 (PyObject *)&sock_type) != 0)
6555 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006556
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006557#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 Py_INCREF(has_ipv6);
6563 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 /* Export C API */
6566 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6567 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6568 ) != 0)
6569 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006572#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006574#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006576#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006578#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006579#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006581 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006582#endif
6583#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006584 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006585#endif
6586#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006589#endif
6590#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006592 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006593#endif
6594#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006597#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006598#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006601#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006602#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006605#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006606#ifdef HAVE_SOCKADDR_ALG
6607 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6608#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006609#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006612#endif
6613#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006615#endif
6616#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006619#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006620#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006623#endif
6624#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006627#endif
6628#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006631#endif
6632#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006635#endif
6636#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, AF_NETLINK);
6639 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006640#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006642#endif
6643#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006645#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6647 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006648#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006650#endif
6651#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006653#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006654#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006656#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006657#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006659#endif
6660#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006662#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006664#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006666#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006667#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006669#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006670#ifdef NETLINK_CRYPTO
6671 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6672#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006673#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006674#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006677#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006678#ifdef AF_LINK
6679 PyModule_AddIntMacro(m, AF_LINK);
6680#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006681#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006683 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006684#endif
6685#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006688#endif
6689#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006690 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006692#endif
6693#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006694 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006696#endif
6697#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006700#endif
6701#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006704#endif
6705#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006708#endif
6709#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006712#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006713
Hye-Shik Chang81268602004-02-02 06:05:24 +00006714#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6716 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6717 PyModule_AddIntMacro(m, BTPROTO_HCI);
6718 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006719#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006721#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006722#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006723#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006725#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6727 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006728#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6731 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006732#endif
6733
Charles-François Natali47413c12011-10-06 19:47:44 +02006734#ifdef AF_CAN
6735 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006737#endif
6738#ifdef PF_CAN
6739 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006741#endif
6742
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006743/* Reliable Datagram Sockets */
6744#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006746#endif
6747#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006749#endif
6750
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006751/* Kernel event messages */
6752#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006754#endif
6755#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006757#endif
6758
Antoine Pitroub156a462010-10-27 20:13:57 +00006759#ifdef AF_PACKET
6760 PyModule_AddIntMacro(m, AF_PACKET);
6761#endif
6762#ifdef PF_PACKET
6763 PyModule_AddIntMacro(m, PF_PACKET);
6764#endif
6765#ifdef PACKET_HOST
6766 PyModule_AddIntMacro(m, PACKET_HOST);
6767#endif
6768#ifdef PACKET_BROADCAST
6769 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6770#endif
6771#ifdef PACKET_MULTICAST
6772 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6773#endif
6774#ifdef PACKET_OTHERHOST
6775 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6776#endif
6777#ifdef PACKET_OUTGOING
6778 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6779#endif
6780#ifdef PACKET_LOOPBACK
6781 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6782#endif
6783#ifdef PACKET_FASTROUTE
6784 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006785#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006786
Christian Heimes043d6f62008-01-07 17:19:16 +00006787#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6792 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6793 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006794
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6796 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6797 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, SOL_TIPC);
6801 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6802 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6803 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6804 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006805
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6807 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6808 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6809 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6813 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006814#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006815 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006817#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006818 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6819 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6820 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6821 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6822 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6823 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006824#endif
6825
Christian Heimesdffa3942016-09-05 23:54:41 +02006826#ifdef HAVE_SOCKADDR_ALG
6827 /* Socket options */
6828 PyModule_AddIntMacro(m, ALG_SET_KEY);
6829 PyModule_AddIntMacro(m, ALG_SET_IV);
6830 PyModule_AddIntMacro(m, ALG_SET_OP);
6831 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6832 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6833 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6834
6835 /* Operations */
6836 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6837 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6838 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6839 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6840#endif
6841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, SOCK_STREAM);
6844 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006845/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006846#ifdef SOCK_RAW
6847 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006849#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006851#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006853#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006854#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006856#endif
6857#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006859#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006869#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006870#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006872#endif
6873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006891#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006892#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006895#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006903#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006906#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006912#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006917#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006918#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006923#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006924#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006926#endif
6927#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006929#endif
6930#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006932#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006933#ifdef SO_PASSSEC
6934 PyModule_AddIntMacro(m, SO_PASSSEC);
6935#endif
6936#ifdef SO_PEERSEC
6937 PyModule_AddIntMacro(m, SO_PEERSEC);
6938#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006939#ifdef SO_BINDTODEVICE
6940 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6941#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006942#ifdef SO_PRIORITY
6943 PyModule_AddIntMacro(m, SO_PRIORITY);
6944#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006945#ifdef SO_MARK
6946 PyModule_AddIntMacro(m, SO_MARK);
6947#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006948#ifdef SO_DOMAIN
6949 PyModule_AddIntMacro(m, SO_DOMAIN);
6950#endif
6951#ifdef SO_PROTOCOL
6952 PyModule_AddIntMacro(m, SO_PROTOCOL);
6953#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955 /* Maximum number of connections for "listen" */
6956#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006958#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006960#endif
6961
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07006962 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006963#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006965#endif
6966#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006968#endif
6969#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006971#endif
6972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973 /* Flags for send, recv */
6974#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006983#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006986#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006989#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006995#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007001#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007003#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007004#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007006#endif
7007#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007009#endif
7010#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007012#endif
7013#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007014 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007015#endif
7016#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007017 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007018#endif
7019#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007021#endif
7022#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007024#endif
7025#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007027#endif
7028#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007029 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007030#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007031#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007033#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007035 /* Protocol level and numbers, usable for [gs]etsockopt */
7036#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007041#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007043#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007044#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007049#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007055#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007056#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007061#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007062 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007064#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007066#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007067 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007068#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007069#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007071#endif
7072#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7074 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007075#endif
7076#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7078 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7079 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007080
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7082 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7083 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02007084#endif
7085#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7087 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7088 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7089 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007090#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007091#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7092 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7093#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007094#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007096 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7097 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7098 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7099 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7100 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7101 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7102 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7103 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7104 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7105 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7106 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7107 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7108#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007109#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007111#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007112#ifdef HAVE_SOCKADDR_ALG
7113 PyModule_AddIntMacro(m, SOL_ALG);
7114#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007115#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007117#endif
7118#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007120#endif
7121#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007123#endif
7124#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007126#endif
7127#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007129#endif
7130#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007135#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007136 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007141#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007143#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007145#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007148#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007149#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007151#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007152#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007154#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007157#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007161#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007163#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007165#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007169#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007172#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007174#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007175 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007177#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007182#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007185#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007189#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007199 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007202 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007205 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007207#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007211 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007213#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007214 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007217 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007219#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007222#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007228#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007233#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007235 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007236#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007237#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007238 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007240#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007241 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007242#endif
7243/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007245 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007246#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007247 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007249#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007250 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007251#endif
7252
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007253#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007254 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007255#endif
7256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257 /* Some port configuration */
7258#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007259 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007260#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007265#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007267#endif
7268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007269 /* Some reserved IP v.4 addresses */
7270#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007271 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007272#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007273 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007277#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007279#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007280#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007281 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007283 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007287#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290#ifdef INADDR_ALLHOSTS_GROUP
7291 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7292 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007293#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007294 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007298#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007299 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007301#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007302 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007303#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007304 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007305#endif
7306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007307 /* IPv4 [gs]etsockopt options */
7308#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007310#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007311#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007318 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007321 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007323#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007324 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007326#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007330 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007331#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007332#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007333 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007335#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007336 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007338#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007339 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007345 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007347#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007348 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007349#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007351 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007353#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007354 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007355#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007356#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007357 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007358#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7361#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007362 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007364#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007370#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007376#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007377 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007379 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007380#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007381 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007382#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007383 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007384#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007385 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007386#endif
7387#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007388 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007389#endif
7390#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007391 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007392#endif
7393#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007394 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007395#endif
7396#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007397 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007398#endif
7399#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007400 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007401#endif
7402#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007403 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007404#endif
7405#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007406 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007407#endif
7408#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007409 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007410#endif
7411#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007412 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007413#endif
7414#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007415 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007416#endif
7417#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007419#endif
7420#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007422#endif
7423#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007425#endif
7426#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007428#endif
7429#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007431#endif
7432#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007434#endif
7435#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007436 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007437#endif
7438#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007439 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007440#endif
7441#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007442 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007443#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007445 /* TCP options */
7446#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007449#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007452#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007455#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007458#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007461#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007464#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007467#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007470#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007473#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007476#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007479#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007481#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007482#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007484#endif
Victor Stinner11dd6042016-11-29 16:55:04 +01007485#ifdef TCP_CONGESTION
7486 PyModule_AddIntMacro(m, TCP_CONGESTION);
7487#endif
7488#ifdef TCP_USER_TIMEOUT
7489 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7490#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007492 /* IPX options */
7493#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007494 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007495#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007496
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007497/* Reliable Datagram Sockets */
7498#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007499 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007500#endif
7501#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007502 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007503#endif
7504#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007505 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007506#endif
7507#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007508 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007509#endif
7510#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007511 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007512#endif
7513#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007514 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007515#endif
7516#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007517 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007518#endif
7519#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007520 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007521#endif
7522#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007523 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007524#endif
7525#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007526 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007527#endif
7528#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007529 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007530#endif
7531#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007532 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007533#endif
7534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007536#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007537 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007538#endif
7539#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007540 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007541#endif
7542#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007543 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007544#endif
7545#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007546 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007547#endif
7548#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007549 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007550#endif
7551#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007552 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007553#endif
7554#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007555 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007556#endif
7557#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007558 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007559#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007560#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007561 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007562#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007563#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007565#endif
7566#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007568#endif
7569#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007570 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007571#endif
7572#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007574#endif
7575#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007577#endif
7578#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007580#endif
7581#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007582 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007583#endif
7584#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007586#endif
7587#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007589#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007590#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007592#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007593#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007594 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007595#endif
7596#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007597 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007598#endif
7599#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007600 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007601#endif
7602#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007603 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007604#endif
7605#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007606 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007607#endif
7608#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007609 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007610#endif
7611#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007612 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007613#endif
7614#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007615 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007616#endif
7617#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007618 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007619#endif
7620#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007621 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007622#endif
7623#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007624 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007625#endif
7626#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007627 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007628#endif
7629#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007630 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007631#endif
7632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007633 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007634#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007636#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007637 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007638#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007639 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007640#endif
7641#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007642 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007643#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007644 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007645#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007646 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007647#endif
7648#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007649 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007650#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007651 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007652#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007653 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007654#endif
7655
Christian Heimesfaf2f632008-01-06 16:59:19 +00007656#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007657 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007658 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7659#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007660 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007661#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007662 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007663 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7664#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007665 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007666#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007667 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007668 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007669 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007670 PyObject *tmp;
7671 tmp = PyLong_FromUnsignedLong(codes[i]);
7672 if (tmp == NULL)
7673 return NULL;
7674 PyModule_AddObject(m, names[i], tmp);
7675 }
7676 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, RCVALL_OFF);
7678 PyModule_AddIntMacro(m, RCVALL_ON);
7679 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007680#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007681 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007682#endif
7683#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007684 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007685#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007686#endif /* _MSTCPIP_ */
7687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007688 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007689#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007690 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007691#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007692 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007693}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007694
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007695
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007696#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007697#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007698
7699/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007700/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007701
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007702int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007703inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007704{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007706#if (SIZEOF_INT != 4)
7707#error "Not sure if in_addr_t exists and int is not 32-bits."
7708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007709 unsigned int packed_addr;
7710 packed_addr = inet_addr(src);
7711 if (packed_addr == INADDR_NONE)
7712 return 0;
7713 memcpy(dst, &packed_addr, 4);
7714 return 1;
7715 }
7716 /* Should set errno to EAFNOSUPPORT */
7717 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007718}
7719
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007720const char *
7721inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007723 if (af == AF_INET) {
7724 struct in_addr packed_addr;
7725 if (size < 16)
7726 /* Should set errno to ENOSPC. */
7727 return NULL;
7728 memcpy(&packed_addr, src, sizeof(packed_addr));
7729 return strncpy(dst, inet_ntoa(packed_addr), size);
7730 }
7731 /* Should set errno to EAFNOSUPPORT */
7732 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007733}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007734
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007735#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007736#endif