blob: 50a4443a35a1e6f823bee03a92eafc9d5a18aedb [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(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000168#endif
169
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000171# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# define HAVE_GETHOSTBYNAME_R_3_ARG
173# elif defined(__sun) || defined(__sgi)
174# define HAVE_GETHOSTBYNAME_R_5_ARG
Benjamin Petersonb6c34582016-09-07 14:08:34 -0700175# elif defined(__linux__)
Guido van Rossum9376b741999-09-15 22:01:40 +0000176/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000177# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
178# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# else
180# undef HAVE_GETHOSTBYNAME_R
181# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#endif
183
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200184#if !defined(HAVE_GETHOSTBYNAME_R) && !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000185# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000186#endif
187
Ned Deilye1d4e582016-02-23 22:05:29 +1100188/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000189#ifdef HAVE_SYS_PARAM_H
190#include <sys/param.h>
191#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100193 (this includes the getaddrinfo emulation) protect access with a lock.
194
195 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
196 a mix of code including an unsafe implementation from an old BSD's
197 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
198 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100199 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100200
Ned Deilye1d4e582016-02-23 22:05:29 +1100201 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
202 http://www.openbsd.org/plus54.html
203
204 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
205
206http://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 +1100207 */
Antoine Pitroua6a4dc82017-09-07 18:56:24 +0200208#if ((defined(__APPLE__) && \
Ned Deily47299fd2016-02-15 16:54:08 +1100209 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000210 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
212 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100213 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000214#define USE_GETADDRINFO_LOCK
215#endif
216
217#ifdef USE_GETADDRINFO_LOCK
218#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
219#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
220#else
221#define ACQUIRE_GETADDRINFO_LOCK
222#define RELEASE_GETADDRINFO_LOCK
223#endif
224
225#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000227#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000229#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include <types.h>
231# include <io.h>
232# include <sys/ioctl.h>
233# include <utils.h>
234# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000235#endif
236
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100237#ifdef __APPLE__
238# include <sys/ioctl.h>
239#endif
240
241
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243/* make sure that the reentrant (gethostbyaddr_r etc)
244 functions are declared correctly if compiling with
245 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000249#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000250#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000252#undef _XOPEN_SOURCE
253#include <sys/socket.h>
254#include <sys/types.h>
255#include <netinet/in.h>
256#ifdef _SS_ALIGNSIZE
257#define HAVE_GETADDRINFO 1
258#define HAVE_GETNAMEINFO 1
259#endif
260
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000261#define HAVE_INET_PTON
262#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000263#endif
264
Benjamin Peterson06930632017-09-04 16:36:05 -0700265/* Solaris fails to define this variable at all. */
266#if defined(sun) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000267#define INET_ADDRSTRLEN 16
268#endif
269
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000271#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000272#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700275#ifdef HAVE_SYS_SOCKET_H
276#include <sys/socket.h>
277#endif
278
279#ifdef HAVE_NET_IF_H
280#include <net/if.h>
281#endif
282
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000283/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000284#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000285#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286
287/* Addressing includes */
288
Guido van Rossum6f489d91996-06-28 20:15:15 +0000289#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290
291/* Non-MS WINDOWS includes */
292# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000293# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000294
Guido van Rossum9376b741999-09-15 22:01:40 +0000295/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000297
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000299
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000300#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000301
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000303# ifdef HAVE_FCNTL_H
304# include <fcntl.h>
305# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000306
Steve Dower65e4cb12014-11-22 12:54:57 -0800307#if defined(_MSC_VER) && _MSC_VER >= 1800
308/* Provides the IsWindows7SP1OrGreater() function */
309#include <VersionHelpers.h>
310#endif
311
Jeremy Hylton22308652001-02-02 03:23:09 +0000312#endif
313
Skip Montanaro7befb992004-02-10 16:50:21 +0000314#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000315
Neal Norwitz39d22e52002-11-02 19:55:21 +0000316#ifndef O_NONBLOCK
317# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000318#endif
319
Trent Micka708d6e2004-09-07 17:48:26 +0000320/* include Python's addrinfo.h unless it causes trouble */
321#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
322 /* Do not include addinfo.h on some newer IRIX versions.
323 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
324 * for example, but not by 6.5.10.
325 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000326#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000327 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
328 * EAI_* constants are defined in (the already included) ws2tcpip.h.
329 */
330#else
331# include "addrinfo.h"
332#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000333
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#ifdef __APPLE__
335/* On OS X, getaddrinfo returns no error indication of lookup
336 failure, so we must use the emulation instead of the libinfo
337 implementation. Unfortunately, performing an autoconf test
338 for this bug would require DNS access for the machine performing
339 the configuration, which is not acceptable. Therefore, we
340 determine the bug just by checking for __APPLE__. If this bug
341 gets ever fixed, perhaps checking for sys/version.h would be
342 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000343#ifndef HAVE_GETNAMEINFO
344/* This bug seems to be fixed in Jaguar. Ths easiest way I could
345 Find to check for Jaguar is that it has getnameinfo(), which
346 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000348#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000349
350#ifdef HAVE_INET_ATON
351#define USE_INET_ATON_WEAKLINK
352#endif
353
Jack Jansen84262fb2002-07-02 14:40:42 +0000354#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000355
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000356/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000358/* avoid clashes with the C library definition of the symbol. */
359#define getaddrinfo fake_getaddrinfo
360#define gai_strerror fake_gai_strerror
361#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000362#include "getaddrinfo.c"
363#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000364#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000365#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000366#include "getnameinfo.c"
367#endif
368
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000369#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000370#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000371#endif
372
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000373#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000374#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000375#define EAFNOSUPPORT WSAEAFNOSUPPORT
376#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000377#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000378
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000379#ifndef SOCKETCLOSE
380#define SOCKETCLOSE close
381#endif
382
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000383#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define USE_BLUETOOTH 1
385#if defined(__FreeBSD__)
386#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
387#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000388#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000389#define SOL_HCI SOL_HCI_RAW
390#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define sockaddr_l2 sockaddr_l2cap
392#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000393#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
395#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000397#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000398#define sockaddr_l2 sockaddr_bt
399#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000400#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000401#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000402#define SOL_HCI BTPROTO_HCI
403#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000404#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
405#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000406#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000408#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000409#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
410#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000411#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000412#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
413#endif
414#endif
415
Charles-François Natali8b759652011-12-23 16:44:51 +0100416/* Convert "sock_addr_t *" to "struct sockaddr *". */
417#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000418
Martin v. Löwise9416172003-05-03 10:12:45 +0000419/*
420 * Constants for getnameinfo()
421 */
422#if !defined(NI_MAXHOST)
423#define NI_MAXHOST 1025
424#endif
425#if !defined(NI_MAXSERV)
426#define NI_MAXSERV 32
427#endif
428
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000429#ifndef INVALID_SOCKET /* MS defines this */
430#define INVALID_SOCKET (-1)
431#endif
432
Charles-François Natali0cc86852013-09-13 19:53:08 +0200433#ifndef INADDR_NONE
434#define INADDR_NONE (-1)
435#endif
436
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000437/* XXX There's a problem here: *static* functions are not supposed to have
438 a Py prefix (or use CapitalizedWords). Later... */
439
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440/* Global variable holding the exception type for errors detected
441 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442static PyObject *socket_herror;
443static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000444static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000445
Tim Peters643a7fc2002-02-17 04:13:21 +0000446/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000447 The sock_type variable contains pointers to various functions,
448 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000449 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000450static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000451
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000452#if defined(HAVE_POLL_H)
453#include <poll.h>
454#elif defined(HAVE_SYS_POLL_H)
455#include <sys/poll.h>
456#endif
457
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000458/* Largest value to try to store in a socklen_t (used when handling
459 ancillary data). POSIX requires socklen_t to hold at least
460 (2**31)-1 and recommends against storing larger values, but
461 socklen_t was originally int in the BSD interface, so to be on the
462 safe side we use the smaller of (2**31)-1 and INT_MAX. */
463#if INT_MAX > 0x7fffffff
464#define SOCKLEN_T_LIMIT 0x7fffffff
465#else
466#define SOCKLEN_T_LIMIT INT_MAX
467#endif
468
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200469#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000470/* Instead of select(), we'll use poll() since poll() works on any fd. */
471#define IS_SELECTABLE(s) 1
472/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000473#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200474/* If there's no timeout left, we don't have to call select, so it's a safe,
475 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100476#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000477#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000478
479static PyObject*
480select_error(void)
481{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200482 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000484}
485
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000486#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000487#ifndef WSAEAGAIN
488#define WSAEAGAIN WSAEWOULDBLOCK
489#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000490#define CHECK_ERRNO(expected) \
491 (WSAGetLastError() == WSA ## expected)
492#else
493#define CHECK_ERRNO(expected) \
494 (errno == expected)
495#endif
496
Victor Stinnerdaf45552013-08-28 00:53:59 +0200497#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200498# define GET_SOCK_ERROR WSAGetLastError()
499# define SET_SOCK_ERROR(err) WSASetLastError(err)
500# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
501# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300502# define SUPPRESS_DEPRECATED_CALL __pragma(warning(suppress: 4996))
Victor Stinner81c41db2015-04-02 11:50:57 +0200503#else
504# define GET_SOCK_ERROR errno
505# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
506# define SOCK_TIMEOUT_ERR EWOULDBLOCK
507# define SOCK_INPROGRESS_ERR EINPROGRESS
Segev Finer9f3bdcb2017-06-28 23:51:00 +0300508# define SUPPRESS_DEPRECATED_CALL
Victor Stinner81c41db2015-04-02 11:50:57 +0200509#endif
510
511
512#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200513/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
514static int support_wsa_no_inherit = -1;
515#endif
516
Guido van Rossum30a685f1991-06-27 15:51:29 +0000517/* Convenience function to raise an error according to errno
518 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000519
Guido van Rossum73624e91994-10-10 17:59:00 +0000520static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000521set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000522{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000523#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 int err_no = WSAGetLastError();
525 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
526 recognizes the error codes used by both GetLastError() and
527 WSAGetLastError */
528 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200529 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000530#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000531
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200532 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533}
534
Guido van Rossum30a685f1991-06-27 15:51:29 +0000535
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000537set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000540
541#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 if (v != NULL) {
547 PyErr_SetObject(socket_herror, v);
548 Py_DECREF(v);
549 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552}
553
554
555static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000556set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559
Martin v. Löwis272cb402002-03-01 08:31:07 +0000560#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 /* EAI_SYSTEM is not available on Windows XP. */
562 if (error == EAI_SYSTEM)
563 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000564#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000565
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000566#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000568#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 if (v != NULL) {
572 PyErr_SetObject(socket_gaierror, v);
573 Py_DECREF(v);
574 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000577}
578
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000579/* Function to perform the setting of socket blocking mode
580 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000581static int
582internal_setblocking(PySocketSockObject *s, int block)
583{
Yury Selivanovfa22b292016-10-18 16:03:52 -0400584 int result = -1;
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585#ifdef MS_WINDOWS
586 u_long arg;
587#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100588#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100589 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100590 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000591#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000592#ifdef SOCK_NONBLOCK
593 if (block)
594 s->sock_type &= (~SOCK_NONBLOCK);
595 else
596 s->sock_type |= SOCK_NONBLOCK;
597#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100601#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 block = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200603 if (ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400604 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100605#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200607 if (delay_flag == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400608 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100610 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 else
Victor Stinner9a954832013-12-04 00:41:24 +0100612 new_delay_flag = delay_flag | O_NONBLOCK;
613 if (new_delay_flag != delay_flag)
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200614 if (fcntl(s->sock_fd, F_SETFL, new_delay_flag) == -1)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400615 goto done;
Victor Stinner9a954832013-12-04 00:41:24 +0100616#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200618 arg = !block;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200619 if (ioctlsocket(s->sock_fd, FIONBIO, &arg) != 0)
Yury Selivanovfa22b292016-10-18 16:03:52 -0400620 goto done;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621#endif /* MS_WINDOWS */
Yury Selivanovfa22b292016-10-18 16:03:52 -0400622
623 result = 0;
624
625 done:
Martin Panterfa27d5f2016-10-20 00:48:23 +0000626 ; /* necessary for --without-threads flag */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628
Yury Selivanovfa22b292016-10-18 16:03:52 -0400629 if (result) {
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200630#ifndef MS_WINDOWS
Yury Selivanovfa22b292016-10-18 16:03:52 -0400631 PyErr_SetFromErrno(PyExc_OSError);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200632#else
Yury Selivanovfa22b292016-10-18 16:03:52 -0400633 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200634#endif
Yury Selivanovfa22b292016-10-18 16:03:52 -0400635 }
636
637 return result;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000638}
639
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000640static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200641internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
642 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000643{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100645#ifdef HAVE_POLL
646 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200647 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100648#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200649 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200650 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100651#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000652
Victor Stinnerb7df3142015-03-27 22:59:32 +0100653 /* must be called with the GIL held */
654 assert(PyGILState_Check());
Victor Stinnerb7df3142015-03-27 22:59:32 +0100655
Victor Stinner416f2e62015-03-31 13:56:29 +0200656 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200657 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200660 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000661 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000663 /* Prefer poll, if available, since you can poll() any fd
664 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000665#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100666 pollfd.fd = s->sock_fd;
667 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200668 if (connect) {
669 /* On Windows, the socket becomes writable on connection success,
670 but a connection failure is notified as an error. On POSIX, the
671 socket becomes writable on connection success or on connection
672 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200673 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200674 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000675
Victor Stinner71694d52015-03-28 01:18:54 +0100676 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200677 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200678 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000679
Victor Stinner71694d52015-03-28 01:18:54 +0100680 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200681 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100682 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683#else
Victor Stinnerced11742015-04-09 10:27:25 +0200684 if (interval >= 0) {
685 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
686 tvp = &tv;
687 }
688 else
689 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000690
Victor Stinner71694d52015-03-28 01:18:54 +0100691 FD_ZERO(&fds);
692 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200693 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200694 if (connect) {
695 /* On Windows, the socket becomes writable on connection success,
696 but a connection failure is notified as an error. On POSIX, the
697 socket becomes writable on connection success or on connection
698 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200699 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200700 }
Victor Stinner71694d52015-03-28 01:18:54 +0100701
702 /* See if the socket is ready */
703 Py_BEGIN_ALLOW_THREADS;
704 if (writing)
705 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200706 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100707 else
708 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200709 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100710 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000711#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 if (n < 0)
714 return -1;
715 if (n == 0)
716 return 1;
717 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000718}
719
Victor Stinner31bf2d52015-04-01 21:57:09 +0200720/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000721
Victor Stinner81c41db2015-04-02 11:50:57 +0200722 On error, raise an exception and return -1 if err is set, or fill err and
723 return -1 otherwise. If a signal was received and the signal handler raised
724 an exception, return -1, and set err to -1 if err is set.
725
726 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100727
Victor Stinner31bf2d52015-04-01 21:57:09 +0200728 If the socket has a timeout, wait until the socket is ready before calling
729 the function: wait until the socket is writable if writing is nonzero, wait
730 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100731
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200733 the function, except if the signal handler raised an exception (PEP 475).
734
735 When the function is retried, recompute the timeout using a monotonic clock.
736
Victor Stinner81c41db2015-04-02 11:50:57 +0200737 sock_call_ex() must be called with the GIL held. The socket function is
738 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200739static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200740sock_call_ex(PySocketSockObject *s,
741 int writing,
742 int (*sock_func) (PySocketSockObject *s, void *data),
743 void *data,
744 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200745 int *err,
746 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200747{
Victor Stinner8912d142015-04-06 23:16:34 +0200748 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200749 _PyTime_t deadline = 0;
750 int deadline_initialized = 0;
751 int res;
752
753 /* sock_call() must be called with the GIL held. */
754 assert(PyGILState_Check());
755
756 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200758 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200759 /* For connect(), poll even for blocking socket. The connection
760 runs asynchronously. */
761 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200762 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200763 _PyTime_t interval;
764
Victor Stinner81c41db2015-04-02 11:50:57 +0200765 if (deadline_initialized) {
766 /* recompute the timeout */
767 interval = deadline - _PyTime_GetMonotonicClock();
768 }
769 else {
770 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200771 deadline = _PyTime_GetMonotonicClock() + timeout;
772 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200773 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200774
Victor Stinner10550cd2015-04-03 13:22:27 +0200775 if (interval >= 0)
776 res = internal_select(s, writing, interval, connect);
777 else
778 res = 1;
779 }
780 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200781 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200782 }
783
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 if (err)
786 *err = GET_SOCK_ERROR;
787
Victor Stinner31bf2d52015-04-01 21:57:09 +0200788 if (CHECK_ERRNO(EINTR)) {
789 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200790 if (PyErr_CheckSignals()) {
791 if (err)
792 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200793 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200794 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200795
796 /* retry select() */
797 continue;
798 }
799
800 /* select() failed */
801 s->errorhandler();
802 return -1;
803 }
804
805 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 if (err)
807 *err = SOCK_TIMEOUT_ERR;
808 else
809 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200810 return -1;
811 }
812
813 /* the socket is ready */
814 }
815
Victor Stinner81c41db2015-04-02 11:50:57 +0200816 /* inner loop to retry sock_func() when sock_func() is interrupted
817 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818 while (1) {
819 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200820 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200821 Py_END_ALLOW_THREADS
822
823 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200824 /* sock_func() succeeded */
825 if (err)
826 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827 return 0;
828 }
829
Victor Stinner81c41db2015-04-02 11:50:57 +0200830 if (err)
831 *err = GET_SOCK_ERROR;
832
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833 if (!CHECK_ERRNO(EINTR))
834 break;
835
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 /* sock_func() was interrupted by a signal */
837 if (PyErr_CheckSignals()) {
838 if (err)
839 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200840 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844 }
845
846 if (s->sock_timeout > 0
847 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200848 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200849
850 For example, select() could indicate a socket is ready for
851 reading, but the data then discarded by the OS because of a
852 wrong checksum.
853
854 Loop on select() to recheck for socket readyness. */
855 continue;
856 }
857
Victor Stinner81c41db2015-04-02 11:50:57 +0200858 /* sock_func() failed */
859 if (!err)
860 s->errorhandler();
861 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000862 return -1;
863 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200864}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000865
Victor Stinner81c41db2015-04-02 11:50:57 +0200866static int
867sock_call(PySocketSockObject *s,
868 int writing,
869 int (*func) (PySocketSockObject *s, void *data),
870 void *data)
871{
Victor Stinner8912d142015-04-06 23:16:34 +0200872 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200873}
874
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000875
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000876/* Initialize a new socket object. */
877
Victor Stinner88ed6402015-04-09 10:23:12 +0200878/* Default timeout for new sockets */
879static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000880
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200881static int
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000882init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 s->sock_fd = fd;
886 s->sock_family = family;
887 s->sock_type = type;
888 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000891#ifdef SOCK_NONBLOCK
892 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100893 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000894 else
895#endif
896 {
897 s->sock_timeout = defaulttimeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200898 if (defaulttimeout >= 0) {
899 if (internal_setblocking(s, 0) == -1) {
900 return -1;
901 }
902 }
Antoine Pitroub1c54962010-10-14 15:05:38 +0000903 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200904 return 0;
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000905}
906
907
Guido van Rossum30a685f1991-06-27 15:51:29 +0000908/* Create a new socket object.
909 This just creates the object and initializes it.
910 If the creation fails, return NULL and set an exception (implicit
911 in NEWOBJ()). */
912
Guido van Rossum73624e91994-10-10 17:59:00 +0000913static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000914new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 PySocketSockObject *s;
917 s = (PySocketSockObject *)
918 PyType_GenericNew(&sock_type, NULL, NULL);
Christian Heimes0b9d64e2016-09-09 00:28:57 +0200919 if (s == NULL)
920 return NULL;
921 if (init_sockobject(s, fd, family, type, proto) == -1) {
922 Py_DECREF(s);
923 return NULL;
924 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926}
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928
Guido van Rossum48a680c2001-03-02 06:34:14 +0000929/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000930 thread to be in gethostbyname or getaddrinfo */
931#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200932static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000933#endif
934
935
Guido van Rossum30a685f1991-06-27 15:51:29 +0000936/* Convert a string specifying a host name or one of a few symbolic
937 names to a numeric IP address. This usually calls gethostbyname()
938 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000939 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940 an error occurred; then an exception is raised. */
941
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200943setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 struct addrinfo hints, *res;
946 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
949 if (name[0] == '\0') {
950 int siz;
951 memset(&hints, 0, sizeof(hints));
952 hints.ai_family = af;
953 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
954 hints.ai_flags = AI_PASSIVE;
955 Py_BEGIN_ALLOW_THREADS
956 ACQUIRE_GETADDRINFO_LOCK
957 error = getaddrinfo(NULL, "0", &hints, &res);
958 Py_END_ALLOW_THREADS
959 /* We assume that those thread-unsafe getaddrinfo() versions
960 *are* safe regarding their return value, ie. that a
961 subsequent call to getaddrinfo() does not destroy the
962 outcome of the first call. */
963 RELEASE_GETADDRINFO_LOCK
964 if (error) {
965 set_gaierror(error);
966 return -1;
967 }
968 switch (res->ai_family) {
969 case AF_INET:
970 siz = 4;
971 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000972#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 case AF_INET6:
974 siz = 16;
975 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 default:
978 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200979 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 "unsupported address family");
981 return -1;
982 }
983 if (res->ai_next) {
984 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200985 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 "wildcard resolved to multiple address");
987 return -1;
988 }
989 if (res->ai_addrlen < addr_ret_size)
990 addr_ret_size = res->ai_addrlen;
991 memcpy(addr_ret, res->ai_addr, addr_ret_size);
992 freeaddrinfo(res);
993 return siz;
994 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200995 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100996 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200997 if (strcmp(name, "255.255.255.255") == 0 ||
998 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 struct sockaddr_in *sin;
1000 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001001 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 "address family mismatched");
1003 return -1;
1004 }
1005 sin = (struct sockaddr_in *)addr_ret;
1006 memset((void *) sin, '\0', sizeof(*sin));
1007 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001008#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 sin->sin_addr.s_addr = INADDR_BROADCAST;
1012 return sizeof(sin->sin_addr);
1013 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014
1015 /* avoid a name resolution in case of numeric address */
1016#ifdef HAVE_INET_PTON
1017 /* check for an IPv4 address */
1018 if (af == AF_UNSPEC || af == AF_INET) {
1019 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1020 memset(sin, 0, sizeof(*sin));
1021 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1022 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001023#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001024 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001025#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001026 return 4;
1027 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001028 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001029#ifdef ENABLE_IPV6
1030 /* check for an IPv6 address - if the address contains a scope ID, we
1031 * fallback to getaddrinfo(), which can handle translation from interface
1032 * name to interface index */
1033 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1034 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1035 memset(sin, 0, sizeof(*sin));
1036 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1037 sin->sin6_family = AF_INET6;
1038#ifdef HAVE_SOCKADDR_SA_LEN
1039 sin->sin6_len = sizeof(*sin);
1040#endif
1041 return 16;
1042 }
1043 }
1044#endif /* ENABLE_IPV6 */
1045#else /* HAVE_INET_PTON */
1046 /* check for an IPv4 address */
1047 if (af == AF_INET || af == AF_UNSPEC) {
1048 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1049 memset(sin, 0, sizeof(*sin));
1050 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1051 sin->sin_family = AF_INET;
1052#ifdef HAVE_SOCKADDR_SA_LEN
1053 sin->sin_len = sizeof(*sin);
1054#endif
1055 return 4;
1056 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001057 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001058#endif /* HAVE_INET_PTON */
1059
1060 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 memset(&hints, 0, sizeof(hints));
1062 hints.ai_family = af;
1063 Py_BEGIN_ALLOW_THREADS
1064 ACQUIRE_GETADDRINFO_LOCK
1065 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001066#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 if (error == EAI_NONAME && af == AF_UNSPEC) {
1068 /* On Tru64 V5.1, numeric-to-addr conversion fails
1069 if no address family is given. Assume IPv4 for now.*/
1070 hints.ai_family = AF_INET;
1071 error = getaddrinfo(name, NULL, &hints, &res);
1072 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 Py_END_ALLOW_THREADS
1075 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1076 if (error) {
1077 set_gaierror(error);
1078 return -1;
1079 }
1080 if (res->ai_addrlen < addr_ret_size)
1081 addr_ret_size = res->ai_addrlen;
1082 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1083 freeaddrinfo(res);
1084 switch (addr_ret->sa_family) {
1085 case AF_INET:
1086 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001087#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case AF_INET6:
1089 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001092 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 return -1;
1094 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001095}
1096
Guido van Rossum30a685f1991-06-27 15:51:29 +00001097
Guido van Rossum30a685f1991-06-27 15:51:29 +00001098/* Create a string object representing an IP address.
1099 This is always a string of the form 'dd.dd.dd.dd' (with variable
1100 size numbers). */
1101
Guido van Rossum73624e91994-10-10 17:59:00 +00001102static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001103makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001104{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 char buf[NI_MAXHOST];
1106 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1109 NI_NUMERICHOST);
1110 if (error) {
1111 set_gaierror(error);
1112 return NULL;
1113 }
1114 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001115}
1116
1117
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118#ifdef USE_BLUETOOTH
1119/* Convert a string representation of a Bluetooth address into a numeric
1120 address. Returns the length (6), or raises an exception and returns -1 if
1121 an error occurred. */
1122
1123static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001124setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001125{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001126 unsigned int b0, b1, b2, b3, b4, b5;
1127 char ch;
1128 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1131 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1132 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1133 bdaddr->b[0] = b0;
1134 bdaddr->b[1] = b1;
1135 bdaddr->b[2] = b2;
1136 bdaddr->b[3] = b3;
1137 bdaddr->b[4] = b4;
1138 bdaddr->b[5] = b5;
1139 return 6;
1140 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001141 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 return -1;
1143 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144}
1145
1146/* Create a string representation of the Bluetooth address. This is always a
1147 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1148 value (zero padded if necessary). */
1149
1150static PyObject *
1151makebdaddr(bdaddr_t *bdaddr)
1152{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001155 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1156 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1157 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1158 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001159}
1160#endif
1161
1162
Guido van Rossum30a685f1991-06-27 15:51:29 +00001163/* Create an object representing the given socket address,
1164 suitable for passing it back to bind(), connect() etc.
1165 The family field of the sockaddr structure is inspected
1166 to determine what kind of address it really is. */
1167
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001168/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001169static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001170makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001171{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001172 if (addrlen == 0) {
1173 /* No address -- may be recvfrom() from known socket */
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02001174 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001179 case AF_INET:
1180 {
1181 struct sockaddr_in *a;
1182 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1183 PyObject *ret = NULL;
1184 if (addrobj) {
1185 a = (struct sockaddr_in *)addr;
1186 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1187 Py_DECREF(addrobj);
1188 }
1189 return ret;
1190 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001191
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001192#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 case AF_UNIX:
1194 {
1195 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001196#ifdef __linux__
Antoine Pitrou495b5022017-05-02 17:20:00 +02001197 size_t linuxaddrlen = addrlen - offsetof(struct sockaddr_un, sun_path);
1198 if (linuxaddrlen > 0 && a->sun_path[0] == 0) { /* Linux abstract namespace */
1199 return PyBytes_FromStringAndSize(a->sun_path, linuxaddrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 }
1201 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001202#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 {
1204 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001205 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 }
1207 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001208#endif /* AF_UNIX */
1209
Martin v. Löwis11017b12006-01-14 18:12:57 +00001210#if defined(AF_NETLINK)
1211 case AF_NETLINK:
1212 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1214 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001215 }
1216#endif /* AF_NETLINK */
1217
caaveryeffc12f2017-09-06 18:18:10 -04001218#if defined(AF_VSOCK)
1219 case AF_VSOCK:
1220 {
1221 struct sockaddr_vm *a = (struct sockaddr_vm *) addr;
1222 return Py_BuildValue("II", a->svm_cid, a->svm_port);
1223 }
1224#endif /* AF_VSOCK */
1225
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001226#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 case AF_INET6:
1228 {
1229 struct sockaddr_in6 *a;
1230 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1231 PyObject *ret = NULL;
1232 if (addrobj) {
1233 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001234 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 addrobj,
1236 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001237 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 a->sin6_scope_id);
1239 Py_DECREF(addrobj);
1240 }
1241 return ret;
1242 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001243#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001244
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001245#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 case AF_BLUETOOTH:
1247 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 case BTPROTO_L2CAP:
1250 {
1251 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1252 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1253 PyObject *ret = NULL;
1254 if (addrobj) {
1255 ret = Py_BuildValue("Oi",
1256 addrobj,
1257 _BT_L2_MEMB(a, psm));
1258 Py_DECREF(addrobj);
1259 }
1260 return ret;
1261 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 case BTPROTO_RFCOMM:
1264 {
1265 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1266 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1267 PyObject *ret = NULL;
1268 if (addrobj) {
1269 ret = Py_BuildValue("Oi",
1270 addrobj,
1271 _BT_RC_MEMB(a, channel));
1272 Py_DECREF(addrobj);
1273 }
1274 return ret;
1275 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001277 case BTPROTO_HCI:
1278 {
1279 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001280#if defined(__NetBSD__) || defined(__DragonFly__)
1281 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1282#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 PyObject *ret = NULL;
1284 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1285 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001288
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001289#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001290 case BTPROTO_SCO:
1291 {
1292 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1293 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1294 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001295#endif
1296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 default:
1298 PyErr_SetString(PyExc_ValueError,
1299 "Unknown Bluetooth protocol");
1300 return NULL;
1301 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001302#endif
1303
Antoine Pitroub156a462010-10-27 20:13:57 +00001304#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 case AF_PACKET:
1306 {
1307 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1308 char *ifname = "";
1309 struct ifreq ifr;
1310 /* need to look up interface name give index */
1311 if (a->sll_ifindex) {
1312 ifr.ifr_ifindex = a->sll_ifindex;
1313 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1314 ifname = ifr.ifr_name;
1315 }
1316 return Py_BuildValue("shbhy#",
1317 ifname,
1318 ntohs(a->sll_protocol),
1319 a->sll_pkttype,
1320 a->sll_hatype,
1321 a->sll_addr,
1322 a->sll_halen);
1323 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001324#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001325
Christian Heimes043d6f62008-01-07 17:19:16 +00001326#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 case AF_TIPC:
1328 {
1329 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1330 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1331 return Py_BuildValue("IIIII",
1332 a->addrtype,
1333 a->addr.nameseq.type,
1334 a->addr.nameseq.lower,
1335 a->addr.nameseq.upper,
1336 a->scope);
1337 } else if (a->addrtype == TIPC_ADDR_NAME) {
1338 return Py_BuildValue("IIIII",
1339 a->addrtype,
1340 a->addr.name.name.type,
1341 a->addr.name.name.instance,
1342 a->addr.name.name.instance,
1343 a->scope);
1344 } else if (a->addrtype == TIPC_ADDR_ID) {
1345 return Py_BuildValue("IIIII",
1346 a->addrtype,
1347 a->addr.id.node,
1348 a->addr.id.ref,
1349 0,
1350 a->scope);
1351 } else {
1352 PyErr_SetString(PyExc_ValueError,
1353 "Invalid address type");
1354 return NULL;
1355 }
1356 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001357#endif
1358
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001359#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001360 case AF_CAN:
1361 {
1362 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1363 char *ifname = "";
1364 struct ifreq ifr;
1365 /* need to look up interface name given index */
1366 if (a->can_ifindex) {
1367 ifr.ifr_ifindex = a->can_ifindex;
1368 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1369 ifname = ifr.ifr_name;
1370 }
1371
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001372 switch (proto) {
1373#ifdef CAN_ISOTP
1374 case CAN_ISOTP:
1375 {
1376 return Py_BuildValue("O&kk", PyUnicode_DecodeFSDefault,
1377 ifname,
1378 a->can_addr.tp.rx_id,
1379 a->can_addr.tp.tx_id);
1380 }
1381#endif
1382 default:
1383 {
1384 return Py_BuildValue("O&", PyUnicode_DecodeFSDefault,
1385 ifname);
1386 }
1387 }
Charles-François Natali47413c12011-10-06 19:47:44 +02001388 }
1389#endif
1390
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001391#ifdef PF_SYSTEM
1392 case PF_SYSTEM:
1393 switch(proto) {
1394#ifdef SYSPROTO_CONTROL
1395 case SYSPROTO_CONTROL:
1396 {
1397 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1398 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1399 }
1400#endif
1401 default:
1402 PyErr_SetString(PyExc_ValueError,
1403 "Invalid address type");
1404 return 0;
1405 }
1406#endif
1407
Christian Heimesdffa3942016-09-05 23:54:41 +02001408#ifdef HAVE_SOCKADDR_ALG
1409 case AF_ALG:
1410 {
1411 struct sockaddr_alg *a = (struct sockaddr_alg *)addr;
1412 return Py_BuildValue("s#s#HH",
1413 a->salg_type,
1414 strnlen((const char*)a->salg_type,
1415 sizeof(a->salg_type)),
1416 a->salg_name,
1417 strnlen((const char*)a->salg_name,
1418 sizeof(a->salg_name)),
1419 a->salg_feat,
1420 a->salg_mask);
1421 }
1422#endif
1423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 default:
1427 /* If we don't know the address family, don't raise an
1428 exception -- return it as an (int, bytes) tuple. */
1429 return Py_BuildValue("iy#",
1430 addr->sa_family,
1431 addr->sa_data,
1432 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435}
1436
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001437/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1438 (in particular, numeric IP addresses). */
1439struct maybe_idna {
1440 PyObject *obj;
1441 char *buf;
1442};
1443
1444static void
1445idna_cleanup(struct maybe_idna *data)
1446{
1447 Py_CLEAR(data->obj);
1448}
1449
1450static int
1451idna_converter(PyObject *obj, struct maybe_idna *data)
1452{
1453 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001454 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001455 if (obj == NULL) {
1456 idna_cleanup(data);
1457 return 1;
1458 }
1459 data->obj = NULL;
1460 len = -1;
1461 if (PyBytes_Check(obj)) {
1462 data->buf = PyBytes_AsString(obj);
1463 len = PyBytes_Size(obj);
1464 }
1465 else if (PyByteArray_Check(obj)) {
1466 data->buf = PyByteArray_AsString(obj);
1467 len = PyByteArray_Size(obj);
1468 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001469 else if (PyUnicode_Check(obj)) {
Serhiy Storchakae3b2b4b2017-09-08 09:58:51 +03001470 if (PyUnicode_READY(obj) == -1) {
1471 return 0;
1472 }
1473 if (PyUnicode_IS_COMPACT_ASCII(obj)) {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001474 data->buf = PyUnicode_DATA(obj);
1475 len = PyUnicode_GET_LENGTH(obj);
1476 }
1477 else {
1478 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1479 if (!obj2) {
1480 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1481 return 0;
1482 }
1483 assert(PyBytes_Check(obj2));
1484 data->obj = obj2;
1485 data->buf = PyBytes_AS_STRING(obj2);
1486 len = PyBytes_GET_SIZE(obj2);
1487 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001488 }
1489 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001490 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1491 obj->ob_type->tp_name);
1492 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001493 }
1494 if (strlen(data->buf) != len) {
1495 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001496 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001497 return 0;
1498 }
1499 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001500}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001501
1502/* Parse a socket address argument according to the socket object's
1503 address family. Return 1 if the address was in the proper format,
1504 0 of not. The address is returned through addr_ret, its length
1505 through len_ret. */
1506
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001507static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001508getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001509 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001512
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001513#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 case AF_UNIX:
1515 {
1516 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001517 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001518 int retval = 0;
1519
1520 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1521 allow embedded nulls on Linux. */
1522 if (PyUnicode_Check(args)) {
1523 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1524 return 0;
1525 }
1526 else
1527 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001528 if (!PyArg_Parse(args, "y*", &path)) {
1529 Py_DECREF(args);
1530 return retval;
1531 }
1532 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 addr = (struct sockaddr_un*)addr_ret;
Benjamin Petersonb6c34582016-09-07 14:08:34 -07001535#ifdef __linux__
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001536 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001538 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001539 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001541 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 }
1543 }
1544 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001545#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 {
1547 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001548 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001549 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001551 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001553 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001554 }
1555 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001556 memcpy(addr->sun_path, path.buf, path.len);
1557 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001558 retval = 1;
1559 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001560 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001561 Py_DECREF(args);
1562 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001564#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001565
Martin v. Löwis11017b12006-01-14 18:12:57 +00001566#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 case AF_NETLINK:
1568 {
1569 struct sockaddr_nl* addr;
1570 int pid, groups;
1571 addr = (struct sockaddr_nl *)addr_ret;
1572 if (!PyTuple_Check(args)) {
1573 PyErr_Format(
1574 PyExc_TypeError,
1575 "getsockaddrarg: "
1576 "AF_NETLINK address must be tuple, not %.500s",
1577 Py_TYPE(args)->tp_name);
1578 return 0;
1579 }
1580 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1581 return 0;
1582 addr->nl_family = AF_NETLINK;
1583 addr->nl_pid = pid;
1584 addr->nl_groups = groups;
1585 *len_ret = sizeof(*addr);
1586 return 1;
1587 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001588#endif
1589
caaveryeffc12f2017-09-06 18:18:10 -04001590#if defined(AF_VSOCK)
1591 case AF_VSOCK:
1592 {
1593 struct sockaddr_vm* addr;
1594 int port, cid;
1595 addr = (struct sockaddr_vm *)addr_ret;
1596 memset(addr, 0, sizeof(struct sockaddr_vm));
1597 if (!PyTuple_Check(args)) {
1598 PyErr_Format(
1599 PyExc_TypeError,
1600 "getsockaddrarg: "
1601 "AF_VSOCK address must be tuple, not %.500s",
1602 Py_TYPE(args)->tp_name);
1603 return 0;
1604 }
1605 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &cid, &port))
1606 return 0;
1607 addr->svm_family = s->sock_family;
1608 addr->svm_port = port;
1609 addr->svm_cid = cid;
1610 *len_ret = sizeof(*addr);
1611 return 1;
1612 }
1613#endif
1614
1615
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001616#ifdef AF_RDS
1617 case AF_RDS:
1618 /* RDS sockets use sockaddr_in: fall-through */
1619#endif
1620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 case AF_INET:
1622 {
1623 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001624 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 int port, result;
1626 if (!PyTuple_Check(args)) {
1627 PyErr_Format(
1628 PyExc_TypeError,
1629 "getsockaddrarg: "
1630 "AF_INET address must be tuple, not %.500s",
1631 Py_TYPE(args)->tp_name);
1632 return 0;
1633 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001634 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1635 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 return 0;
1637 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001638 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001640 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 if (result < 0)
1642 return 0;
1643 if (port < 0 || port > 0xffff) {
1644 PyErr_SetString(
1645 PyExc_OverflowError,
1646 "getsockaddrarg: port must be 0-65535.");
1647 return 0;
1648 }
1649 addr->sin_family = AF_INET;
1650 addr->sin_port = htons((short)port);
1651 *len_ret = sizeof *addr;
1652 return 1;
1653 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001654
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001655#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 case AF_INET6:
1657 {
1658 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001659 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001660 int port, result;
1661 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 flowinfo = scope_id = 0;
1663 if (!PyTuple_Check(args)) {
1664 PyErr_Format(
1665 PyExc_TypeError,
1666 "getsockaddrarg: "
1667 "AF_INET6 address must be tuple, not %.500s",
1668 Py_TYPE(args)->tp_name);
1669 return 0;
1670 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001671 if (!PyArg_ParseTuple(args, "O&i|II",
1672 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 &scope_id)) {
1674 return 0;
1675 }
1676 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001677 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001679 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 if (result < 0)
1681 return 0;
1682 if (port < 0 || port > 0xffff) {
1683 PyErr_SetString(
1684 PyExc_OverflowError,
1685 "getsockaddrarg: port must be 0-65535.");
1686 return 0;
1687 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001688 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001689 PyErr_SetString(
1690 PyExc_OverflowError,
1691 "getsockaddrarg: flowinfo must be 0-1048575.");
1692 return 0;
1693 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 addr->sin6_family = s->sock_family;
1695 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001696 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 addr->sin6_scope_id = scope_id;
1698 *len_ret = sizeof *addr;
1699 return 1;
1700 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001701#endif
1702
Hye-Shik Chang81268602004-02-02 06:05:24 +00001703#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 case AF_BLUETOOTH:
1705 {
1706 switch (s->sock_proto) {
1707 case BTPROTO_L2CAP:
1708 {
1709 struct sockaddr_l2 *addr;
1710 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001712 addr = (struct sockaddr_l2 *)addr_ret;
1713 memset(addr, 0, sizeof(struct sockaddr_l2));
1714 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1715 if (!PyArg_ParseTuple(args, "si", &straddr,
1716 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001717 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 "wrong format");
1719 return 0;
1720 }
1721 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1722 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 *len_ret = sizeof *addr;
1725 return 1;
1726 }
1727 case BTPROTO_RFCOMM:
1728 {
1729 struct sockaddr_rc *addr;
1730 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 addr = (struct sockaddr_rc *)addr_ret;
1733 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1734 if (!PyArg_ParseTuple(args, "si", &straddr,
1735 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001736 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 "wrong format");
1738 return 0;
1739 }
1740 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1741 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 *len_ret = sizeof *addr;
1744 return 1;
1745 }
1746 case BTPROTO_HCI:
1747 {
1748 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001749#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001750 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001751
Alexander Belopolskye239d232010-12-08 23:31:48 +00001752 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001753 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001754 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001755 "wrong format");
1756 return 0;
1757 }
1758 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1759 return 0;
1760#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1762 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001763 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 "wrong format");
1765 return 0;
1766 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 *len_ret = sizeof *addr;
1769 return 1;
1770 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001771#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001772 case BTPROTO_SCO:
1773 {
1774 struct sockaddr_sco *addr;
1775 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 addr = (struct sockaddr_sco *)addr_ret;
1778 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1779 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001780 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 "wrong format");
1782 return 0;
1783 }
1784 straddr = PyBytes_AS_STRING(args);
1785 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1786 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 *len_ret = sizeof *addr;
1789 return 1;
1790 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001793 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 return 0;
1795 }
1796 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001797#endif
1798
Antoine Pitroub156a462010-10-27 20:13:57 +00001799#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 case AF_PACKET:
1801 {
1802 struct sockaddr_ll* addr;
1803 struct ifreq ifr;
1804 char *interfaceName;
1805 int protoNumber;
1806 int hatype = 0;
1807 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001808 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 if (!PyTuple_Check(args)) {
1811 PyErr_Format(
1812 PyExc_TypeError,
1813 "getsockaddrarg: "
1814 "AF_PACKET address must be tuple, not %.500s",
1815 Py_TYPE(args)->tp_name);
1816 return 0;
1817 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001818 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001820 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001821 return 0;
1822 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1823 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1824 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1825 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001826 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001827 return 0;
1828 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001829 if (haddr.buf && haddr.len > 8) {
1830 PyErr_SetString(PyExc_ValueError,
1831 "Hardware address must be 8 bytes or less");
1832 PyBuffer_Release(&haddr);
1833 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 }
1835 if (protoNumber < 0 || protoNumber > 0xffff) {
1836 PyErr_SetString(
1837 PyExc_OverflowError,
1838 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001839 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 return 0;
1841 }
1842 addr = (struct sockaddr_ll*)addr_ret;
1843 addr->sll_family = AF_PACKET;
1844 addr->sll_protocol = htons((short)protoNumber);
1845 addr->sll_ifindex = ifr.ifr_ifindex;
1846 addr->sll_pkttype = pkttype;
1847 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001848 if (haddr.buf) {
1849 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1850 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001852 else
1853 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001855 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 return 1;
1857 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001858#endif
1859
Christian Heimes043d6f62008-01-07 17:19:16 +00001860#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 case AF_TIPC:
1862 {
1863 unsigned int atype, v1, v2, v3;
1864 unsigned int scope = TIPC_CLUSTER_SCOPE;
1865 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 if (!PyTuple_Check(args)) {
1868 PyErr_Format(
1869 PyExc_TypeError,
1870 "getsockaddrarg: "
1871 "AF_TIPC address must be tuple, not %.500s",
1872 Py_TYPE(args)->tp_name);
1873 return 0;
1874 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001876 if (!PyArg_ParseTuple(args,
1877 "IIII|I;Invalid TIPC address format",
1878 &atype, &v1, &v2, &v3, &scope))
1879 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001881 addr = (struct sockaddr_tipc *) addr_ret;
1882 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001884 addr->family = AF_TIPC;
1885 addr->scope = scope;
1886 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 if (atype == TIPC_ADDR_NAMESEQ) {
1889 addr->addr.nameseq.type = v1;
1890 addr->addr.nameseq.lower = v2;
1891 addr->addr.nameseq.upper = v3;
1892 } else if (atype == TIPC_ADDR_NAME) {
1893 addr->addr.name.name.type = v1;
1894 addr->addr.name.name.instance = v2;
1895 } else if (atype == TIPC_ADDR_ID) {
1896 addr->addr.id.node = v1;
1897 addr->addr.id.ref = v2;
1898 } else {
1899 /* Shouldn't happen */
1900 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1901 return 0;
1902 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001904 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001906 return 1;
1907 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001908#endif
1909
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001910#ifdef AF_CAN
1911
1912#if defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001913 case AF_CAN:
1914 switch (s->sock_proto) {
1915 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001916 /* fall-through */
1917 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001918 {
1919 struct sockaddr_can *addr;
1920 PyObject *interfaceName;
1921 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001922 Py_ssize_t len;
Benjamin Peterson18b71912013-05-16 15:29:44 -05001923 addr = (struct sockaddr_can *)addr_ret;
1924
Charles-François Natali47413c12011-10-06 19:47:44 +02001925 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1926 &interfaceName))
1927 return 0;
1928
1929 len = PyBytes_GET_SIZE(interfaceName);
1930
1931 if (len == 0) {
1932 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001933 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001934 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1935 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001936 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1937 s->errorhandler();
1938 Py_DECREF(interfaceName);
1939 return 0;
1940 }
1941 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001942 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001943 "AF_CAN interface name too long");
1944 Py_DECREF(interfaceName);
1945 return 0;
1946 }
1947
1948 addr->can_family = AF_CAN;
1949 addr->can_ifindex = ifr.ifr_ifindex;
1950
1951 *len_ret = sizeof(*addr);
1952 Py_DECREF(interfaceName);
1953 return 1;
1954 }
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001955#endif
1956
1957#ifdef CAN_ISOTP
1958 case CAN_ISOTP:
1959 {
1960 struct sockaddr_can *addr;
1961 PyObject *interfaceName;
1962 struct ifreq ifr;
1963 Py_ssize_t len;
1964 unsigned long int rx_id, tx_id;
1965
1966 addr = (struct sockaddr_can *)addr_ret;
1967
1968 if (!PyArg_ParseTuple(args, "O&kk", PyUnicode_FSConverter,
1969 &interfaceName,
1970 &rx_id,
1971 &tx_id))
1972 return 0;
1973
1974 len = PyBytes_GET_SIZE(interfaceName);
1975
1976 if (len == 0) {
1977 ifr.ifr_ifindex = 0;
1978 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
1979 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1980 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1981 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1982 s->errorhandler();
1983 Py_DECREF(interfaceName);
1984 return 0;
1985 }
1986 } else {
1987 PyErr_SetString(PyExc_OSError,
1988 "AF_CAN interface name too long");
1989 Py_DECREF(interfaceName);
1990 return 0;
1991 }
1992
1993 addr->can_family = AF_CAN;
1994 addr->can_ifindex = ifr.ifr_ifindex;
1995 addr->can_addr.tp.rx_id = rx_id;
1996 addr->can_addr.tp.tx_id = tx_id;
1997
1998 *len_ret = sizeof(*addr);
1999 Py_DECREF(interfaceName);
2000 return 1;
2001 }
2002#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002003 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002004 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02002005 "getsockaddrarg: unsupported CAN protocol");
2006 return 0;
2007 }
2008#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002009
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002010#ifdef PF_SYSTEM
2011 case PF_SYSTEM:
2012 switch (s->sock_proto) {
2013#ifdef SYSPROTO_CONTROL
2014 case SYSPROTO_CONTROL:
2015 {
2016 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02002017
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002018 addr = (struct sockaddr_ctl *)addr_ret;
2019 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02002020 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002021
2022 if (PyUnicode_Check(args)) {
2023 struct ctl_info info;
2024 PyObject *ctl_name;
2025
2026 if (!PyArg_Parse(args, "O&",
2027 PyUnicode_FSConverter, &ctl_name)) {
2028 return 0;
2029 }
2030
Victor Stinnerf50e1872015-03-20 11:32:24 +01002031 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002032 PyErr_SetString(PyExc_ValueError,
2033 "provided string is too long");
2034 Py_DECREF(ctl_name);
2035 return 0;
2036 }
2037 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
2038 sizeof(info.ctl_name));
2039 Py_DECREF(ctl_name);
2040
2041 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
2042 PyErr_SetString(PyExc_OSError,
2043 "cannot find kernel control with provided name");
2044 return 0;
2045 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002046
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002047 addr->sc_id = info.ctl_id;
2048 addr->sc_unit = 0;
2049 } else if (!PyArg_ParseTuple(args, "II",
2050 &(addr->sc_id), &(addr->sc_unit))) {
2051 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
2052 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02002053
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002054 return 0;
2055 }
Victor Stinnera534fc42013-06-03 22:07:27 +02002056
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002057 *len_ret = sizeof(*addr);
2058 return 1;
2059 }
2060#endif
2061 default:
2062 PyErr_SetString(PyExc_OSError,
2063 "getsockaddrarg: unsupported PF_SYSTEM protocol");
2064 return 0;
2065 }
2066#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002067#ifdef HAVE_SOCKADDR_ALG
2068 case AF_ALG:
2069 {
2070 struct sockaddr_alg *sa;
2071 char *type;
2072 char *name;
2073 sa = (struct sockaddr_alg *)addr_ret;
2074
2075 memset(sa, 0, sizeof(*sa));
2076 sa->salg_family = AF_ALG;
2077
2078 if (!PyArg_ParseTuple(args, "ss|HH:getsockaddrarg",
2079 &type, &name, &sa->salg_feat, &sa->salg_mask))
2080 return 0;
2081 /* sockaddr_alg has fixed-sized char arrays for type and name */
2082 if (strlen(type) > sizeof(sa->salg_type)) {
2083 PyErr_SetString(PyExc_ValueError, "AF_ALG type too long.");
2084 return 0;
2085 }
2086 strncpy((char *)sa->salg_type, type, sizeof(sa->salg_type));
2087 if (strlen(name) > sizeof(sa->salg_name)) {
2088 PyErr_SetString(PyExc_ValueError, "AF_ALG name too long.");
2089 return 0;
2090 }
2091 strncpy((char *)sa->salg_name, name, sizeof(sa->salg_name));
2092
2093 *len_ret = sizeof(*sa);
2094 return 1;
2095 }
2096#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002098 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002100 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002101 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00002103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002104 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002105}
2106
Guido van Rossum30a685f1991-06-27 15:51:29 +00002107
Guido van Rossum48a680c2001-03-02 06:34:14 +00002108/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00002109 Return 1 if the family is known, 0 otherwise. The length is returned
2110 through len_ret. */
2111
2112static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00002113getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00002114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002115 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00002116
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00002117#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 case AF_UNIX:
2119 {
2120 *len_ret = sizeof (struct sockaddr_un);
2121 return 1;
2122 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002123#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00002124
Martin v. Löwis11017b12006-01-14 18:12:57 +00002125#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00002126 case AF_NETLINK:
2127 {
2128 *len_ret = sizeof (struct sockaddr_nl);
2129 return 1;
2130 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00002131#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00002132
caaveryeffc12f2017-09-06 18:18:10 -04002133#if defined(AF_VSOCK)
2134 case AF_VSOCK:
2135 {
2136 *len_ret = sizeof (struct sockaddr_vm);
2137 return 1;
2138 }
2139#endif
2140
Charles-François Natali10b8cf42011-11-10 19:21:37 +01002141#ifdef AF_RDS
2142 case AF_RDS:
2143 /* RDS sockets use sockaddr_in: fall-through */
2144#endif
2145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 case AF_INET:
2147 {
2148 *len_ret = sizeof (struct sockaddr_in);
2149 return 1;
2150 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002151
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00002152#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 case AF_INET6:
2154 {
2155 *len_ret = sizeof (struct sockaddr_in6);
2156 return 1;
2157 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00002158#endif
2159
Hye-Shik Chang81268602004-02-02 06:05:24 +00002160#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 case AF_BLUETOOTH:
2162 {
2163 switch(s->sock_proto)
2164 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002166 case BTPROTO_L2CAP:
2167 *len_ret = sizeof (struct sockaddr_l2);
2168 return 1;
2169 case BTPROTO_RFCOMM:
2170 *len_ret = sizeof (struct sockaddr_rc);
2171 return 1;
2172 case BTPROTO_HCI:
2173 *len_ret = sizeof (struct sockaddr_hci);
2174 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002175#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 case BTPROTO_SCO:
2177 *len_ret = sizeof (struct sockaddr_sco);
2178 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002181 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 "unknown BT protocol");
2183 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002185 }
2186 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002187#endif
2188
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002189#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002190 case AF_PACKET:
2191 {
2192 *len_ret = sizeof (struct sockaddr_ll);
2193 return 1;
2194 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002195#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002196
Christian Heimes043d6f62008-01-07 17:19:16 +00002197#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 case AF_TIPC:
2199 {
2200 *len_ret = sizeof (struct sockaddr_tipc);
2201 return 1;
2202 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002203#endif
2204
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002205#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002206 case AF_CAN:
2207 {
2208 *len_ret = sizeof (struct sockaddr_can);
2209 return 1;
2210 }
2211#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002212
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002213#ifdef PF_SYSTEM
2214 case PF_SYSTEM:
2215 switch(s->sock_proto) {
2216#ifdef SYSPROTO_CONTROL
2217 case SYSPROTO_CONTROL:
2218 *len_ret = sizeof (struct sockaddr_ctl);
2219 return 1;
2220#endif
2221 default:
2222 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2223 "unknown PF_SYSTEM protocol");
2224 return 0;
2225 }
2226#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02002227#ifdef HAVE_SOCKADDR_ALG
2228 case AF_ALG:
2229 {
2230 *len_ret = sizeof (struct sockaddr_alg);
2231 return 1;
2232 }
2233#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002238 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002239 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002242}
2243
2244
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002245/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2246 Currently, these methods are only compiled if the RFC 2292/3542
2247 CMSG_LEN() macro is available. Older systems seem to have used
2248 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2249 it may be possible to define CMSG_LEN() that way if it's not
2250 provided. Some architectures might need extra padding after the
2251 cmsghdr, however, and CMSG_LEN() would have to take account of
2252 this. */
2253#ifdef CMSG_LEN
2254/* If length is in range, set *result to CMSG_LEN(length) and return
2255 true; otherwise, return false. */
2256static int
2257get_CMSG_LEN(size_t length, size_t *result)
2258{
2259 size_t tmp;
2260
2261 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2262 return 0;
2263 tmp = CMSG_LEN(length);
2264 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2265 return 0;
2266 *result = tmp;
2267 return 1;
2268}
2269
2270#ifdef CMSG_SPACE
2271/* If length is in range, set *result to CMSG_SPACE(length) and return
2272 true; otherwise, return false. */
2273static int
2274get_CMSG_SPACE(size_t length, size_t *result)
2275{
2276 size_t tmp;
2277
2278 /* Use CMSG_SPACE(1) here in order to take account of the padding
2279 necessary before *and* after the data. */
2280 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2281 return 0;
2282 tmp = CMSG_SPACE(length);
2283 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2284 return 0;
2285 *result = tmp;
2286 return 1;
2287}
2288#endif
2289
2290/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2291 pointer in msg->msg_control with at least "space" bytes after it,
2292 and its cmsg_len member inside the buffer. */
2293static int
2294cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2295{
2296 size_t cmsg_offset;
2297 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2298 sizeof(cmsgh->cmsg_len));
2299
Charles-François Natali466517d2011-08-28 18:23:43 +02002300 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002301 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002302 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002303 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2304 annoying under OS X as it's unsigned there and so it triggers a
2305 tautological comparison warning under Clang when compared against 0.
2306 Since the check is valid on other platforms, silence the warning under
2307 Clang. */
2308 #ifdef __clang__
2309 #pragma clang diagnostic push
2310 #pragma clang diagnostic ignored "-Wtautological-compare"
2311 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002312 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002313 #pragma GCC diagnostic push
2314 #pragma GCC diagnostic ignored "-Wtype-limits"
2315 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002316 if (msg->msg_controllen < 0)
2317 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002318 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002319 #pragma GCC diagnostic pop
2320 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002321 #ifdef __clang__
2322 #pragma clang diagnostic pop
2323 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002324 if (space < cmsg_len_end)
2325 space = cmsg_len_end;
2326 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2327 return (cmsg_offset <= (size_t)-1 - space &&
2328 cmsg_offset + space <= msg->msg_controllen);
2329}
2330
2331/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2332 *space to number of bytes following it in the buffer and return
2333 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2334 msg->msg_controllen are valid. */
2335static int
2336get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2337{
2338 size_t data_offset;
2339 char *data_ptr;
2340
2341 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2342 return 0;
2343 data_offset = data_ptr - (char *)msg->msg_control;
2344 if (data_offset > msg->msg_controllen)
2345 return 0;
2346 *space = msg->msg_controllen - data_offset;
2347 return 1;
2348}
2349
2350/* If cmsgh is invalid or not contained in the buffer pointed to by
2351 msg->msg_control, return -1. If cmsgh is valid and its associated
2352 data is entirely contained in the buffer, set *data_len to the
2353 length of the associated data and return 0. If only part of the
2354 associated data is contained in the buffer but cmsgh is otherwise
2355 valid, set *data_len to the length contained in the buffer and
2356 return 1. */
2357static int
2358get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2359{
2360 size_t space, cmsg_data_len;
2361
2362 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2363 cmsgh->cmsg_len < CMSG_LEN(0))
2364 return -1;
2365 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2366 if (!get_cmsg_data_space(msg, cmsgh, &space))
2367 return -1;
2368 if (space >= cmsg_data_len) {
2369 *data_len = cmsg_data_len;
2370 return 0;
2371 }
2372 *data_len = space;
2373 return 1;
2374}
2375#endif /* CMSG_LEN */
2376
2377
Victor Stinner31bf2d52015-04-01 21:57:09 +02002378struct sock_accept {
2379 socklen_t *addrlen;
2380 sock_addr_t *addrbuf;
2381 SOCKET_T result;
2382};
2383
2384#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2385/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2386static int accept4_works = -1;
2387#endif
2388
2389static int
2390sock_accept_impl(PySocketSockObject *s, void *data)
2391{
2392 struct sock_accept *ctx = data;
Christian Heimesdffa3942016-09-05 23:54:41 +02002393 struct sockaddr *addr = SAS2SA(ctx->addrbuf);
2394 socklen_t *paddrlen = ctx->addrlen;
2395#ifdef HAVE_SOCKADDR_ALG
2396 /* AF_ALG does not support accept() with addr and raises
2397 * ECONNABORTED instead. */
2398 if (s->sock_family == AF_ALG) {
2399 addr = NULL;
2400 paddrlen = NULL;
2401 *ctx->addrlen = 0;
2402 }
2403#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002404
2405#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2406 if (accept4_works != 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02002407 ctx->result = accept4(s->sock_fd, addr, paddrlen,
Victor Stinner31bf2d52015-04-01 21:57:09 +02002408 SOCK_CLOEXEC);
2409 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2410 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2411 accept4_works = (errno != ENOSYS);
2412 }
2413 }
2414 if (accept4_works == 0)
Christian Heimesdffa3942016-09-05 23:54:41 +02002415 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002416#else
Christian Heimesdffa3942016-09-05 23:54:41 +02002417 ctx->result = accept(s->sock_fd, addr, paddrlen);
Victor Stinner31bf2d52015-04-01 21:57:09 +02002418#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002419
2420#ifdef MS_WINDOWS
2421 return (ctx->result != INVALID_SOCKET);
2422#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002423 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002424#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002425}
2426
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002427/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002428
Guido van Rossum73624e91994-10-10 17:59:00 +00002429static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002430sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002433 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 socklen_t addrlen;
2435 PyObject *sock = NULL;
2436 PyObject *addr = NULL;
2437 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002438 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 if (!getsockaddrlen(s, &addrlen))
2441 return NULL;
2442 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 if (!IS_SELECTABLE(s))
2445 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002446
Victor Stinner31bf2d52015-04-01 21:57:09 +02002447 ctx.addrlen = &addrlen;
2448 ctx.addrbuf = &addrbuf;
2449 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002451 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002452
Victor Stinnerdaf45552013-08-28 00:53:59 +02002453#ifdef MS_WINDOWS
2454 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2455 PyErr_SetFromWindowsErr(0);
2456 SOCKETCLOSE(newfd);
2457 goto finally;
2458 }
2459#else
2460
2461#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2462 if (!accept4_works)
2463#endif
2464 {
2465 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2466 SOCKETCLOSE(newfd);
2467 goto finally;
2468 }
2469 }
2470#endif
2471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 sock = PyLong_FromSocket_t(newfd);
2473 if (sock == NULL) {
2474 SOCKETCLOSE(newfd);
2475 goto finally;
2476 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2479 addrlen, s->sock_proto);
2480 if (addr == NULL)
2481 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002483 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002484
Guido van Rossum67f7a382002-06-06 21:08:16 +00002485finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 Py_XDECREF(sock);
2487 Py_XDECREF(addr);
2488 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002489}
2490
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002491PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002492"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002493\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002494Wait for an incoming connection. Return a new socket file descriptor\n\
2495representing the connection, and the address of the client.\n\
2496For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002497
Guido van Rossum11ba0942002-06-13 15:07:44 +00002498/* s.setblocking(flag) method. Argument:
2499 False -- non-blocking mode; same as settimeout(0)
2500 True -- blocking mode; same as settimeout(None)
2501*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002502
Guido van Rossum73624e91994-10-10 17:59:00 +00002503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002504sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002505{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002506 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 block = PyLong_AsLong(arg);
2509 if (block == -1 && PyErr_Occurred())
2510 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002511
Victor Stinner9001d802015-04-06 23:06:01 +02002512 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002513 if (internal_setblocking(s, block) == -1) {
2514 return NULL;
2515 }
2516 Py_RETURN_NONE;
Guido van Rossume4485b01994-09-07 14:32:49 +00002517}
Guido van Rossume4485b01994-09-07 14:32:49 +00002518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002520"setblocking(flag)\n\
2521\n\
2522Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002523setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002525
Victor Stinner71694d52015-03-28 01:18:54 +01002526static int
2527socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2528{
2529#ifdef MS_WINDOWS
2530 struct timeval tv;
2531#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002532#ifndef HAVE_POLL
2533 _PyTime_t ms;
2534#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002535 int overflow = 0;
2536
2537 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002538 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002539 return 0;
2540 }
2541
Victor Stinner869e1772015-03-30 03:49:14 +02002542 if (_PyTime_FromSecondsObject(timeout,
2543 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002544 return -1;
2545
2546 if (*timeout < 0) {
2547 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2548 return -1;
2549 }
2550
2551#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002552 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002553#endif
2554#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002555 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2556 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002557#endif
2558 if (overflow) {
2559 PyErr_SetString(PyExc_OverflowError,
2560 "timeout doesn't fit into C timeval");
2561 return -1;
2562 }
2563
2564 return 0;
2565}
2566
Guido van Rossum11ba0942002-06-13 15:07:44 +00002567/* s.settimeout(timeout) method. Argument:
2568 None -- no timeout, blocking mode; same as setblocking(True)
2569 0.0 -- non-blocking mode; same as setblocking(False)
2570 > 0 -- timeout mode; operations time out after timeout seconds
2571 < 0 -- illegal; raises an exception
2572*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002573static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002574sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002575{
Victor Stinner71694d52015-03-28 01:18:54 +01002576 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002577
Victor Stinner71694d52015-03-28 01:18:54 +01002578 if (socket_parse_timeout(&timeout, arg) < 0)
2579 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 s->sock_timeout = timeout;
Christian Heimes0b9d64e2016-09-09 00:28:57 +02002582 if (internal_setblocking(s, timeout < 0) == -1) {
2583 return NULL;
2584 }
2585 Py_RETURN_NONE;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002586}
2587
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002589"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002590\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002591Set a timeout on socket operations. 'timeout' can be a float,\n\
2592giving in seconds, or None. Setting a timeout of None disables\n\
2593the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002594Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002595
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002596/* s.gettimeout() method.
2597 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002598static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002599sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002600{
Victor Stinner71694d52015-03-28 01:18:54 +01002601 if (s->sock_timeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002602 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 }
Victor Stinner71694d52015-03-28 01:18:54 +01002604 else {
2605 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2606 return PyFloat_FromDouble(seconds);
2607 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002608}
2609
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002610PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002611"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002612\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002613Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002614operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002615operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002616
Guido van Rossumaee08791992-09-08 09:05:33 +00002617/* s.setsockopt() method.
Christian Heimesdffa3942016-09-05 23:54:41 +02002618 With an integer third argument, sets an integer optval with optlen=4.
2619 With None as third argument and an integer fourth argument, set
2620 optval=NULL with unsigned int as optlen.
Guido van Rossumaee08791992-09-08 09:05:33 +00002621 With a string third argument, sets an option from a buffer;
Christian Heimesdffa3942016-09-05 23:54:41 +02002622 use optional built-in module 'struct' to encode the string.
2623*/
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002624
Guido van Rossum73624e91994-10-10 17:59:00 +00002625static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002626sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002627{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 int level;
2629 int optname;
2630 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002631 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 int flag;
Christian Heimesdffa3942016-09-05 23:54:41 +02002633 unsigned int optlen;
2634 PyObject *none;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002635
caaveryeffc12f2017-09-06 18:18:10 -04002636#ifdef AF_VSOCK
2637 if (s->sock_family == AF_VSOCK) {
2638 uint64_t vflag; // Must be set width of 64 bits
2639 /* setsockopt(level, opt, flag) */
2640 if (PyArg_ParseTuple(args, "iiK:setsockopt",
2641 &level, &optname, &vflag)) {
2642 // level should always be set to AF_VSOCK
2643 res = setsockopt(s->sock_fd, level, optname,
2644 (void*)&vflag, sizeof vflag);
2645 goto done;
2646 }
2647 return NULL;
2648 }
2649#endif
2650
Christian Heimesdffa3942016-09-05 23:54:41 +02002651 /* setsockopt(level, opt, flag) */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 if (PyArg_ParseTuple(args, "iii:setsockopt",
2653 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002654 res = setsockopt(s->sock_fd, level, optname,
2655 (char*)&flag, sizeof flag);
Christian Heimesdffa3942016-09-05 23:54:41 +02002656 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002658
2659 PyErr_Clear();
Christian Heimes8c21ab02016-09-06 00:07:02 +02002660 /* setsockopt(level, opt, None, flag) */
Christian Heimesdffa3942016-09-05 23:54:41 +02002661 if (PyArg_ParseTuple(args, "iiO!I:setsockopt",
2662 &level, &optname, Py_TYPE(Py_None), &none, &optlen)) {
2663 assert(sizeof(socklen_t) >= sizeof(unsigned int));
Victor Stinnercc739322016-03-23 21:35:29 +01002664 res = setsockopt(s->sock_fd, level, optname,
Christian Heimesdffa3942016-09-05 23:54:41 +02002665 NULL, (socklen_t)optlen);
2666 goto done;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 }
Christian Heimesdffa3942016-09-05 23:54:41 +02002668
2669 PyErr_Clear();
2670 /* setsockopt(level, opt, buffer) */
2671 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2672 &level, &optname, &optval))
2673 return NULL;
2674
2675#ifdef MS_WINDOWS
2676 if (optval.len > INT_MAX) {
2677 PyBuffer_Release(&optval);
2678 PyErr_Format(PyExc_OverflowError,
2679 "socket option is larger than %i bytes",
2680 INT_MAX);
2681 return NULL;
2682 }
2683 res = setsockopt(s->sock_fd, level, optname,
2684 optval.buf, (int)optval.len);
2685#else
2686 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2687#endif
2688 PyBuffer_Release(&optval);
2689
2690done:
Victor Stinnercc739322016-03-23 21:35:29 +01002691 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002693 }
2694
2695 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002696}
2697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698PyDoc_STRVAR(setsockopt_doc,
Christian Heimesdffa3942016-09-05 23:54:41 +02002699"setsockopt(level, option, value: int)\n\
2700setsockopt(level, option, value: buffer)\n\
2701setsockopt(level, option, None, optlen: int)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002702\n\
2703Set a socket option. See the Unix manual for level and option.\n\
Christian Heimesdffa3942016-09-05 23:54:41 +02002704The value argument can either be an integer, a string buffer, or \n\
2705None, optlen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002707
Guido van Rossumaee08791992-09-08 09:05:33 +00002708/* s.getsockopt() method.
2709 With two arguments, retrieves an integer option.
2710 With a third integer argument, retrieves a string buffer of that size;
2711 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002712
Guido van Rossum73624e91994-10-10 17:59:00 +00002713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002714sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 int level;
2717 int optname;
2718 int res;
2719 PyObject *buf;
2720 socklen_t buflen = 0;
caaveryeffc12f2017-09-06 18:18:10 -04002721 int flag = 0;
2722 socklen_t flagsize;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2725 &level, &optname, &buflen))
2726 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 if (buflen == 0) {
caaveryeffc12f2017-09-06 18:18:10 -04002729#ifdef AF_VSOCK
2730 if (s->sock_family == AF_VSOCK) {
2731 uint64_t vflag = 0; // Must be set width of 64 bits
2732 flagsize = sizeof vflag;
2733 res = getsockopt(s->sock_fd, level, optname,
2734 (void *)&vflag, &flagsize);
2735 if (res < 0)
2736 return s->errorhandler();
2737 return PyLong_FromUnsignedLong(vflag);
2738 }
2739#endif
2740 flagsize = sizeof flag;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 res = getsockopt(s->sock_fd, level, optname,
2742 (void *)&flag, &flagsize);
2743 if (res < 0)
2744 return s->errorhandler();
2745 return PyLong_FromLong(flag);
2746 }
caaveryeffc12f2017-09-06 18:18:10 -04002747#ifdef AF_VSOCK
2748 if (s->sock_family == AF_VSOCK) {
2749 PyErr_SetString(PyExc_OSError,
2750 "getsockopt string buffer not allowed");
2751 return NULL;
2752 }
2753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002755 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 "getsockopt buflen out of range");
2757 return NULL;
2758 }
2759 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2760 if (buf == NULL)
2761 return NULL;
2762 res = getsockopt(s->sock_fd, level, optname,
2763 (void *)PyBytes_AS_STRING(buf), &buflen);
2764 if (res < 0) {
2765 Py_DECREF(buf);
2766 return s->errorhandler();
2767 }
2768 _PyBytes_Resize(&buf, buflen);
2769 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002770}
2771
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002772PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002773"getsockopt(level, option[, buffersize]) -> value\n\
2774\n\
2775Get a socket option. See the Unix manual for level and option.\n\
2776If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002777string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002778
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002779
Fred Drake728819a2000-07-01 03:40:12 +00002780/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002781
Guido van Rossum73624e91994-10-10 17:59:00 +00002782static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002783sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 sock_addr_t addrbuf;
2786 int addrlen;
2787 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2790 return NULL;
2791 Py_BEGIN_ALLOW_THREADS
2792 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2793 Py_END_ALLOW_THREADS
2794 if (res < 0)
2795 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002796 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002797}
2798
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002799PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002800"bind(address)\n\
2801\n\
2802Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002803pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002804sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002805
Guido van Rossum30a685f1991-06-27 15:51:29 +00002806
2807/* s.close() method.
2808 Set the file descriptor to -1 so operations tried subsequently
2809 will surely fail. */
2810
Guido van Rossum73624e91994-10-10 17:59:00 +00002811static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002812sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002813{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002815 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002816
Victor Stinner19a8e842016-03-21 16:36:48 +01002817 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002818 if (fd != INVALID_SOCKET) {
2819 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002820
2821 /* We do not want to retry upon EINTR: see
2822 http://lwn.net/Articles/576478/ and
2823 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2824 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002826 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002827 Py_END_ALLOW_THREADS
Victor Stinner67e14782017-07-04 16:20:06 +02002828 /* bpo-30319: The peer can already have closed the connection.
2829 Python ignores ECONNRESET on close(). */
2830 if (res < 0 && errno != ECONNRESET) {
Martin Panter50ab1a32016-04-11 00:38:12 +00002831 return s->errorhandler();
2832 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 }
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02002834 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002835}
2836
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002837PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002838"close()\n\
2839\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002840Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002841
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002842static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002843sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002844{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002845 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002846 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002847 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002848}
2849
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002850PyDoc_STRVAR(detach_doc,
2851"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002852\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002853Close the socket object without closing the underlying file descriptor.\n\
2854The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002855can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002856
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002857static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002858sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002859{
Victor Stinner81c41db2015-04-02 11:50:57 +02002860 int err;
2861 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002862
Victor Stinner81c41db2015-04-02 11:50:57 +02002863 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2864 /* getsockopt() failed */
2865 return 0;
2866 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002867
Victor Stinner81c41db2015-04-02 11:50:57 +02002868 if (err == EISCONN)
2869 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002870 if (err != 0) {
2871 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2872 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002873 return 0;
2874 }
2875 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002876}
2877
2878static int
2879internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2880 int raise)
2881{
2882 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002883
2884 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002886 Py_END_ALLOW_THREADS
2887
Victor Stinner70a46f62015-03-31 22:03:59 +02002888 if (!res) {
2889 /* connect() succeeded, the socket is connected */
2890 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002892
Victor Stinner81c41db2015-04-02 11:50:57 +02002893 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002894
Victor Stinner81c41db2015-04-02 11:50:57 +02002895 /* save error, PyErr_CheckSignals() can replace it */
2896 err = GET_SOCK_ERROR;
2897 if (CHECK_ERRNO(EINTR)) {
2898 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002899 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002900
2901 /* Issue #23618: when connect() fails with EINTR, the connection is
2902 running asynchronously.
2903
2904 If the socket is blocking or has a timeout, wait until the
2905 connection completes, fails or timed out using select(), and then
2906 get the connection status using getsockopt(SO_ERROR).
2907
2908 If the socket is non-blocking, raise InterruptedError. The caller is
2909 responsible to wait until the connection completes, fails or timed
2910 out (it's the case in asyncio for example). */
2911 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2912 }
2913 else {
2914 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2915 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002916 }
2917
Victor Stinner81c41db2015-04-02 11:50:57 +02002918 if (!wait_connect) {
2919 if (raise) {
2920 /* restore error, maybe replaced by PyErr_CheckSignals() */
2921 SET_SOCK_ERROR(err);
2922 s->errorhandler();
2923 return -1;
2924 }
2925 else
2926 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002927 }
2928
Victor Stinner81c41db2015-04-02 11:50:57 +02002929 if (raise) {
2930 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002931 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2932 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002933 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002934 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002935 else {
2936 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002937 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2938 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002939 return err;
2940 }
2941 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002942}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002943
Fred Drake728819a2000-07-01 03:40:12 +00002944/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002945
Guido van Rossum73624e91994-10-10 17:59:00 +00002946static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002947sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002948{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 sock_addr_t addrbuf;
2950 int addrlen;
2951 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2954 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002955
Victor Stinner81c41db2015-04-02 11:50:57 +02002956 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002957 if (res < 0)
2958 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002959
Victor Stinneree699e92015-03-31 21:28:42 +02002960 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002961}
2962
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002963PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002964"connect(address)\n\
2965\n\
2966Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002967is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002968
Guido van Rossum30a685f1991-06-27 15:51:29 +00002969
Fred Drake728819a2000-07-01 03:40:12 +00002970/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002971
2972static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002973sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 sock_addr_t addrbuf;
2976 int addrlen;
2977 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2980 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002981
Victor Stinner81c41db2015-04-02 11:50:57 +02002982 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002983 if (res < 0)
2984 return NULL;
2985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002987}
2988
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002989PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002990"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002991\n\
2992This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002993instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002994
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002995
Guido van Rossumed233a51992-06-23 09:07:03 +00002996/* s.fileno() method */
2997
Guido van Rossum73624e91994-10-10 17:59:00 +00002998static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002999sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00003000{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00003002}
3003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003004PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005"fileno() -> integer\n\
3006\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003007Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003008
Guido van Rossumed233a51992-06-23 09:07:03 +00003009
Guido van Rossumc89705d1992-11-26 08:54:07 +00003010/* s.getsockname() method */
3011
Guido van Rossum73624e91994-10-10 17:59:00 +00003012static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003013sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 sock_addr_t addrbuf;
3016 int res;
3017 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 if (!getsockaddrlen(s, &addrlen))
3020 return NULL;
3021 memset(&addrbuf, 0, addrlen);
3022 Py_BEGIN_ALLOW_THREADS
3023 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3024 Py_END_ALLOW_THREADS
3025 if (res < 0)
3026 return s->errorhandler();
3027 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3028 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003029}
3030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003031PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003032"getsockname() -> address info\n\
3033\n\
3034Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003035info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003036
Guido van Rossumc89705d1992-11-26 08:54:07 +00003037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003039/* s.getpeername() method */
3040
Guido van Rossum73624e91994-10-10 17:59:00 +00003041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003042sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00003043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 sock_addr_t addrbuf;
3045 int res;
3046 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00003047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 if (!getsockaddrlen(s, &addrlen))
3049 return NULL;
3050 memset(&addrbuf, 0, addrlen);
3051 Py_BEGIN_ALLOW_THREADS
3052 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
3053 Py_END_ALLOW_THREADS
3054 if (res < 0)
3055 return s->errorhandler();
3056 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3057 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00003058}
Guido van Rossum82a5c661998-07-07 20:45:43 +00003059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003060PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003061"getpeername() -> address info\n\
3062\n\
3063Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003064info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003065
Guido van Rossumb6775db1994-08-01 11:34:53 +00003066#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00003067
3068
Guido van Rossum30a685f1991-06-27 15:51:29 +00003069/* s.listen(n) method */
3070
Guido van Rossum73624e91994-10-10 17:59:00 +00003071static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01003072sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003073{
Charles-François Natali644b8f52014-05-22 19:45:39 +01003074 /* We try to choose a default backlog high enough to avoid connection drops
3075 * for common workloads, yet not too high to limit resource usage. */
3076 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003078
Charles-François Natali644b8f52014-05-22 19:45:39 +01003079 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01003081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003083 /* To avoid problems on systems that don't allow a negative backlog
3084 * (which doesn't make sense anyway) we force a minimum value of 0. */
3085 if (backlog < 0)
3086 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 res = listen(s->sock_fd, backlog);
3088 Py_END_ALLOW_THREADS
3089 if (res < 0)
3090 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02003091 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003092}
3093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003094PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01003095"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003096\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003097Enable a server to accept connections. If backlog is specified, it must be\n\
3098at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02003099unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01003100connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003101
Victor Stinner31bf2d52015-04-01 21:57:09 +02003102struct sock_recv {
3103 char *cbuf;
3104 Py_ssize_t len;
3105 int flags;
3106 Py_ssize_t result;
3107};
3108
3109static int
3110sock_recv_impl(PySocketSockObject *s, void *data)
3111{
3112 struct sock_recv *ctx = data;
3113
3114#ifdef MS_WINDOWS
3115 if (ctx->len > INT_MAX)
3116 ctx->len = INT_MAX;
3117 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
3118#else
3119 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
3120#endif
3121 return (ctx->result >= 0);
3122}
3123
Guido van Rossum82a5c661998-07-07 20:45:43 +00003124
Thomas Wouters477c8d52006-05-27 19:21:47 +00003125/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003126 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00003127 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00003128 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02003129 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00003130 * also possible that we return a number of bytes smaller than the request
3131 * bytes.
3132 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003133
Antoine Pitrou19467d22010-08-17 19:33:30 +00003134static Py_ssize_t
3135sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003136{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003137 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 if (!IS_SELECTABLE(s)) {
3140 select_error();
3141 return -1;
3142 }
3143 if (len == 0) {
3144 /* If 0 bytes were requested, do nothing. */
3145 return 0;
3146 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003147
Victor Stinner31bf2d52015-04-01 21:57:09 +02003148 ctx.cbuf = cbuf;
3149 ctx.len = len;
3150 ctx.flags = flags;
3151 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003153
3154 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003155}
3156
Guido van Rossum48a680c2001-03-02 06:34:14 +00003157
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003158/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003159
Guido van Rossum73624e91994-10-10 17:59:00 +00003160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003161sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003162{
Antoine Pitrou19467d22010-08-17 19:33:30 +00003163 Py_ssize_t recvlen, outlen;
3164 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003165 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003166
Antoine Pitrou19467d22010-08-17 19:33:30 +00003167 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003168 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 if (recvlen < 0) {
3171 PyErr_SetString(PyExc_ValueError,
3172 "negative buffersize in recv");
3173 return NULL;
3174 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00003175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003176 /* Allocate a new string. */
3177 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3178 if (buf == NULL)
3179 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003181 /* Call the guts */
3182 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
3183 if (outlen < 0) {
3184 /* An error occurred, release the string and return an
3185 error. */
3186 Py_DECREF(buf);
3187 return NULL;
3188 }
3189 if (outlen != recvlen) {
3190 /* We did not read as many bytes as we anticipated, resize the
3191 string if possible and be successful. */
3192 _PyBytes_Resize(&buf, outlen);
3193 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003196}
3197
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003198PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003199"recv(buffersize[, flags]) -> data\n\
3200\n\
3201Receive up to buffersize bytes from the socket. For the optional flags\n\
3202argument, see the Unix manual. When no data is available, block until\n\
3203at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003204the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003205
Guido van Rossum30a685f1991-06-27 15:51:29 +00003206
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003207/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003208
Thomas Wouters477c8d52006-05-27 19:21:47 +00003209static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003210sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003211{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003212 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003213
Antoine Pitrou19467d22010-08-17 19:33:30 +00003214 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003215 Py_buffer pbuf;
3216 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003217 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003220 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003221 &pbuf, &recvlen, &flags))
3222 return NULL;
3223 buf = pbuf.buf;
3224 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 if (recvlen < 0) {
3227 PyBuffer_Release(&pbuf);
3228 PyErr_SetString(PyExc_ValueError,
3229 "negative buffersize in recv_into");
3230 return NULL;
3231 }
3232 if (recvlen == 0) {
3233 /* If nbytes was not specified, use the buffer's length */
3234 recvlen = buflen;
3235 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 /* Check if the buffer is large enough */
3238 if (buflen < recvlen) {
3239 PyBuffer_Release(&pbuf);
3240 PyErr_SetString(PyExc_ValueError,
3241 "buffer too small for requested bytes");
3242 return NULL;
3243 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003245 /* Call the guts */
3246 readlen = sock_recv_guts(s, buf, recvlen, flags);
3247 if (readlen < 0) {
3248 /* Return an error. */
3249 PyBuffer_Release(&pbuf);
3250 return NULL;
3251 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003253 PyBuffer_Release(&pbuf);
3254 /* Return the number of bytes read. Note that we do not do anything
3255 special here in the case that readlen < recvlen. */
3256 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003257}
3258
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003259PyDoc_STRVAR(recv_into_doc,
3260"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003261\n\
3262A version of recv() that stores its data into a buffer rather than creating \n\
3263a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3264is not specified (or 0), receive up to the size available in the given buffer.\n\
3265\n\
3266See recv() for documentation about the flags.");
3267
Victor Stinner31bf2d52015-04-01 21:57:09 +02003268struct sock_recvfrom {
3269 char* cbuf;
3270 Py_ssize_t len;
3271 int flags;
3272 socklen_t *addrlen;
3273 sock_addr_t *addrbuf;
3274 Py_ssize_t result;
3275};
3276
3277static int
3278sock_recvfrom_impl(PySocketSockObject *s, void *data)
3279{
3280 struct sock_recvfrom *ctx = data;
3281
3282 memset(ctx->addrbuf, 0, *ctx->addrlen);
3283
3284#ifdef MS_WINDOWS
3285 if (ctx->len > INT_MAX)
3286 ctx->len = INT_MAX;
3287 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3288 SAS2SA(ctx->addrbuf), ctx->addrlen);
3289#else
3290 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3291 SAS2SA(ctx->addrbuf), ctx->addrlen);
3292#endif
3293 return (ctx->result >= 0);
3294}
3295
Thomas Wouters477c8d52006-05-27 19:21:47 +00003296
3297/*
Christian Heimes99170a52007-12-19 02:07:34 +00003298 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3299 * into a char buffer. If you have any inc/def ref to do to the objects that
3300 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003301 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003302 * that it is also possible that we return a number of bytes smaller than the
3303 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003304 *
3305 * 'addr' is a return value for the address object. Note that you must decref
3306 * it yourself.
3307 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003308static Py_ssize_t
3309sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003312 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003313 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003314 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 if (!getsockaddrlen(s, &addrlen))
3319 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 if (!IS_SELECTABLE(s)) {
3322 select_error();
3323 return -1;
3324 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003325
Victor Stinner31bf2d52015-04-01 21:57:09 +02003326 ctx.cbuf = cbuf;
3327 ctx.len = len;
3328 ctx.flags = flags;
3329 ctx.addrbuf = &addrbuf;
3330 ctx.addrlen = &addrlen;
3331 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003333
Victor Stinner31bf2d52015-04-01 21:57:09 +02003334 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3335 s->sock_proto);
3336 if (*addr == NULL)
3337 return -1;
3338
3339 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003340}
3341
3342/* s.recvfrom(nbytes [,flags]) method */
3343
3344static PyObject *
3345sock_recvfrom(PySocketSockObject *s, PyObject *args)
3346{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003347 PyObject *buf = NULL;
3348 PyObject *addr = NULL;
3349 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003350 int flags = 0;
3351 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003352
Antoine Pitrou19467d22010-08-17 19:33:30 +00003353 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 if (recvlen < 0) {
3357 PyErr_SetString(PyExc_ValueError,
3358 "negative buffersize in recvfrom");
3359 return NULL;
3360 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003362 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3363 if (buf == NULL)
3364 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3367 recvlen, flags, &addr);
3368 if (outlen < 0) {
3369 goto finally;
3370 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 if (outlen != recvlen) {
3373 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003374 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003376 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 goto finally;
3378 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003380 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003381
3382finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003383 Py_XDECREF(buf);
3384 Py_XDECREF(addr);
3385 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003386}
3387
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003388PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003389"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3390\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003391Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003392
Thomas Wouters477c8d52006-05-27 19:21:47 +00003393
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003394/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003395
3396static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003397sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003400
Antoine Pitrou19467d22010-08-17 19:33:30 +00003401 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003402 Py_buffer pbuf;
3403 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003404 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003407
Antoine Pitrou19467d22010-08-17 19:33:30 +00003408 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 kwlist, &pbuf,
3410 &recvlen, &flags))
3411 return NULL;
3412 buf = pbuf.buf;
3413 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 if (recvlen < 0) {
3416 PyBuffer_Release(&pbuf);
3417 PyErr_SetString(PyExc_ValueError,
3418 "negative buffersize in recvfrom_into");
3419 return NULL;
3420 }
3421 if (recvlen == 0) {
3422 /* If nbytes was not specified, use the buffer's length */
3423 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003424 } else if (recvlen > buflen) {
3425 PyBuffer_Release(&pbuf);
3426 PyErr_SetString(PyExc_ValueError,
3427 "nbytes is greater than the length of the buffer");
3428 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003429 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003431 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3432 if (readlen < 0) {
3433 PyBuffer_Release(&pbuf);
3434 /* Return an error */
3435 Py_XDECREF(addr);
3436 return NULL;
3437 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 PyBuffer_Release(&pbuf);
3440 /* Return the number of bytes read and the address. Note that we do
3441 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003442 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003443}
3444
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003445PyDoc_STRVAR(recvfrom_into_doc,
3446"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003447\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003448Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003449
Victor Stinner35bee932015-04-02 12:28:07 +02003450/* The sendmsg() and recvmsg[_into]() methods require a working
3451 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3452#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003453struct sock_recvmsg {
3454 struct msghdr *msg;
3455 int flags;
3456 ssize_t result;
3457};
3458
3459static int
3460sock_recvmsg_impl(PySocketSockObject *s, void *data)
3461{
3462 struct sock_recvmsg *ctx = data;
3463
3464 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3465 return (ctx->result >= 0);
3466}
3467
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468/*
3469 * Call recvmsg() with the supplied iovec structures, flags, and
3470 * ancillary data buffer size (controllen). Returns the tuple return
3471 * value for recvmsg() or recvmsg_into(), with the first item provided
3472 * by the supplied makeval() function. makeval() will be called with
3473 * the length read and makeval_data as arguments, and must return a
3474 * new reference (which will be decrefed if there is a subsequent
3475 * error). On error, closes any file descriptors received via
3476 * SCM_RIGHTS.
3477 */
3478static PyObject *
3479sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3480 int flags, Py_ssize_t controllen,
3481 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3482{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003483 sock_addr_t addrbuf;
3484 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003485 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003486 PyObject *cmsg_list = NULL, *retval = NULL;
3487 void *controlbuf = NULL;
3488 struct cmsghdr *cmsgh;
3489 size_t cmsgdatalen = 0;
3490 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003491 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003492
3493 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3494 ignored" when the socket is connected (Linux fills them in
3495 anyway for AF_UNIX sockets at least). Normally msg_namelen
3496 seems to be set to 0 if there's no address, but try to
3497 initialize msg_name to something that won't be mistaken for a
3498 real address if that doesn't happen. */
3499 if (!getsockaddrlen(s, &addrbuflen))
3500 return NULL;
3501 memset(&addrbuf, 0, addrbuflen);
3502 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3503
3504 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3505 PyErr_SetString(PyExc_ValueError,
3506 "invalid ancillary data buffer length");
3507 return NULL;
3508 }
3509 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3510 return PyErr_NoMemory();
3511
3512 /* Make the system call. */
3513 if (!IS_SELECTABLE(s)) {
3514 select_error();
3515 goto finally;
3516 }
3517
Victor Stinner31bf2d52015-04-01 21:57:09 +02003518 msg.msg_name = SAS2SA(&addrbuf);
3519 msg.msg_namelen = addrbuflen;
3520 msg.msg_iov = iov;
3521 msg.msg_iovlen = iovlen;
3522 msg.msg_control = controlbuf;
3523 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003524
Victor Stinner31bf2d52015-04-01 21:57:09 +02003525 ctx.msg = &msg;
3526 ctx.flags = flags;
3527 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003528 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003529
3530 /* Make list of (level, type, data) tuples from control messages. */
3531 if ((cmsg_list = PyList_New(0)) == NULL)
3532 goto err_closefds;
3533 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3534 implementations didn't do so. */
3535 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3536 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3537 PyObject *bytes, *tuple;
3538 int tmp;
3539
3540 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3541 if (cmsg_status != 0) {
3542 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3543 "received malformed or improperly-truncated "
3544 "ancillary data", 1) == -1)
3545 goto err_closefds;
3546 }
3547 if (cmsg_status < 0)
3548 break;
3549 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003550 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003551 goto err_closefds;
3552 }
3553
3554 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3555 cmsgdatalen);
3556 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3557 (int)cmsgh->cmsg_type, bytes);
3558 if (tuple == NULL)
3559 goto err_closefds;
3560 tmp = PyList_Append(cmsg_list, tuple);
3561 Py_DECREF(tuple);
3562 if (tmp != 0)
3563 goto err_closefds;
3564
3565 if (cmsg_status != 0)
3566 break;
3567 }
3568
3569 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003570 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003571 cmsg_list,
3572 (int)msg.msg_flags,
3573 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3574 ((msg.msg_namelen > addrbuflen) ?
3575 addrbuflen : msg.msg_namelen),
3576 s->sock_proto));
3577 if (retval == NULL)
3578 goto err_closefds;
3579
3580finally:
3581 Py_XDECREF(cmsg_list);
3582 PyMem_Free(controlbuf);
3583 return retval;
3584
3585err_closefds:
3586#ifdef SCM_RIGHTS
3587 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3588 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3589 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3590 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3591 if (cmsg_status < 0)
3592 break;
3593 if (cmsgh->cmsg_level == SOL_SOCKET &&
3594 cmsgh->cmsg_type == SCM_RIGHTS) {
3595 size_t numfds;
3596 int *fdp;
3597
3598 numfds = cmsgdatalen / sizeof(int);
3599 fdp = (int *)CMSG_DATA(cmsgh);
3600 while (numfds-- > 0)
3601 close(*fdp++);
3602 }
3603 if (cmsg_status != 0)
3604 break;
3605 }
3606#endif /* SCM_RIGHTS */
3607 goto finally;
3608}
3609
3610
3611static PyObject *
3612makeval_recvmsg(ssize_t received, void *data)
3613{
3614 PyObject **buf = data;
3615
3616 if (received < PyBytes_GET_SIZE(*buf))
3617 _PyBytes_Resize(buf, received);
3618 Py_XINCREF(*buf);
3619 return *buf;
3620}
3621
3622/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3623
3624static PyObject *
3625sock_recvmsg(PySocketSockObject *s, PyObject *args)
3626{
3627 Py_ssize_t bufsize, ancbufsize = 0;
3628 int flags = 0;
3629 struct iovec iov;
3630 PyObject *buf = NULL, *retval = NULL;
3631
3632 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3633 return NULL;
3634
3635 if (bufsize < 0) {
3636 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3637 return NULL;
3638 }
3639 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3640 return NULL;
3641 iov.iov_base = PyBytes_AS_STRING(buf);
3642 iov.iov_len = bufsize;
3643
3644 /* Note that we're passing a pointer to *our pointer* to the bytes
3645 object here (&buf); makeval_recvmsg() may incref the object, or
3646 deallocate it and set our pointer to NULL. */
3647 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3648 &makeval_recvmsg, &buf);
3649 Py_XDECREF(buf);
3650 return retval;
3651}
3652
3653PyDoc_STRVAR(recvmsg_doc,
3654"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3655\n\
3656Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3657socket. The ancbufsize argument sets the size in bytes of the\n\
3658internal buffer used to receive the ancillary data; it defaults to 0,\n\
3659meaning that no ancillary data will be received. Appropriate buffer\n\
3660sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3661CMSG_LEN(), and items which do not fit into the buffer might be\n\
3662truncated or discarded. The flags argument defaults to 0 and has the\n\
3663same meaning as for recv().\n\
3664\n\
3665The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3666The data item is a bytes object holding the non-ancillary data\n\
3667received. The ancdata item is a list of zero or more tuples\n\
3668(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3669(control messages) received: cmsg_level and cmsg_type are integers\n\
3670specifying the protocol level and protocol-specific type respectively,\n\
3671and cmsg_data is a bytes object holding the associated data. The\n\
3672msg_flags item is the bitwise OR of various flags indicating\n\
3673conditions on the received message; see your system documentation for\n\
3674details. If the receiving socket is unconnected, address is the\n\
3675address of the sending socket, if available; otherwise, its value is\n\
3676unspecified.\n\
3677\n\
3678If recvmsg() raises an exception after the system call returns, it\n\
3679will first attempt to close any file descriptors received via the\n\
3680SCM_RIGHTS mechanism.");
3681
3682
3683static PyObject *
3684makeval_recvmsg_into(ssize_t received, void *data)
3685{
3686 return PyLong_FromSsize_t(received);
3687}
3688
3689/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3690
3691static PyObject *
3692sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3693{
3694 Py_ssize_t ancbufsize = 0;
3695 int flags = 0;
3696 struct iovec *iovs = NULL;
3697 Py_ssize_t i, nitems, nbufs = 0;
3698 Py_buffer *bufs = NULL;
3699 PyObject *buffers_arg, *fast, *retval = NULL;
3700
3701 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3702 &buffers_arg, &ancbufsize, &flags))
3703 return NULL;
3704
3705 if ((fast = PySequence_Fast(buffers_arg,
3706 "recvmsg_into() argument 1 must be an "
3707 "iterable")) == NULL)
3708 return NULL;
3709 nitems = PySequence_Fast_GET_SIZE(fast);
3710 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003711 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003712 goto finally;
3713 }
3714
3715 /* Fill in an iovec for each item, and save the Py_buffer
3716 structs to release afterwards. */
3717 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3718 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3719 PyErr_NoMemory();
3720 goto finally;
3721 }
3722 for (; nbufs < nitems; nbufs++) {
3723 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3724 "w*;recvmsg_into() argument 1 must be an iterable "
3725 "of single-segment read-write buffers",
3726 &bufs[nbufs]))
3727 goto finally;
3728 iovs[nbufs].iov_base = bufs[nbufs].buf;
3729 iovs[nbufs].iov_len = bufs[nbufs].len;
3730 }
3731
3732 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3733 &makeval_recvmsg_into, NULL);
3734finally:
3735 for (i = 0; i < nbufs; i++)
3736 PyBuffer_Release(&bufs[i]);
3737 PyMem_Free(bufs);
3738 PyMem_Free(iovs);
3739 Py_DECREF(fast);
3740 return retval;
3741}
3742
3743PyDoc_STRVAR(recvmsg_into_doc,
3744"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3745\n\
3746Receive normal data and ancillary data from the socket, scattering the\n\
3747non-ancillary data into a series of buffers. The buffers argument\n\
3748must be an iterable of objects that export writable buffers\n\
3749(e.g. bytearray objects); these will be filled with successive chunks\n\
3750of the non-ancillary data until it has all been written or there are\n\
3751no more buffers. The ancbufsize argument sets the size in bytes of\n\
3752the internal buffer used to receive the ancillary data; it defaults to\n\
37530, meaning that no ancillary data will be received. Appropriate\n\
3754buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3755or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3756truncated or discarded. The flags argument defaults to 0 and has the\n\
3757same meaning as for recv().\n\
3758\n\
3759The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3760The nbytes item is the total number of bytes of non-ancillary data\n\
3761written into the buffers. The ancdata item is a list of zero or more\n\
3762tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3763data (control messages) received: cmsg_level and cmsg_type are\n\
3764integers specifying the protocol level and protocol-specific type\n\
3765respectively, and cmsg_data is a bytes object holding the associated\n\
3766data. The msg_flags item is the bitwise OR of various flags\n\
3767indicating conditions on the received message; see your system\n\
3768documentation for details. If the receiving socket is unconnected,\n\
3769address is the address of the sending socket, if available; otherwise,\n\
3770its value is unspecified.\n\
3771\n\
3772If recvmsg_into() raises an exception after the system call returns,\n\
3773it will first attempt to close any file descriptors received via the\n\
3774SCM_RIGHTS mechanism.");
3775#endif /* CMSG_LEN */
3776
3777
Victor Stinner31bf2d52015-04-01 21:57:09 +02003778struct sock_send {
3779 char *buf;
3780 Py_ssize_t len;
3781 int flags;
3782 Py_ssize_t result;
3783};
3784
3785static int
3786sock_send_impl(PySocketSockObject *s, void *data)
3787{
3788 struct sock_send *ctx = data;
3789
3790#ifdef MS_WINDOWS
3791 if (ctx->len > INT_MAX)
3792 ctx->len = INT_MAX;
3793 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3794#else
3795 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3796#endif
3797 return (ctx->result >= 0);
3798}
3799
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003800/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003801
Guido van Rossum73624e91994-10-10 17:59:00 +00003802static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003803sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003804{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003805 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003806 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003807 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003809 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3810 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003812 if (!IS_SELECTABLE(s)) {
3813 PyBuffer_Release(&pbuf);
3814 return select_error();
3815 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003816 ctx.buf = pbuf.buf;
3817 ctx.len = pbuf.len;
3818 ctx.flags = flags;
3819 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003820 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003821 return NULL;
3822 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003823 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003824
3825 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003826}
3827
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003828PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003829"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003830\n\
3831Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003832argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003833sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003834
3835
3836/* s.sendall(data [,flags]) method */
3837
3838static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003839sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003842 Py_ssize_t len, n;
3843 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003844 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003845 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003846 int has_timeout = (s->sock_timeout > 0);
3847 _PyTime_t interval = s->sock_timeout;
3848 _PyTime_t deadline = 0;
3849 int deadline_initialized = 0;
3850 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3853 return NULL;
3854 buf = pbuf.buf;
3855 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 if (!IS_SELECTABLE(s)) {
3858 PyBuffer_Release(&pbuf);
3859 return select_error();
3860 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003863 if (has_timeout) {
3864 if (deadline_initialized) {
3865 /* recompute the timeout */
3866 interval = deadline - _PyTime_GetMonotonicClock();
3867 }
3868 else {
3869 deadline_initialized = 1;
3870 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3871 }
3872
3873 if (interval <= 0) {
3874 PyErr_SetString(socket_timeout, "timed out");
3875 goto done;
3876 }
3877 }
3878
Victor Stinner02f32ab2015-04-01 22:53:26 +02003879 ctx.buf = buf;
3880 ctx.len = len;
3881 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003882 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3883 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003884 n = ctx.result;
3885 assert(n >= 0);
3886
3887 buf += n;
3888 len -= n;
3889
3890 /* We must run our signal handlers before looping again.
3891 send() can return a successful partial write when it is
3892 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003893 if (PyErr_CheckSignals())
3894 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003895 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003896 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003897
Victor Stinner8912d142015-04-06 23:16:34 +02003898 Py_INCREF(Py_None);
3899 res = Py_None;
3900
3901done:
3902 PyBuffer_Release(&pbuf);
3903 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003904}
3905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003906PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003907"sendall(data[, flags])\n\
3908\n\
3909Send a data string to the socket. For the optional flags\n\
3910argument, see the Unix manual. This calls send() repeatedly\n\
3911until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003912to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003913
Guido van Rossum30a685f1991-06-27 15:51:29 +00003914
Victor Stinner31bf2d52015-04-01 21:57:09 +02003915struct sock_sendto {
3916 char *buf;
3917 Py_ssize_t len;
3918 int flags;
3919 int addrlen;
3920 sock_addr_t *addrbuf;
3921 Py_ssize_t result;
3922};
3923
3924static int
3925sock_sendto_impl(PySocketSockObject *s, void *data)
3926{
3927 struct sock_sendto *ctx = data;
3928
3929#ifdef MS_WINDOWS
3930 if (ctx->len > INT_MAX)
3931 ctx->len = INT_MAX;
3932 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3933 SAS2SA(ctx->addrbuf), ctx->addrlen);
3934#else
3935 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3936 SAS2SA(ctx->addrbuf), ctx->addrlen);
3937#endif
3938 return (ctx->result >= 0);
3939}
3940
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003941/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003942
Guido van Rossum73624e91994-10-10 17:59:00 +00003943static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003944sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 Py_buffer pbuf;
3947 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003948 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003950 int addrlen, flags;
3951 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003953 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003954 arglen = PyTuple_Size(args);
3955 switch (arglen) {
3956 case 2:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003957 if (!PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro)) {
3958 return NULL;
3959 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003960 break;
3961 case 3:
Gregory P. Smith8128d5a2017-01-17 16:54:56 -08003962 if (!PyArg_ParseTuple(args, "y*iO:sendto",
3963 &pbuf, &flags, &addro)) {
3964 return NULL;
3965 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003966 break;
3967 default:
3968 PyErr_Format(PyExc_TypeError,
3969 "sendto() takes 2 or 3 arguments (%d given)",
3970 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003971 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 if (!IS_SELECTABLE(s)) {
3975 PyBuffer_Release(&pbuf);
3976 return select_error();
3977 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3980 PyBuffer_Release(&pbuf);
3981 return NULL;
3982 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003983
Victor Stinner31bf2d52015-04-01 21:57:09 +02003984 ctx.buf = pbuf.buf;
3985 ctx.len = pbuf.len;
3986 ctx.flags = flags;
3987 ctx.addrlen = addrlen;
3988 ctx.addrbuf = &addrbuf;
3989 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003990 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 return NULL;
3992 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003993 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003994
3995 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003996}
3997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003998PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003999"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004000\n\
4001Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004002For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004003
Guido van Rossum30a685f1991-06-27 15:51:29 +00004004
Victor Stinner35bee932015-04-02 12:28:07 +02004005/* The sendmsg() and recvmsg[_into]() methods require a working
4006 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
4007#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02004008struct sock_sendmsg {
4009 struct msghdr *msg;
4010 int flags;
4011 ssize_t result;
4012};
4013
4014static int
Christian Heimesdffa3942016-09-05 23:54:41 +02004015sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg,
4016 struct msghdr *msg,
4017 Py_buffer **databufsout, Py_ssize_t *ndatabufsout) {
4018 Py_ssize_t ndataparts, ndatabufs = 0;
4019 int result = -1;
4020 struct iovec *iovs = NULL;
4021 PyObject *data_fast = NULL;
4022 Py_buffer *databufs = NULL;
4023
4024 /* Fill in an iovec for each message part, and save the Py_buffer
4025 structs to release afterwards. */
Victor Stinner288b5bf2016-09-12 11:45:59 +02004026 data_fast = PySequence_Fast(data_arg,
4027 "sendmsg() argument 1 must be an "
4028 "iterable");
4029 if (data_fast == NULL) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004030 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004031 }
4032
Christian Heimesdffa3942016-09-05 23:54:41 +02004033 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
4034 if (ndataparts > INT_MAX) {
4035 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
4036 goto finally;
4037 }
Victor Stinner288b5bf2016-09-12 11:45:59 +02004038
Christian Heimesdffa3942016-09-05 23:54:41 +02004039 msg->msg_iovlen = ndataparts;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004040 if (ndataparts > 0) {
4041 iovs = PyMem_New(struct iovec, ndataparts);
4042 if (iovs == NULL) {
4043 PyErr_NoMemory();
4044 goto finally;
4045 }
4046 msg->msg_iov = iovs;
4047
4048 databufs = PyMem_New(Py_buffer, ndataparts);
Christian Heimesfaf2cea2016-09-13 10:07:16 +02004049 if (databufs == NULL) {
Victor Stinner288b5bf2016-09-12 11:45:59 +02004050 PyErr_NoMemory();
4051 goto finally;
4052 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004053 }
4054 for (; ndatabufs < ndataparts; ndatabufs++) {
4055 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
4056 "y*;sendmsg() argument 1 must be an iterable of "
4057 "bytes-like objects",
4058 &databufs[ndatabufs]))
4059 goto finally;
4060 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
4061 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
4062 }
4063 result = 0;
4064 finally:
4065 *databufsout = databufs;
4066 *ndatabufsout = ndatabufs;
4067 Py_XDECREF(data_fast);
4068 return result;
4069}
4070
4071static int
Victor Stinner31bf2d52015-04-01 21:57:09 +02004072sock_sendmsg_impl(PySocketSockObject *s, void *data)
4073{
4074 struct sock_sendmsg *ctx = data;
4075
4076 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
4077 return (ctx->result >= 0);
4078}
4079
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004080/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
4081
4082static PyObject *
4083sock_sendmsg(PySocketSockObject *s, PyObject *args)
4084{
Christian Heimesdffa3942016-09-05 23:54:41 +02004085 Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004086 Py_buffer *databufs = NULL;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004087 sock_addr_t addrbuf;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004088 struct msghdr msg;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004089 struct cmsginfo {
4090 int level;
4091 int type;
4092 Py_buffer data;
4093 } *cmsgs = NULL;
4094 void *controlbuf = NULL;
4095 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004096 int addrlen, flags = 0;
Christian Heimesdffa3942016-09-05 23:54:41 +02004097 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004098 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004099 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004100
4101 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
Victor Stinner288b5bf2016-09-12 11:45:59 +02004102 &data_arg, &cmsg_arg, &flags, &addr_arg)) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004103 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004104 }
4105
4106 memset(&msg, 0, sizeof(msg));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004107
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004108 /* Parse destination address. */
4109 if (addr_arg != NULL && addr_arg != Py_None) {
4110 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
4111 goto finally;
4112 msg.msg_name = &addrbuf;
4113 msg.msg_namelen = addrlen;
4114 }
4115
4116 /* Fill in an iovec for each message part, and save the Py_buffer
4117 structs to release afterwards. */
Christian Heimesdffa3942016-09-05 23:54:41 +02004118 if (sock_sendmsg_iovec(s, data_arg, &msg, &databufs, &ndatabufs) == -1) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004119 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004120 }
4121
4122 if (cmsg_arg == NULL)
4123 ncmsgs = 0;
4124 else {
4125 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
4126 "sendmsg() argument 2 must be an "
4127 "iterable")) == NULL)
4128 goto finally;
4129 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
4130 }
4131
4132#ifndef CMSG_SPACE
4133 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004134 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004135 "sending multiple control messages is not supported "
4136 "on this system");
4137 goto finally;
4138 }
4139#endif
4140 /* Save level, type and Py_buffer for each control message,
4141 and calculate total size. */
4142 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
4143 PyErr_NoMemory();
4144 goto finally;
4145 }
4146 controllen = controllen_last = 0;
4147 while (ncmsgbufs < ncmsgs) {
4148 size_t bufsize, space;
4149
4150 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
4151 "(iiy*):[sendmsg() ancillary data items]",
4152 &cmsgs[ncmsgbufs].level,
4153 &cmsgs[ncmsgbufs].type,
4154 &cmsgs[ncmsgbufs].data))
4155 goto finally;
4156 bufsize = cmsgs[ncmsgbufs++].data.len;
4157
4158#ifdef CMSG_SPACE
4159 if (!get_CMSG_SPACE(bufsize, &space)) {
4160#else
4161 if (!get_CMSG_LEN(bufsize, &space)) {
4162#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004163 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004164 goto finally;
4165 }
4166 controllen += space;
4167 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004168 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004169 goto finally;
4170 }
4171 controllen_last = controllen;
4172 }
4173
4174 /* Construct ancillary data block from control message info. */
4175 if (ncmsgbufs > 0) {
4176 struct cmsghdr *cmsgh = NULL;
4177
Victor Stinner52d61e42016-09-12 11:41:58 +02004178 controlbuf = PyMem_Malloc(controllen);
4179 if (controlbuf == NULL) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004180 PyErr_NoMemory();
4181 goto finally;
4182 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004183 msg.msg_control = controlbuf;
4184
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004185 msg.msg_controllen = controllen;
4186
4187 /* Need to zero out the buffer as a workaround for glibc's
4188 CMSG_NXTHDR() implementation. After getting the pointer to
4189 the next header, it checks its (uninitialized) cmsg_len
4190 member to see if the "message" fits in the buffer, and
4191 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04004192 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004193 memset(controlbuf, 0, controllen);
4194
4195 for (i = 0; i < ncmsgbufs; i++) {
4196 size_t msg_len, data_len = cmsgs[i].data.len;
4197 int enough_space = 0;
4198
4199 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
4200 if (cmsgh == NULL) {
4201 PyErr_Format(PyExc_RuntimeError,
4202 "unexpected NULL result from %s()",
4203 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
4204 goto finally;
4205 }
4206 if (!get_CMSG_LEN(data_len, &msg_len)) {
4207 PyErr_SetString(PyExc_RuntimeError,
4208 "item size out of range for CMSG_LEN()");
4209 goto finally;
4210 }
4211 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
4212 size_t space;
4213
4214 cmsgh->cmsg_len = msg_len;
4215 if (get_cmsg_data_space(&msg, cmsgh, &space))
4216 enough_space = (space >= data_len);
4217 }
4218 if (!enough_space) {
4219 PyErr_SetString(PyExc_RuntimeError,
4220 "ancillary data does not fit in calculated "
4221 "space");
4222 goto finally;
4223 }
4224 cmsgh->cmsg_level = cmsgs[i].level;
4225 cmsgh->cmsg_type = cmsgs[i].type;
4226 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
4227 }
4228 }
4229
4230 /* Make the system call. */
4231 if (!IS_SELECTABLE(s)) {
4232 select_error();
4233 goto finally;
4234 }
4235
Victor Stinner31bf2d52015-04-01 21:57:09 +02004236 ctx.msg = &msg;
4237 ctx.flags = flags;
4238 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004239 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02004240
4241 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004242
4243finally:
4244 PyMem_Free(controlbuf);
4245 for (i = 0; i < ncmsgbufs; i++)
4246 PyBuffer_Release(&cmsgs[i].data);
4247 PyMem_Free(cmsgs);
4248 Py_XDECREF(cmsg_fast);
Victor Stinner52d61e42016-09-12 11:41:58 +02004249 PyMem_Free(msg.msg_iov);
4250 for (i = 0; i < ndatabufs; i++) {
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004251 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004252 }
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004253 PyMem_Free(databufs);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004254 return retval;
4255}
4256
4257PyDoc_STRVAR(sendmsg_doc,
4258"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
4259\n\
4260Send normal and ancillary data to the socket, gathering the\n\
4261non-ancillary data from a series of buffers and concatenating it into\n\
4262a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004263data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004264The ancdata argument specifies the ancillary data (control messages)\n\
4265as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
4266cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
4267protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02004268is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004269argument defaults to 0 and has the same meaning as for send(). If\n\
4270address is supplied and not None, it sets a destination address for\n\
4271the message. The return value is the number of bytes of non-ancillary\n\
4272data sent.");
4273#endif /* CMSG_LEN */
4274
Christian Heimesdffa3942016-09-05 23:54:41 +02004275#ifdef HAVE_SOCKADDR_ALG
4276static PyObject*
4277sock_sendmsg_afalg(PySocketSockObject *self, PyObject *args, PyObject *kwds)
4278{
4279 PyObject *retval = NULL;
4280
4281 Py_ssize_t i, ndatabufs = 0;
4282 Py_buffer *databufs = NULL;
4283 PyObject *data_arg = NULL;
4284
4285 Py_buffer iv = {NULL, NULL};
4286
4287 PyObject *opobj = NULL;
4288 int op = -1;
4289
4290 PyObject *assoclenobj = NULL;
4291 int assoclen = -1;
4292
4293 unsigned int *uiptr;
4294 int flags = 0;
4295
4296 struct msghdr msg;
4297 struct cmsghdr *header = NULL;
4298 struct af_alg_iv *alg_iv = NULL;
4299 struct sock_sendmsg ctx;
4300 Py_ssize_t controllen;
4301 void *controlbuf = NULL;
4302 static char *keywords[] = {"msg", "op", "iv", "assoclen", "flags", 0};
4303
4304 if (self->sock_family != AF_ALG) {
4305 PyErr_SetString(PyExc_OSError,
4306 "algset is only supported for AF_ALG");
4307 return NULL;
4308 }
4309
4310 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4311 "|O$O!y*O!i:sendmsg_afalg", keywords,
4312 &data_arg,
4313 &PyLong_Type, &opobj, &iv,
Victor Stinner288b5bf2016-09-12 11:45:59 +02004314 &PyLong_Type, &assoclenobj, &flags)) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004315 return NULL;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004316 }
4317
4318 memset(&msg, 0, sizeof(msg));
Christian Heimesdffa3942016-09-05 23:54:41 +02004319
4320 /* op is a required, keyword-only argument >= 0 */
4321 if (opobj != NULL) {
4322 op = _PyLong_AsInt(opobj);
4323 }
4324 if (op < 0) {
4325 /* override exception from _PyLong_AsInt() */
4326 PyErr_SetString(PyExc_TypeError,
4327 "Invalid or missing argument 'op'");
4328 goto finally;
4329 }
4330 /* assoclen is optional but must be >= 0 */
4331 if (assoclenobj != NULL) {
4332 assoclen = _PyLong_AsInt(assoclenobj);
4333 if (assoclen == -1 && PyErr_Occurred()) {
4334 goto finally;
4335 }
4336 if (assoclen < 0) {
4337 PyErr_SetString(PyExc_TypeError,
4338 "assoclen must be positive");
4339 goto finally;
4340 }
4341 }
4342
4343 controllen = CMSG_SPACE(4);
4344 if (iv.buf != NULL) {
4345 controllen += CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4346 }
4347 if (assoclen >= 0) {
4348 controllen += CMSG_SPACE(4);
4349 }
4350
4351 controlbuf = PyMem_Malloc(controllen);
4352 if (controlbuf == NULL) {
Victor Stinner52d61e42016-09-12 11:41:58 +02004353 PyErr_NoMemory();
4354 goto finally;
Christian Heimesdffa3942016-09-05 23:54:41 +02004355 }
4356 memset(controlbuf, 0, controllen);
4357
Christian Heimesdffa3942016-09-05 23:54:41 +02004358 msg.msg_controllen = controllen;
4359 msg.msg_control = controlbuf;
4360
4361 /* Fill in an iovec for each message part, and save the Py_buffer
4362 structs to release afterwards. */
4363 if (data_arg != NULL) {
4364 if (sock_sendmsg_iovec(self, data_arg, &msg, &databufs, &ndatabufs) == -1) {
4365 goto finally;
4366 }
4367 }
4368
4369 /* set operation to encrypt or decrypt */
4370 header = CMSG_FIRSTHDR(&msg);
4371 if (header == NULL) {
4372 PyErr_SetString(PyExc_RuntimeError,
4373 "unexpected NULL result from CMSG_FIRSTHDR");
4374 goto finally;
4375 }
4376 header->cmsg_level = SOL_ALG;
4377 header->cmsg_type = ALG_SET_OP;
4378 header->cmsg_len = CMSG_LEN(4);
4379 uiptr = (void*)CMSG_DATA(header);
4380 *uiptr = (unsigned int)op;
4381
4382 /* set initialization vector */
4383 if (iv.buf != NULL) {
4384 header = CMSG_NXTHDR(&msg, header);
4385 if (header == NULL) {
4386 PyErr_SetString(PyExc_RuntimeError,
4387 "unexpected NULL result from CMSG_NXTHDR(iv)");
4388 goto finally;
4389 }
4390 header->cmsg_level = SOL_ALG;
4391 header->cmsg_type = ALG_SET_IV;
4392 header->cmsg_len = CMSG_SPACE(sizeof(*alg_iv) + iv.len);
4393 alg_iv = (void*)CMSG_DATA(header);
4394 alg_iv->ivlen = iv.len;
4395 memcpy(alg_iv->iv, iv.buf, iv.len);
4396 }
4397
4398 /* set length of associated data for AEAD */
4399 if (assoclen >= 0) {
4400 header = CMSG_NXTHDR(&msg, header);
4401 if (header == NULL) {
4402 PyErr_SetString(PyExc_RuntimeError,
4403 "unexpected NULL result from CMSG_NXTHDR(assoc)");
4404 goto finally;
4405 }
4406 header->cmsg_level = SOL_ALG;
4407 header->cmsg_type = ALG_SET_AEAD_ASSOCLEN;
4408 header->cmsg_len = CMSG_LEN(4);
4409 uiptr = (void*)CMSG_DATA(header);
4410 *uiptr = (unsigned int)assoclen;
4411 }
4412
4413 ctx.msg = &msg;
4414 ctx.flags = flags;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004415 if (sock_call(self, 1, sock_sendmsg_impl, &ctx) < 0) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004416 goto finally;
Victor Stinner288b5bf2016-09-12 11:45:59 +02004417 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004418
4419 retval = PyLong_FromSsize_t(ctx.result);
4420
4421 finally:
4422 PyMem_Free(controlbuf);
4423 if (iv.buf != NULL) {
4424 PyBuffer_Release(&iv);
4425 }
Victor Stinner52d61e42016-09-12 11:41:58 +02004426 PyMem_Free(msg.msg_iov);
4427 for (i = 0; i < ndatabufs; i++) {
Christian Heimesdffa3942016-09-05 23:54:41 +02004428 PyBuffer_Release(&databufs[i]);
Victor Stinner52d61e42016-09-12 11:41:58 +02004429 }
Christian Heimesdffa3942016-09-05 23:54:41 +02004430 PyMem_Free(databufs);
4431 return retval;
4432}
4433
4434PyDoc_STRVAR(sendmsg_afalg_doc,
4435"sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags=MSG_MORE]]])\n\
4436\n\
4437Set operation mode, IV and length of associated data for an AF_ALG\n\
4438operation socket.");
4439#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004440
Guido van Rossum30a685f1991-06-27 15:51:29 +00004441/* s.shutdown(how) method */
4442
Guido van Rossum73624e91994-10-10 17:59:00 +00004443static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004444sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004445{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 int how;
4447 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004448
Serhiy Storchaka78980432013-01-15 01:12:17 +02004449 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 if (how == -1 && PyErr_Occurred())
4451 return NULL;
4452 Py_BEGIN_ALLOW_THREADS
4453 res = shutdown(s->sock_fd, how);
4454 Py_END_ALLOW_THREADS
4455 if (res < 0)
4456 return s->errorhandler();
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02004457 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004458}
4459
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004460PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004461"shutdown(flag)\n\
4462\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004463Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4464of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004465
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004466#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004467static PyObject*
4468sock_ioctl(PySocketSockObject *s, PyObject *arg)
4469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 unsigned long cmd = SIO_RCVALL;
4471 PyObject *argO;
4472 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4475 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 switch (cmd) {
4478 case SIO_RCVALL: {
4479 unsigned int option = RCVALL_ON;
4480 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4481 return NULL;
4482 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4483 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4484 return set_error();
4485 }
4486 return PyLong_FromUnsignedLong(recv); }
4487 case SIO_KEEPALIVE_VALS: {
4488 struct tcp_keepalive ka;
4489 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4490 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4491 return NULL;
4492 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4493 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4494 return set_error();
4495 }
4496 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004497#if defined(SIO_LOOPBACK_FAST_PATH)
4498 case SIO_LOOPBACK_FAST_PATH: {
4499 unsigned int option;
4500 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4501 return NULL;
4502 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4503 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4504 return set_error();
4505 }
4506 return PyLong_FromUnsignedLong(recv); }
4507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 default:
4509 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4510 return NULL;
4511 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004512}
4513PyDoc_STRVAR(sock_ioctl_doc,
4514"ioctl(cmd, option) -> long\n\
4515\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004516Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4517SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004518SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4519SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004520#endif
4521
4522#if defined(MS_WINDOWS)
4523static PyObject*
4524sock_share(PySocketSockObject *s, PyObject *arg)
4525{
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004526 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004527 DWORD processId;
4528 int result;
4529
4530 if (!PyArg_ParseTuple(arg, "I", &processId))
4531 return NULL;
4532
4533 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004534 result = WSADuplicateSocketW(s->sock_fd, processId, &info);
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004535 Py_END_ALLOW_THREADS
4536 if (result == SOCKET_ERROR)
4537 return set_error();
4538 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4539}
4540PyDoc_STRVAR(sock_share_doc,
4541"share(process_id) -> bytes\n\
4542\n\
4543Share the socket with another process. The target process id\n\
4544must be provided and the resulting bytes object passed to the target\n\
4545process. There the shared socket can be instantiated by calling\n\
4546socket.fromshare().");
4547
Christian Heimesfaf2f632008-01-06 16:59:19 +00004548
4549#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004550
4551/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004552
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004553static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4555 accept_doc},
4556 {"bind", (PyCFunction)sock_bind, METH_O,
4557 bind_doc},
4558 {"close", (PyCFunction)sock_close, METH_NOARGS,
4559 close_doc},
4560 {"connect", (PyCFunction)sock_connect, METH_O,
4561 connect_doc},
4562 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4563 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004564 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4565 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4567 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004568#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 {"getpeername", (PyCFunction)sock_getpeername,
4570 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 {"getsockname", (PyCFunction)sock_getsockname,
4573 METH_NOARGS, getsockname_doc},
4574 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4575 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004576#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4578 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004579#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004580#if defined(MS_WINDOWS)
4581 {"share", (PyCFunction)sock_share, METH_VARARGS,
4582 sock_share_doc},
4583#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004584 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 listen_doc},
4586 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4587 recv_doc},
4588 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4589 recv_into_doc},
4590 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4591 recvfrom_doc},
4592 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4593 recvfrom_into_doc},
4594 {"send", (PyCFunction)sock_send, METH_VARARGS,
4595 send_doc},
4596 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4597 sendall_doc},
4598 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4599 sendto_doc},
4600 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4601 setblocking_doc},
4602 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4603 settimeout_doc},
4604 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4605 gettimeout_doc},
4606 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4607 setsockopt_doc},
4608 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4609 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004610#ifdef CMSG_LEN
4611 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4612 recvmsg_doc},
4613 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4614 recvmsg_into_doc,},
4615 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4616 sendmsg_doc},
4617#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02004618#ifdef HAVE_SOCKADDR_ALG
4619 {"sendmsg_afalg", (PyCFunction)sock_sendmsg_afalg, METH_VARARGS | METH_KEYWORDS,
4620 sendmsg_afalg_doc},
4621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004623};
4624
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004625/* SockObject members */
4626static PyMemberDef sock_memberlist[] = {
4627 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4628 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4629 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004630 {0},
4631};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004632
Victor Stinner71694d52015-03-28 01:18:54 +01004633static PyGetSetDef sock_getsetlist[] = {
4634 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4635 {NULL} /* sentinel */
4636};
4637
Guido van Rossum73624e91994-10-10 17:59:00 +00004638/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004639 First close the file description. */
4640
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004641static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004642sock_finalize(PySocketSockObject *s)
4643{
4644 SOCKET_T fd;
4645 PyObject *error_type, *error_value, *error_traceback;
4646
4647 /* Save the current exception, if any. */
4648 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4649
Victor Stinnerd3afb622016-07-22 17:47:09 +02004650 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004651 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4652 /* Spurious errors can appear at shutdown */
4653 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4654 PyErr_WriteUnraisable((PyObject *)s);
4655 }
4656 }
4657
4658 /* Only close the socket *after* logging the ResourceWarning warning
4659 to allow the logger to call socket methods like
4660 socket.getsockname(). If the socket is closed before, socket
4661 methods fails with the EBADF error. */
4662 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004663 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004664
4665 /* We do not want to retry upon EINTR: see sock_close() */
4666 Py_BEGIN_ALLOW_THREADS
4667 (void) SOCKETCLOSE(fd);
4668 Py_END_ALLOW_THREADS
4669 }
4670
4671 /* Restore the saved exception. */
4672 PyErr_Restore(error_type, error_value, error_traceback);
4673}
4674
4675static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004676sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004677{
Victor Stinner19a8e842016-03-21 16:36:48 +01004678 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4679 return;
4680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004682}
4683
Guido van Rossum30a685f1991-06-27 15:51:29 +00004684
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004685static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004686sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004687{
Victor Stinnere254e532014-07-26 14:36:55 +02004688 long sock_fd;
4689 /* On Windows, this test is needed because SOCKET_T is unsigned */
4690 if (s->sock_fd == INVALID_SOCKET) {
4691 sock_fd = -1;
4692 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004693#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004694 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 /* this can occur on Win64, and actually there is a special
4696 ugly printf formatter for decimal pointer length integer
4697 printing, only bother if necessary*/
4698 PyErr_SetString(PyExc_OverflowError,
4699 "no printf formatter to display "
4700 "the socket descriptor in decimal");
4701 return NULL;
4702 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004703#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004704 else
4705 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 return PyUnicode_FromFormat(
4707 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004708 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 s->sock_type,
4710 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004711}
4712
4713
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004714/* Create a new, uninitialized socket object. */
4715
4716static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004717sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004718{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004719 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 new = type->tp_alloc(type, 0);
4722 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004723 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004724 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 ((PySocketSockObject *)new)->errorhandler = &set_error;
4726 }
4727 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004728}
4729
4730
4731/* Initialize a new socket object. */
4732
Victor Stinnerdaf45552013-08-28 00:53:59 +02004733#ifdef SOCK_CLOEXEC
4734/* socket() and socketpair() fail with EINVAL on Linux kernel older
4735 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4736static int sock_cloexec_works = -1;
4737#endif
4738
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004739/*ARGSUSED*/
4740static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004741sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 PySocketSockObject *s = (PySocketSockObject *)self;
4744 PyObject *fdobj = NULL;
4745 SOCKET_T fd = INVALID_SOCKET;
4746 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4747 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004748#ifndef MS_WINDOWS
4749#ifdef SOCK_CLOEXEC
4750 int *atomic_flag_works = &sock_cloexec_works;
4751#else
4752 int *atomic_flag_works = NULL;
4753#endif
4754#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4757 "|iiiO:socket", keywords,
4758 &family, &type, &proto, &fdobj))
4759 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004762#ifdef MS_WINDOWS
4763 /* recreate a socket that was duplicated */
4764 if (PyBytes_Check(fdobj)) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004765 WSAPROTOCOL_INFOW info;
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004766 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4767 PyErr_Format(PyExc_ValueError,
4768 "socket descriptor string has wrong size, "
4769 "should be %zu bytes.", sizeof(info));
4770 return -1;
4771 }
4772 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4773 Py_BEGIN_ALLOW_THREADS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004774 fd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004775 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4776 Py_END_ALLOW_THREADS
4777 if (fd == INVALID_SOCKET) {
4778 set_error();
4779 return -1;
4780 }
4781 family = info.iAddressFamily;
4782 type = info.iSocketType;
4783 proto = info.iProtocol;
4784 }
4785 else
4786#endif
4787 {
4788 fd = PyLong_AsSocket_t(fdobj);
4789 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4790 return -1;
4791 if (fd == INVALID_SOCKET) {
4792 PyErr_SetString(PyExc_ValueError,
4793 "can't use invalid socket value");
4794 return -1;
4795 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 }
4797 }
4798 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004799#ifdef MS_WINDOWS
4800 /* Windows implementation */
4801#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4802#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4803#endif
4804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004806 if (support_wsa_no_inherit) {
Segev Finer9f3bdcb2017-06-28 23:51:00 +03004807 fd = WSASocketW(family, type, proto,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004808 NULL, 0,
4809 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4810 if (fd == INVALID_SOCKET) {
4811 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4812 support_wsa_no_inherit = 0;
4813 fd = socket(family, type, proto);
4814 }
4815 }
4816 else {
4817 fd = socket(family, type, proto);
4818 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 if (fd == INVALID_SOCKET) {
4822 set_error();
4823 return -1;
4824 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004825
4826 if (!support_wsa_no_inherit) {
4827 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4828 closesocket(fd);
4829 PyErr_SetFromWindowsErr(0);
4830 return -1;
4831 }
4832 }
4833#else
4834 /* UNIX */
4835 Py_BEGIN_ALLOW_THREADS
4836#ifdef SOCK_CLOEXEC
4837 if (sock_cloexec_works != 0) {
4838 fd = socket(family, type | SOCK_CLOEXEC, proto);
4839 if (sock_cloexec_works == -1) {
4840 if (fd >= 0) {
4841 sock_cloexec_works = 1;
4842 }
4843 else if (errno == EINVAL) {
4844 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4845 sock_cloexec_works = 0;
4846 fd = socket(family, type, proto);
4847 }
4848 }
4849 }
4850 else
4851#endif
4852 {
4853 fd = socket(family, type, proto);
4854 }
4855 Py_END_ALLOW_THREADS
4856
4857 if (fd == INVALID_SOCKET) {
4858 set_error();
4859 return -1;
4860 }
4861
4862 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4863 SOCKETCLOSE(fd);
4864 return -1;
4865 }
4866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 }
Christian Heimes0b9d64e2016-09-09 00:28:57 +02004868 if (init_sockobject(s, fd, family, type, proto) == -1) {
4869 SOCKETCLOSE(fd);
4870 return -1;
4871 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004874
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004875}
4876
4877
Guido van Rossumb6775db1994-08-01 11:34:53 +00004878/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004879
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004880static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4882 "_socket.socket", /* tp_name */
4883 sizeof(PySocketSockObject), /* tp_basicsize */
4884 0, /* tp_itemsize */
4885 (destructor)sock_dealloc, /* tp_dealloc */
4886 0, /* tp_print */
4887 0, /* tp_getattr */
4888 0, /* tp_setattr */
4889 0, /* tp_reserved */
4890 (reprfunc)sock_repr, /* tp_repr */
4891 0, /* tp_as_number */
4892 0, /* tp_as_sequence */
4893 0, /* tp_as_mapping */
4894 0, /* tp_hash */
4895 0, /* tp_call */
4896 0, /* tp_str */
4897 PyObject_GenericGetAttr, /* tp_getattro */
4898 0, /* tp_setattro */
4899 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004900 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4901 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 sock_doc, /* tp_doc */
4903 0, /* tp_traverse */
4904 0, /* tp_clear */
4905 0, /* tp_richcompare */
4906 0, /* tp_weaklistoffset */
4907 0, /* tp_iter */
4908 0, /* tp_iternext */
4909 sock_methods, /* tp_methods */
4910 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004911 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 0, /* tp_base */
4913 0, /* tp_dict */
4914 0, /* tp_descr_get */
4915 0, /* tp_descr_set */
4916 0, /* tp_dictoffset */
4917 sock_initobj, /* tp_init */
4918 PyType_GenericAlloc, /* tp_alloc */
4919 sock_new, /* tp_new */
4920 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004921 0, /* tp_is_gc */
4922 0, /* tp_bases */
4923 0, /* tp_mro */
4924 0, /* tp_cache */
4925 0, /* tp_subclasses */
4926 0, /* tp_weaklist */
4927 0, /* tp_del */
4928 0, /* tp_version_tag */
4929 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004930};
4931
Guido van Rossum30a685f1991-06-27 15:51:29 +00004932
Guido van Rossum81194471991-07-27 21:42:02 +00004933/* Python interface to gethostname(). */
4934
4935/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004936static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004937socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004938{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004939#ifdef MS_WINDOWS
4940 /* Don't use winsock's gethostname, as this returns the ANSI
4941 version of the hostname, whereas we need a Unicode string.
4942 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004943 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004944 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004945 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004946 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004947
4948 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004949 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004950
4951 if (GetLastError() != ERROR_MORE_DATA)
4952 return PyErr_SetFromWindowsErr(0);
4953
4954 if (size == 0)
4955 return PyUnicode_New(0, 0);
4956
4957 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4958 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004959 name = PyMem_New(wchar_t, size);
4960 if (!name) {
4961 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004962 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004963 }
Victor Stinner74168972011-11-17 01:11:36 +01004964 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4965 name,
4966 &size))
4967 {
4968 PyMem_Free(name);
4969 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004970 }
Victor Stinner74168972011-11-17 01:11:36 +01004971
4972 result = PyUnicode_FromWideChar(name, size);
4973 PyMem_Free(name);
4974 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004975#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 char buf[1024];
4977 int res;
4978 Py_BEGIN_ALLOW_THREADS
4979 res = gethostname(buf, (int) sizeof buf - 1);
4980 Py_END_ALLOW_THREADS
4981 if (res < 0)
4982 return set_error();
4983 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004984 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004985#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004986}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004988PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004989"gethostname() -> string\n\
4990\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004991Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004992
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004993#ifdef HAVE_SETHOSTNAME
4994PyDoc_STRVAR(sethostname_doc,
4995"sethostname(name)\n\n\
4996Sets the hostname to name.");
4997
4998static PyObject *
4999socket_sethostname(PyObject *self, PyObject *args)
5000{
5001 PyObject *hnobj;
5002 Py_buffer buf;
5003 int res, flag = 0;
5004
Christian Heimesd2774c72013-06-19 02:06:29 +02005005#ifdef _AIX
5006/* issue #18259, not declared in any useful header file */
5007extern int sethostname(const char *, size_t);
5008#endif
5009
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005010 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
5011 PyErr_Clear();
5012 if (!PyArg_ParseTuple(args, "O&:sethostname",
5013 PyUnicode_FSConverter, &hnobj))
5014 return NULL;
5015 flag = 1;
5016 }
5017 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
5018 if (!res) {
5019 res = sethostname(buf.buf, buf.len);
5020 PyBuffer_Release(&buf);
5021 }
5022 if (flag)
5023 Py_DECREF(hnobj);
5024 if (res)
5025 return set_error();
5026 Py_RETURN_NONE;
5027}
5028#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00005029
Guido van Rossum30a685f1991-06-27 15:51:29 +00005030/* Python interface to gethostbyname(name). */
5031
5032/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005033static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005034socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 char *name;
5037 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005038 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005039
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005040 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 return NULL;
5042 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005043 goto finally;
5044 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
5045finally:
5046 PyMem_Free(name);
5047 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00005048}
5049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005050PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005051"gethostbyname(host) -> address\n\
5052\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005053Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005054
5055
Victor Stinner72400302016-01-28 15:41:01 +01005056static PyObject*
5057sock_decode_hostname(const char *name)
5058{
5059#ifdef MS_WINDOWS
5060 /* Issue #26227: gethostbyaddr() returns a string encoded
5061 * to the ANSI code page */
5062 return PyUnicode_DecodeFSDefault(name);
5063#else
5064 /* Decode from UTF-8 */
5065 return PyUnicode_FromString(name);
5066#endif
5067}
5068
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005069/* Convenience function common to gethostbyname_ex and gethostbyaddr */
5070
5071static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02005072gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 char **pch;
5075 PyObject *rtn_tuple = (PyObject *)NULL;
5076 PyObject *name_list = (PyObject *)NULL;
5077 PyObject *addr_list = (PyObject *)NULL;
5078 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01005079 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 if (h == NULL) {
5082 /* Let's get real error message to return */
5083 set_herror(h_errno);
5084 return NULL;
5085 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 if (h->h_addrtype != af) {
5088 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01005089 errno = EAFNOSUPPORT;
5090 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 return NULL;
5092 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 case AF_INET:
5097 if (alen < sizeof(struct sockaddr_in))
5098 return NULL;
5099 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005100
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005101#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 case AF_INET6:
5103 if (alen < sizeof(struct sockaddr_in6))
5104 return NULL;
5105 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005106#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 if ((name_list = PyList_New(0)) == NULL)
5111 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 if ((addr_list = PyList_New(0)) == NULL)
5114 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 /* SF #1511317: h_aliases can be NULL */
5117 if (h->h_aliases) {
5118 for (pch = h->h_aliases; *pch != NULL; pch++) {
5119 int status;
5120 tmp = PyUnicode_FromString(*pch);
5121 if (tmp == NULL)
5122 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 status = PyList_Append(name_list, tmp);
5125 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 if (status)
5128 goto err;
5129 }
5130 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 for (pch = h->h_addr_list; *pch != NULL; pch++) {
5133 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00005136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 case AF_INET:
5138 {
5139 struct sockaddr_in sin;
5140 memset(&sin, 0, sizeof(sin));
5141 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005142#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
5146 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 if (pch == h->h_addr_list && alen >= sizeof(sin))
5149 memcpy((char *) addr, &sin, sizeof(sin));
5150 break;
5151 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005152
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005153#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 case AF_INET6:
5155 {
5156 struct sockaddr_in6 sin6;
5157 memset(&sin6, 0, sizeof(sin6));
5158 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005159#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
5163 tmp = makeipaddr((struct sockaddr *)&sin6,
5164 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00005165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 if (pch == h->h_addr_list && alen >= sizeof(sin6))
5167 memcpy((char *) addr, &sin6, sizeof(sin6));
5168 break;
5169 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005170#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00005171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005173 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 "unsupported address family");
5175 return NULL;
5176 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 if (tmp == NULL)
5179 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00005180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 status = PyList_Append(addr_list, tmp);
5182 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 if (status)
5185 goto err;
5186 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00005187
Victor Stinner72400302016-01-28 15:41:01 +01005188 name = sock_decode_hostname(h->h_name);
5189 if (name == NULL)
5190 goto err;
5191 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00005192
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005193 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 Py_XDECREF(name_list);
5195 Py_XDECREF(addr_list);
5196 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005197}
5198
5199
5200/* Python interface to gethostbyname_ex(name). */
5201
5202/*ARGSUSED*/
5203static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005204socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005205{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005206 char *name;
5207 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01005208 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005210 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005211#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005213#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005215#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 char buf[16384];
5217 int buf_len = (sizeof buf) - 1;
5218 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005219#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005220#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005222#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005223#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005224
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005225 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01005227 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005228 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005229 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005230#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005231#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005232 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005234#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005236#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 memset((void *) &data, '\0', sizeof(data));
5238 result = gethostbyname_r(name, &hp_allocated, &data);
5239 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005240#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005241#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005242#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005244#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005245 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005247#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 Py_END_ALLOW_THREADS
5249 /* Some C libraries would require addr.__ss_family instead of
5250 addr.ss_family.
5251 Therefore, we cast the sockaddr_storage into sockaddr to
5252 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01005253 sa = SAS2SA(&addr);
5254 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005256#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00005258#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005259finally:
5260 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005262}
5263
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005264PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005265"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
5266\n\
5267Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005268for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00005269
5270
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005271/* Python interface to gethostbyaddr(IP). */
5272
5273/*ARGSUSED*/
5274static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005275socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005276{
Charles-François Natali8b759652011-12-23 16:44:51 +01005277 sock_addr_t addr;
5278 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 char *ip_num;
5280 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005281 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005282#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005284#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005286#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 /* glibcs up to 2.10 assume that the buf argument to
5288 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
5289 does not ensure. The attribute below instructs the compiler
5290 to maintain this alignment. */
5291 char buf[16384] Py_ALIGNED(8);
5292 int buf_len = (sizeof buf) - 1;
5293 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005294#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02005295#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005297#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005298#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 char *ap;
5300 int al;
5301 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005302
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005303 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 return NULL;
5305 af = AF_UNSPEC;
5306 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005307 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 af = sa->sa_family;
5309 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00005310 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 switch (af) {
5312 case AF_INET:
5313 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
5314 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
5315 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005316#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 case AF_INET6:
5318 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
5319 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
5320 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005322 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005323 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005324 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 }
5326 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005327#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005328#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02005329 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 &hp_allocated, buf, buf_len,
5331 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005332#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 h = gethostbyaddr_r(ap, al, af,
5334 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00005335#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 memset((void *) &data, '\0', sizeof(data));
5337 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
5338 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00005339#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005340#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00005341#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005343#endif
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005344 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00005346#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01005348 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005349#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00005351#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00005352finally:
5353 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00005355}
5356
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005357PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005358"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
5359\n\
5360Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005361for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005362
Guido van Rossum30a685f1991-06-27 15:51:29 +00005363
5364/* Python interface to getservbyname(name).
5365 This only returns the port number, since the other info is already
5366 known or not useful (like the list of aliases). */
5367
5368/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00005369static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005370socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00005371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 char *name, *proto=NULL;
5373 struct servent *sp;
5374 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
5375 return NULL;
5376 Py_BEGIN_ALLOW_THREADS
5377 sp = getservbyname(name, proto);
5378 Py_END_ALLOW_THREADS
5379 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005380 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 return NULL;
5382 }
5383 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00005384}
5385
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005386PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00005387"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00005388\n\
5389Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00005390The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5391otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005392
Guido van Rossum30a685f1991-06-27 15:51:29 +00005393
Barry Warsaw11b91a02004-06-28 00:50:43 +00005394/* Python interface to getservbyport(port).
5395 This only returns the service name, since the other info is already
5396 known or not useful (like the list of aliases). */
5397
5398/*ARGSUSED*/
5399static PyObject *
5400socket_getservbyport(PyObject *self, PyObject *args)
5401{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 int port;
5403 char *proto=NULL;
5404 struct servent *sp;
5405 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
5406 return NULL;
5407 if (port < 0 || port > 0xffff) {
5408 PyErr_SetString(
5409 PyExc_OverflowError,
5410 "getservbyport: port must be 0-65535.");
5411 return NULL;
5412 }
5413 Py_BEGIN_ALLOW_THREADS
5414 sp = getservbyport(htons((short)port), proto);
5415 Py_END_ALLOW_THREADS
5416 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005417 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 return NULL;
5419 }
5420 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00005421}
5422
5423PyDoc_STRVAR(getservbyport_doc,
5424"getservbyport(port[, protocolname]) -> string\n\
5425\n\
5426Return the service name from a port number and protocol name.\n\
5427The optional protocol name, if given, should be 'tcp' or 'udp',\n\
5428otherwise any protocol will match.");
5429
Guido van Rossum3901d851996-12-19 16:35:04 +00005430/* Python interface to getprotobyname(name).
5431 This only returns the protocol number, since the other info is
5432 already known or not useful (like the list of aliases). */
5433
5434/*ARGSUSED*/
5435static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005436socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00005437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 char *name;
5439 struct protoent *sp;
5440 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
5441 return NULL;
5442 Py_BEGIN_ALLOW_THREADS
5443 sp = getprotobyname(name);
5444 Py_END_ALLOW_THREADS
5445 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005446 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005447 return NULL;
5448 }
5449 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005450}
5451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005452PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005453"getprotobyname(name) -> integer\n\
5454\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005455Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005456
Guido van Rossum3901d851996-12-19 16:35:04 +00005457
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005458#ifndef NO_DUP
5459/* dup() function for socket fds */
5460
5461static PyObject *
5462socket_dup(PyObject *self, PyObject *fdobj)
5463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 SOCKET_T fd, newfd;
5465 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005466#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005467 WSAPROTOCOL_INFOW info;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005468#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 fd = PyLong_AsSocket_t(fdobj);
5471 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5472 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005473
Victor Stinnerdaf45552013-08-28 00:53:59 +02005474#ifdef MS_WINDOWS
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005475 if (WSADuplicateSocketW(fd, GetCurrentProcessId(), &info))
Victor Stinnerdaf45552013-08-28 00:53:59 +02005476 return set_error();
5477
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005478 newfd = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005479 FROM_PROTOCOL_INFO,
5480 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 if (newfd == INVALID_SOCKET)
5482 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005483
Victor Stinnerdaf45552013-08-28 00:53:59 +02005484 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5485 closesocket(newfd);
5486 PyErr_SetFromWindowsErr(0);
5487 return NULL;
5488 }
5489#else
5490 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5491 newfd = _Py_dup(fd);
5492 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005493 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005494#endif
5495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 newfdobj = PyLong_FromSocket_t(newfd);
5497 if (newfdobj == NULL)
5498 SOCKETCLOSE(newfd);
5499 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005500}
5501
5502PyDoc_STRVAR(dup_doc,
5503"dup(integer) -> integer\n\
5504\n\
5505Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5506sockets; on some platforms os.dup() won't work for socket file descriptors.");
5507#endif
5508
5509
Dave Cole331708b2004-08-09 04:51:41 +00005510#ifdef HAVE_SOCKETPAIR
5511/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005512 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005513 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005514
5515/*ARGSUSED*/
5516static PyObject *
5517socket_socketpair(PyObject *self, PyObject *args)
5518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 PySocketSockObject *s0 = NULL, *s1 = NULL;
5520 SOCKET_T sv[2];
5521 int family, type = SOCK_STREAM, proto = 0;
5522 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005523#ifdef SOCK_CLOEXEC
5524 int *atomic_flag_works = &sock_cloexec_works;
5525#else
5526 int *atomic_flag_works = NULL;
5527#endif
5528 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005529
5530#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005532#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5536 &family, &type, &proto))
5537 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005540 Py_BEGIN_ALLOW_THREADS
5541#ifdef SOCK_CLOEXEC
5542 if (sock_cloexec_works != 0) {
5543 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5544 if (sock_cloexec_works == -1) {
5545 if (ret >= 0) {
5546 sock_cloexec_works = 1;
5547 }
5548 else if (errno == EINVAL) {
5549 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5550 sock_cloexec_works = 0;
5551 ret = socketpair(family, type, proto, sv);
5552 }
5553 }
5554 }
5555 else
5556#endif
5557 {
5558 ret = socketpair(family, type, proto, sv);
5559 }
5560 Py_END_ALLOW_THREADS
5561
5562 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005564
5565 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5566 goto finally;
5567 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5568 goto finally;
5569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 s0 = new_sockobject(sv[0], family, type, proto);
5571 if (s0 == NULL)
5572 goto finally;
5573 s1 = new_sockobject(sv[1], family, type, proto);
5574 if (s1 == NULL)
5575 goto finally;
5576 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005577
5578finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 if (res == NULL) {
5580 if (s0 == NULL)
5581 SOCKETCLOSE(sv[0]);
5582 if (s1 == NULL)
5583 SOCKETCLOSE(sv[1]);
5584 }
5585 Py_XDECREF(s0);
5586 Py_XDECREF(s1);
5587 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005588}
5589
5590PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005591"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005592\n\
5593Create a pair of socket objects from the sockets returned by the platform\n\
5594socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005595The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005596AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005597
5598#endif /* HAVE_SOCKETPAIR */
5599
5600
Guido van Rossum006bf911996-06-12 04:04:55 +00005601static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005602socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005603{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005604 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005605
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005606 if (!PyArg_ParseTuple(args, "i:ntohs", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 return NULL;
5608 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005609 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005611 "ntohs: can't convert negative Python int to C "
5612 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005613 return NULL;
5614 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005615 if (x > 0xffff) {
5616 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5617 "ntohs: Python int too large to convert to C "
5618 "16-bit unsigned integer (The silent truncation "
5619 "is deprecated)",
5620 1)) {
5621 return NULL;
5622 }
5623 }
5624 return PyLong_FromUnsignedLong(ntohs((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005625}
5626
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005627PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005628"ntohs(integer) -> integer\n\
5629\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005630Convert a 16-bit unsigned integer from network to host byte order.\n\
5631Note that in case the received integer does not fit in 16-bit unsigned\n\
5632integer, but does fit in a positive C int, it is silently truncated to\n\
563316-bit unsigned integer.\n\
5634However, this silent truncation feature is deprecated, and will raise an \n\
5635exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005636
5637
Guido van Rossum006bf911996-06-12 04:04:55 +00005638static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005639socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005640{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 if (PyLong_Check(arg)) {
5644 x = PyLong_AsUnsignedLong(arg);
5645 if (x == (unsigned long) -1 && PyErr_Occurred())
5646 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005647#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 {
5649 unsigned long y;
5650 /* only want the trailing 32 bits */
5651 y = x & 0xFFFFFFFFUL;
5652 if (y ^ x)
5653 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005654 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005655 x = y;
5656 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 }
5659 else
5660 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005661 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005664}
5665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005666PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005667"ntohl(integer) -> integer\n\
5668\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005669Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005670
5671
Guido van Rossum006bf911996-06-12 04:04:55 +00005672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005673socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005674{
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005675 int x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005676
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005677 if (!PyArg_ParseTuple(args, "i:htons", &x)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005678 return NULL;
5679 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005680 if (x < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 PyErr_SetString(PyExc_OverflowError,
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005682 "htons: can't convert negative Python int to C "
5683 "16-bit unsigned integer");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005684 return NULL;
5685 }
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005686 if (x > 0xffff) {
5687 if (PyErr_WarnEx(PyExc_DeprecationWarning,
5688 "htons: Python int too large to convert to C "
5689 "16-bit unsigned integer (The silent truncation "
5690 "is deprecated)",
5691 1)) {
5692 return NULL;
5693 }
5694 }
5695 return PyLong_FromUnsignedLong(htons((unsigned short)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005696}
5697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005698PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005699"htons(integer) -> integer\n\
5700\n\
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +03005701Convert a 16-bit unsigned integer from host to network byte order.\n\
5702Note that in case the received integer does not fit in 16-bit unsigned\n\
5703integer, but does fit in a positive C int, it is silently truncated to\n\
570416-bit unsigned integer.\n\
5705However, this silent truncation feature is deprecated, and will raise an \n\
5706exception in future versions of Python.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005707
5708
Guido van Rossum006bf911996-06-12 04:04:55 +00005709static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005710socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 if (PyLong_Check(arg)) {
5715 x = PyLong_AsUnsignedLong(arg);
5716 if (x == (unsigned long) -1 && PyErr_Occurred())
5717 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005718#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 {
5720 unsigned long y;
5721 /* only want the trailing 32 bits */
5722 y = x & 0xFFFFFFFFUL;
5723 if (y ^ x)
5724 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005725 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 x = y;
5727 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005729 }
5730 else
5731 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005732 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 Py_TYPE(arg)->tp_name);
5734 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005735}
5736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005737PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005738"htonl(integer) -> integer\n\
5739\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005740Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005741
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005742/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005743
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005744PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005745"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005746\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005747Convert 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 +00005748binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005749
5750static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005751socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005752{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005753#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005755#endif
5756
5757#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005758#if (SIZEOF_INT != 4)
5759#error "Not sure if in_addr_t exists and int is not 32-bits."
5760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 /* Have to use inet_addr() instead */
5762 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005764 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5767 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005768
Tim Peters1df9fdd2003-02-13 03:13:40 +00005769
5770#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005771
5772#ifdef USE_INET_ATON_WEAKLINK
5773 if (inet_aton != NULL) {
5774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005775 if (inet_aton(ip_addr, &buf))
5776 return PyBytes_FromStringAndSize((char *)(&buf),
5777 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005778
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005779 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 "illegal IP address string passed to inet_aton");
5781 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005782
Thomas Wouters477c8d52006-05-27 19:21:47 +00005783#ifdef USE_INET_ATON_WEAKLINK
5784 } else {
5785#endif
5786
5787#endif
5788
5789#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 /* special-case this address as inet_addr might return INADDR_NONE
5792 * for this */
5793 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005794 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005796
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005797 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005801 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 "illegal IP address string passed to inet_aton");
5803 return NULL;
5804 }
5805 }
5806 return PyBytes_FromStringAndSize((char *) &packed_addr,
5807 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005808
5809#ifdef USE_INET_ATON_WEAKLINK
5810 }
5811#endif
5812
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005813#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005814}
5815
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005816PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005817"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005818\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005819Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005820
5821static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005822socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005823{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005824 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005826
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005827 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 return NULL;
5829 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005830
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005831 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005832 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005834 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005835 return NULL;
5836 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005837
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005838 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5839 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005840
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005841 SUPPRESS_DEPRECATED_CALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005843}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005844
Segev Finer9f3bdcb2017-06-28 23:51:00 +03005845#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005846
5847PyDoc_STRVAR(inet_pton_doc,
5848"inet_pton(af, ip) -> packed IP address string\n\
5849\n\
5850Convert an IP address from string format to a packed string suitable\n\
5851for use with low-level network functions.");
5852
5853static PyObject *
5854socket_inet_pton(PyObject *self, PyObject *args)
5855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 int af;
5857 char* ip;
5858 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005859#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005860 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005861#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5865 return NULL;
5866 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005867
Martin v. Löwis04697e82004-06-02 12:35:29 +00005868#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005870 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 "can't use AF_INET6, IPv6 is disabled");
5872 return NULL;
5873 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005874#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 retval = inet_pton(af, ip, packed);
5877 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005878 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005879 return NULL;
5880 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005881 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 "illegal IP address string passed to inet_pton");
5883 return NULL;
5884 } else if (af == AF_INET) {
5885 return PyBytes_FromStringAndSize(packed,
5886 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005887#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 } else if (af == AF_INET6) {
5889 return PyBytes_FromStringAndSize(packed,
5890 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005893 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 return NULL;
5895 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005896}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005897
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005898PyDoc_STRVAR(inet_ntop_doc,
5899"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5900\n\
5901Convert a packed IP address of the given family to string format.");
5902
5903static PyObject *
5904socket_inet_ntop(PyObject *self, PyObject *args)
5905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005907 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005909#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005910 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005911#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005913#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5916 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005917
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005918 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 return NULL;
5920 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005923 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 PyErr_SetString(PyExc_ValueError,
5925 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005926 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005927 return NULL;
5928 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005929#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005931 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 PyErr_SetString(PyExc_ValueError,
5933 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005934 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 return NULL;
5936 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 } else {
5939 PyErr_Format(PyExc_ValueError,
5940 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005941 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 return NULL;
5943 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005944
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005945 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5946 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005948 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 return NULL;
5950 } else {
5951 return PyUnicode_FromString(retval);
5952 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005953}
5954
5955#endif /* HAVE_INET_PTON */
5956
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005957/* Python interface to getaddrinfo(host, port). */
5958
5959/*ARGSUSED*/
5960static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005961socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005962{
Victor Stinner77af1722011-05-26 14:05:59 +02005963 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005964 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 struct addrinfo hints, *res;
5966 struct addrinfo *res0 = NULL;
5967 PyObject *hobj = NULL;
5968 PyObject *pobj = (PyObject *)NULL;
5969 char pbuf[30];
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +02005970 const char *hptr, *pptr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 int family, socktype, protocol, flags;
5972 int error;
5973 PyObject *all = (PyObject *)NULL;
5974 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005975
Georg Brandl6083a4b2013-10-14 06:51:46 +02005976 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005977 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005978 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005979 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 &protocol, &flags)) {
5981 return NULL;
5982 }
5983 if (hobj == Py_None) {
5984 hptr = NULL;
5985 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005986 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 if (!idna)
5988 return NULL;
5989 assert(PyBytes_Check(idna));
5990 hptr = PyBytes_AS_STRING(idna);
5991 } else if (PyBytes_Check(hobj)) {
5992 hptr = PyBytes_AsString(hobj);
5993 } else {
5994 PyErr_SetString(PyExc_TypeError,
5995 "getaddrinfo() argument 1 must be string or None");
5996 return NULL;
5997 }
5998 if (PyLong_CheckExact(pobj)) {
5999 long value = PyLong_AsLong(pobj);
6000 if (value == -1 && PyErr_Occurred())
6001 goto err;
6002 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
6003 pptr = pbuf;
6004 } else if (PyUnicode_Check(pobj)) {
Serhiy Storchaka06515832016-11-20 09:13:07 +02006005 pptr = PyUnicode_AsUTF8(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00006006 if (pptr == NULL)
6007 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006008 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00006009 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 } else if (pobj == Py_None) {
6011 pptr = (char *)NULL;
6012 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006013 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 goto err;
6015 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02006016#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006017 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
6018 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01006019 * if AI_NUMERICSERV is set and the servname is NULL or "0".
6020 * This workaround avoids a segfault in libsystem.
6021 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02006022 pptr = "00";
6023 }
6024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 memset(&hints, 0, sizeof(hints));
6026 hints.ai_family = family;
6027 hints.ai_socktype = socktype;
6028 hints.ai_protocol = protocol;
6029 hints.ai_flags = flags;
6030 Py_BEGIN_ALLOW_THREADS
6031 ACQUIRE_GETADDRINFO_LOCK
6032 error = getaddrinfo(hptr, pptr, &hints, &res0);
6033 Py_END_ALLOW_THREADS
6034 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6035 if (error) {
6036 set_gaierror(error);
6037 goto err;
6038 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006039
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04006040 all = PyList_New(0);
6041 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 goto err;
6043 for (res = res0; res; res = res->ai_next) {
6044 PyObject *single;
6045 PyObject *addr =
6046 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
6047 if (addr == NULL)
6048 goto err;
6049 single = Py_BuildValue("iiisO", res->ai_family,
6050 res->ai_socktype, res->ai_protocol,
6051 res->ai_canonname ? res->ai_canonname : "",
6052 addr);
6053 Py_DECREF(addr);
6054 if (single == NULL)
6055 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 if (PyList_Append(all, single))
6058 goto err;
6059 Py_XDECREF(single);
6060 }
6061 Py_XDECREF(idna);
6062 if (res0)
6063 freeaddrinfo(res0);
6064 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006065 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 Py_XDECREF(all);
6067 Py_XDECREF(idna);
6068 if (res0)
6069 freeaddrinfo(res0);
6070 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006071}
6072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006073PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03006074"getaddrinfo(host, port [, family, type, proto, flags])\n\
6075 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006076\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006077Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006078
6079/* Python interface to getnameinfo(sa, flags). */
6080
6081/*ARGSUSED*/
6082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006083socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 PyObject *sa = (PyObject *)NULL;
6086 int flags;
6087 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01006088 int port;
6089 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
6091 struct addrinfo hints, *res = NULL;
6092 int error;
6093 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01006094 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 flags = flowinfo = scope_id = 0;
6097 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
6098 return NULL;
6099 if (!PyTuple_Check(sa)) {
6100 PyErr_SetString(PyExc_TypeError,
6101 "getnameinfo() argument 1 must be a tuple");
6102 return NULL;
6103 }
Oren Milman1d1d3e92017-08-20 18:35:36 +03006104 if (!PyArg_ParseTuple(sa, "si|II;getnameinfo(): illegal sockaddr argument",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 &hostp, &port, &flowinfo, &scope_id))
Oren Milman1d1d3e92017-08-20 18:35:36 +03006106 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 return NULL;
Oren Milman1d1d3e92017-08-20 18:35:36 +03006108 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02006109 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01006110 PyErr_SetString(PyExc_OverflowError,
Oren Milman1d1d3e92017-08-20 18:35:36 +03006111 "getnameinfo(): flowinfo must be 0-1048575.");
Charles-François Natali366999a2012-01-02 15:47:29 +01006112 return NULL;
6113 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
6115 memset(&hints, 0, sizeof(hints));
6116 hints.ai_family = AF_UNSPEC;
6117 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00006118 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 Py_BEGIN_ALLOW_THREADS
6120 ACQUIRE_GETADDRINFO_LOCK
6121 error = getaddrinfo(hostp, pbuf, &hints, &res);
6122 Py_END_ALLOW_THREADS
6123 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
6124 if (error) {
6125 set_gaierror(error);
6126 goto fail;
6127 }
6128 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006129 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 "sockaddr resolved to multiple addresses");
6131 goto fail;
6132 }
6133 switch (res->ai_family) {
6134 case AF_INET:
6135 {
6136 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006137 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 "IPv4 sockaddr must be 2 tuple");
6139 goto fail;
6140 }
6141 break;
6142 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00006143#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 case AF_INET6:
6145 {
6146 struct sockaddr_in6 *sin6;
6147 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01006148 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149 sin6->sin6_scope_id = scope_id;
6150 break;
6151 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00006154 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
6156 if (error) {
6157 set_gaierror(error);
6158 goto fail;
6159 }
Victor Stinner72400302016-01-28 15:41:01 +01006160
6161 name = sock_decode_hostname(hbuf);
6162 if (name == NULL)
6163 goto fail;
6164 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006165
6166fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167 if (res)
6168 freeaddrinfo(res);
6169 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006170}
6171
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006172PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006173"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006174\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006175Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006176
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006177
6178/* Python API to getting and setting the default timeout value. */
6179
6180static PyObject *
6181socket_getdefaulttimeout(PyObject *self)
6182{
Victor Stinner71694d52015-03-28 01:18:54 +01006183 if (defaulttimeout < 0) {
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006184 Py_RETURN_NONE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185 }
Victor Stinner71694d52015-03-28 01:18:54 +01006186 else {
6187 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
6188 return PyFloat_FromDouble(seconds);
6189 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006190}
6191
6192PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006193"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006194\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006195Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006196A value of None indicates that new socket objects have no timeout.\n\
6197When the socket module is first imported, the default is None.");
6198
6199static PyObject *
6200socket_setdefaulttimeout(PyObject *self, PyObject *arg)
6201{
Victor Stinner71694d52015-03-28 01:18:54 +01006202 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006203
Victor Stinner71694d52015-03-28 01:18:54 +01006204 if (socket_parse_timeout(&timeout, arg) < 0)
6205 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006208
Serhiy Storchaka228b12e2017-01-23 09:47:21 +02006209 Py_RETURN_NONE;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006210}
6211
6212PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006213"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006214\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03006215Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00006216A value of None indicates that new socket objects have no timeout.\n\
6217When the socket module is first imported, the default is None.");
6218
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006219#ifdef HAVE_IF_NAMEINDEX
6220/* Python API for getting interface indices and names */
6221
6222static PyObject *
6223socket_if_nameindex(PyObject *self, PyObject *arg)
6224{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006225 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02006226 int i;
6227 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02006228
Charles-François Natali60713592011-05-20 16:55:06 +02006229 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006230 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006231 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006232 return NULL;
6233 }
6234
6235 list = PyList_New(0);
6236 if (list == NULL) {
6237 if_freenameindex(ni);
6238 return NULL;
6239 }
6240
Charles-François Natali60713592011-05-20 16:55:06 +02006241 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
6242 PyObject *ni_tuple = Py_BuildValue("IO&",
6243 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006244
6245 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
6246 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02006247 Py_DECREF(list);
6248 if_freenameindex(ni);
6249 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006250 }
6251 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006252 }
6253
6254 if_freenameindex(ni);
6255 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006256}
6257
6258PyDoc_STRVAR(if_nameindex_doc,
6259"if_nameindex()\n\
6260\n\
6261Returns a list of network interface information (index, name) tuples.");
6262
Charles-François Natali60713592011-05-20 16:55:06 +02006263static PyObject *
6264socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006265{
Charles-François Natali60713592011-05-20 16:55:06 +02006266 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006267 unsigned long index;
6268
Charles-François Natali60713592011-05-20 16:55:06 +02006269 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
6270 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006271 return NULL;
6272
Charles-François Natali60713592011-05-20 16:55:06 +02006273 index = if_nametoindex(PyBytes_AS_STRING(oname));
6274 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006275 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02006276 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006277 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006278 return NULL;
6279 }
6280
6281 return PyLong_FromUnsignedLong(index);
6282}
6283
6284PyDoc_STRVAR(if_nametoindex_doc,
6285"if_nametoindex(if_name)\n\
6286\n\
6287Returns the interface index corresponding to the interface name if_name.");
6288
Charles-François Natali60713592011-05-20 16:55:06 +02006289static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006290socket_if_indextoname(PyObject *self, PyObject *arg)
6291{
Charles-François Natali60713592011-05-20 16:55:06 +02006292 unsigned long index;
6293 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006294
Charles-François Natali60713592011-05-20 16:55:06 +02006295 index = PyLong_AsUnsignedLong(arg);
6296 if (index == (unsigned long) -1)
6297 return NULL;
6298
6299 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006300 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006301 return NULL;
6302 }
6303
Charles-François Natali60713592011-05-20 16:55:06 +02006304 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006305}
6306
6307PyDoc_STRVAR(if_indextoname_doc,
6308"if_indextoname(if_index)\n\
6309\n\
6310Returns the interface name corresponding to the interface index if_index.");
6311
6312#endif /* HAVE_IF_NAMEINDEX */
6313
6314
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006315#ifdef CMSG_LEN
6316/* Python interface to CMSG_LEN(length). */
6317
6318static PyObject *
6319socket_CMSG_LEN(PyObject *self, PyObject *args)
6320{
6321 Py_ssize_t length;
6322 size_t result;
6323
6324 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
6325 return NULL;
6326 if (length < 0 || !get_CMSG_LEN(length, &result)) {
6327 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
6328 return NULL;
6329 }
6330 return PyLong_FromSize_t(result);
6331}
6332
6333PyDoc_STRVAR(CMSG_LEN_doc,
6334"CMSG_LEN(length) -> control message length\n\
6335\n\
6336Return the total length, without trailing padding, of an ancillary\n\
6337data item with associated data of the given length. This value can\n\
6338often be used as the buffer size for recvmsg() to receive a single\n\
6339item of ancillary data, but RFC 3542 requires portable applications to\n\
6340use CMSG_SPACE() and thus include space for padding, even when the\n\
6341item will be the last in the buffer. Raises OverflowError if length\n\
6342is outside the permissible range of values.");
6343
6344
6345#ifdef CMSG_SPACE
6346/* Python interface to CMSG_SPACE(length). */
6347
6348static PyObject *
6349socket_CMSG_SPACE(PyObject *self, PyObject *args)
6350{
6351 Py_ssize_t length;
6352 size_t result;
6353
6354 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
6355 return NULL;
6356 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
6357 PyErr_SetString(PyExc_OverflowError,
6358 "CMSG_SPACE() argument out of range");
6359 return NULL;
6360 }
6361 return PyLong_FromSize_t(result);
6362}
6363
6364PyDoc_STRVAR(CMSG_SPACE_doc,
6365"CMSG_SPACE(length) -> buffer size\n\
6366\n\
6367Return the buffer size needed for recvmsg() to receive an ancillary\n\
6368data item with associated data of the given length, along with any\n\
6369trailing padding. The buffer space needed to receive multiple items\n\
6370is the sum of the CMSG_SPACE() values for their associated data\n\
6371lengths. Raises OverflowError if length is outside the permissible\n\
6372range of values.");
6373#endif /* CMSG_SPACE */
6374#endif /* CMSG_LEN */
6375
6376
Guido van Rossum30a685f1991-06-27 15:51:29 +00006377/* List of functions exported by this module. */
6378
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006379static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006380 {"gethostbyname", socket_gethostbyname,
6381 METH_VARARGS, gethostbyname_doc},
6382 {"gethostbyname_ex", socket_gethostbyname_ex,
6383 METH_VARARGS, ghbn_ex_doc},
6384 {"gethostbyaddr", socket_gethostbyaddr,
6385 METH_VARARGS, gethostbyaddr_doc},
6386 {"gethostname", socket_gethostname,
6387 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006388#ifdef HAVE_SETHOSTNAME
6389 {"sethostname", socket_sethostname,
6390 METH_VARARGS, sethostname_doc},
6391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 {"getservbyname", socket_getservbyname,
6393 METH_VARARGS, getservbyname_doc},
6394 {"getservbyport", socket_getservbyport,
6395 METH_VARARGS, getservbyport_doc},
6396 {"getprotobyname", socket_getprotobyname,
6397 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006398#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399 {"dup", socket_dup,
6400 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006401#endif
Dave Cole331708b2004-08-09 04:51:41 +00006402#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403 {"socketpair", socket_socketpair,
6404 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406 {"ntohs", socket_ntohs,
6407 METH_VARARGS, ntohs_doc},
6408 {"ntohl", socket_ntohl,
6409 METH_O, ntohl_doc},
6410 {"htons", socket_htons,
6411 METH_VARARGS, htons_doc},
6412 {"htonl", socket_htonl,
6413 METH_O, htonl_doc},
6414 {"inet_aton", socket_inet_aton,
6415 METH_VARARGS, inet_aton_doc},
6416 {"inet_ntoa", socket_inet_ntoa,
6417 METH_VARARGS, inet_ntoa_doc},
Segev Finer9f3bdcb2017-06-28 23:51:00 +03006418#ifdef HAVE_INET_PTON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419 {"inet_pton", socket_inet_pton,
6420 METH_VARARGS, inet_pton_doc},
6421 {"inet_ntop", socket_inet_ntop,
6422 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006423#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006424 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6425 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 {"getnameinfo", socket_getnameinfo,
6427 METH_VARARGS, getnameinfo_doc},
6428 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6429 METH_NOARGS, getdefaulttimeout_doc},
6430 {"setdefaulttimeout", socket_setdefaulttimeout,
6431 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006432#ifdef HAVE_IF_NAMEINDEX
6433 {"if_nameindex", socket_if_nameindex,
6434 METH_NOARGS, if_nameindex_doc},
6435 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006436 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006437 {"if_indextoname", socket_if_indextoname,
6438 METH_O, if_indextoname_doc},
6439#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006440#ifdef CMSG_LEN
6441 {"CMSG_LEN", socket_CMSG_LEN,
6442 METH_VARARGS, CMSG_LEN_doc},
6443#ifdef CMSG_SPACE
6444 {"CMSG_SPACE", socket_CMSG_SPACE,
6445 METH_VARARGS, CMSG_SPACE_doc},
6446#endif
6447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006449};
6450
Guido van Rossum30a685f1991-06-27 15:51:29 +00006451
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006452#ifdef MS_WINDOWS
6453#define OS_INIT_DEFINED
6454
6455/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006456
6457static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006458os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006459{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006461}
6462
6463static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006464os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 WSADATA WSAData;
6467 int ret;
6468 ret = WSAStartup(0x0101, &WSAData);
6469 switch (ret) {
6470 case 0: /* No error */
6471 Py_AtExit(os_cleanup);
6472 return 1; /* Success */
6473 case WSASYSNOTREADY:
6474 PyErr_SetString(PyExc_ImportError,
6475 "WSAStartup failed: network not ready");
6476 break;
6477 case WSAVERNOTSUPPORTED:
6478 case WSAEINVAL:
6479 PyErr_SetString(
6480 PyExc_ImportError,
6481 "WSAStartup failed: requested version not supported");
6482 break;
6483 default:
6484 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6485 break;
6486 }
6487 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006488}
6489
Guido van Rossum8d665e61996-06-26 18:22:49 +00006490#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006491
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006492
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006493
6494#ifndef OS_INIT_DEFINED
6495static int
6496os_init(void)
6497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006499}
6500#endif
6501
6502
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006503/* C API table - always add new things to the end for binary
6504 compatibility. */
6505static
6506PySocketModule_APIObject PySocketModuleAPI =
6507{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006509 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006511};
6512
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006513
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006514/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006515
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006516 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006517 "socket.py" which implements some additional functionality.
6518 The import of "_socket" may fail with an ImportError exception if
6519 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006520 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006521 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006522*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006524PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006525"Implementation module for socket operations.\n\
6526\n\
6527See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006528
Martin v. Löwis1a214512008-06-11 05:26:20 +00006529static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006530 PyModuleDef_HEAD_INIT,
6531 PySocket_MODULE_NAME,
6532 socket_doc,
6533 -1,
6534 socket_methods,
6535 NULL,
6536 NULL,
6537 NULL,
6538 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006539};
6540
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006541PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006542PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 if (!os_init())
6547 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006548
Victor Stinnerdaf45552013-08-28 00:53:59 +02006549#ifdef MS_WINDOWS
6550 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006551#if defined(_MSC_VER) && _MSC_VER >= 1800
6552 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6553#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006554 DWORD version = GetVersion();
6555 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6556 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6557 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006558 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6559#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006560 }
6561#endif
6562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 Py_TYPE(&sock_type) = &PyType_Type;
6564 m = PyModule_Create(&socketmodule);
6565 if (m == NULL)
6566 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006567
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006568 Py_INCREF(PyExc_OSError);
6569 PySocketModuleAPI.error = PyExc_OSError;
6570 Py_INCREF(PyExc_OSError);
6571 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006573 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574 if (socket_herror == NULL)
6575 return NULL;
6576 Py_INCREF(socket_herror);
6577 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006578 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579 NULL);
6580 if (socket_gaierror == NULL)
6581 return NULL;
6582 Py_INCREF(socket_gaierror);
6583 PyModule_AddObject(m, "gaierror", socket_gaierror);
6584 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006585 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 if (socket_timeout == NULL)
6587 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006588 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 Py_INCREF(socket_timeout);
6590 PyModule_AddObject(m, "timeout", socket_timeout);
6591 Py_INCREF((PyObject *)&sock_type);
6592 if (PyModule_AddObject(m, "SocketType",
6593 (PyObject *)&sock_type) != 0)
6594 return NULL;
6595 Py_INCREF((PyObject *)&sock_type);
6596 if (PyModule_AddObject(m, "socket",
6597 (PyObject *)&sock_type) != 0)
6598 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006599
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006600#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006602#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 Py_INCREF(has_ipv6);
6606 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608 /* Export C API */
6609 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6610 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6611 ) != 0)
6612 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006615#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006616 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006617#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006619#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006621#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006622#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006625#endif
6626#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006628#endif
6629#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006632#endif
6633#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006636#endif
6637#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006640#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006641#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006642 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006644#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006645#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006647 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006648#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006649#ifdef HAVE_SOCKADDR_ALG
6650 PyModule_AddIntMacro(m, AF_ALG); /* Linux crypto */
6651#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006652#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006655#endif
6656#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006658#endif
6659#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006662#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006663#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006666#endif
6667#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006670#endif
6671#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006674#endif
6675#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006678#endif
6679#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, AF_NETLINK);
6682 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006683#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006685#endif
6686#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006688#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6690 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006691#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006693#endif
6694#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006696#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006697#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006699#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006700#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006702#endif
6703#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006705#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006707#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006709#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006710#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006712#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02006713#ifdef NETLINK_CRYPTO
6714 PyModule_AddIntMacro(m, NETLINK_CRYPTO);
6715#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006716#endif /* AF_NETLINK */
caaveryeffc12f2017-09-06 18:18:10 -04006717
6718#ifdef AF_VSOCK
6719 PyModule_AddIntConstant(m, "AF_VSOCK", AF_VSOCK);
6720 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_SIZE", 0);
6721 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MIN_SIZE", 1);
6722 PyModule_AddIntConstant(m, "SO_VM_SOCKETS_BUFFER_MAX_SIZE", 2);
6723 PyModule_AddIntConstant(m, "VMADDR_CID_ANY", 0xffffffff);
6724 PyModule_AddIntConstant(m, "VMADDR_PORT_ANY", 0xffffffff);
6725 PyModule_AddIntConstant(m, "VMADDR_CID_HOST", 2);
6726 PyModule_AddIntConstant(m, "VM_SOCKETS_INVALID_VERSION", 0xffffffff);
6727 PyModule_AddIntConstant(m, "IOCTL_VM_SOCKETS_GET_LOCAL_CID", _IO(7, 0xb9));
6728#endif
6729
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006730#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006731 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006733#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006734#ifdef AF_LINK
6735 PyModule_AddIntMacro(m, AF_LINK);
6736#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006737#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006740#endif
6741#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006744#endif
6745#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006746 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006748#endif
6749#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006752#endif
6753#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006756#endif
6757#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006760#endif
6761#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006764#endif
6765#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006768#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006769
Hye-Shik Chang81268602004-02-02 06:05:24 +00006770#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6772 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6773 PyModule_AddIntMacro(m, BTPROTO_HCI);
6774 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006775#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006777#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006778#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006779#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006781#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6783 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006784#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6787 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006788#endif
6789
Charles-François Natali47413c12011-10-06 19:47:44 +02006790#ifdef AF_CAN
6791 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006793#endif
6794#ifdef PF_CAN
6795 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006797#endif
6798
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006799/* Reliable Datagram Sockets */
6800#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006802#endif
6803#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006805#endif
6806
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006807/* Kernel event messages */
6808#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006810#endif
6811#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006813#endif
6814
Antoine Pitroub156a462010-10-27 20:13:57 +00006815#ifdef AF_PACKET
6816 PyModule_AddIntMacro(m, AF_PACKET);
6817#endif
6818#ifdef PF_PACKET
6819 PyModule_AddIntMacro(m, PF_PACKET);
6820#endif
6821#ifdef PACKET_HOST
6822 PyModule_AddIntMacro(m, PACKET_HOST);
6823#endif
6824#ifdef PACKET_BROADCAST
6825 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6826#endif
6827#ifdef PACKET_MULTICAST
6828 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6829#endif
6830#ifdef PACKET_OTHERHOST
6831 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6832#endif
6833#ifdef PACKET_OUTGOING
6834 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6835#endif
6836#ifdef PACKET_LOOPBACK
6837 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6838#endif
6839#ifdef PACKET_FASTROUTE
6840 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006841#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006842
Christian Heimes043d6f62008-01-07 17:19:16 +00006843#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006846 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6848 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6849 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006850
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6852 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6853 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006856 PyModule_AddIntMacro(m, SOL_TIPC);
6857 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6858 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6859 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6860 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006861
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6863 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6864 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6865 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6869 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006870#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006873#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6875 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6876 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6877 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6878 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6879 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006880#endif
6881
Christian Heimesdffa3942016-09-05 23:54:41 +02006882#ifdef HAVE_SOCKADDR_ALG
6883 /* Socket options */
6884 PyModule_AddIntMacro(m, ALG_SET_KEY);
6885 PyModule_AddIntMacro(m, ALG_SET_IV);
6886 PyModule_AddIntMacro(m, ALG_SET_OP);
6887 PyModule_AddIntMacro(m, ALG_SET_AEAD_ASSOCLEN);
6888 PyModule_AddIntMacro(m, ALG_SET_AEAD_AUTHSIZE);
6889 PyModule_AddIntMacro(m, ALG_SET_PUBKEY);
6890
6891 /* Operations */
6892 PyModule_AddIntMacro(m, ALG_OP_DECRYPT);
6893 PyModule_AddIntMacro(m, ALG_OP_ENCRYPT);
6894 PyModule_AddIntMacro(m, ALG_OP_SIGN);
6895 PyModule_AddIntMacro(m, ALG_OP_VERIFY);
6896#endif
6897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006898 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, SOCK_STREAM);
6900 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006901/* We have incomplete socket support. */
Berker Peksag95e0df82016-08-08 14:07:05 +03006902#ifdef SOCK_RAW
6903 /* SOCK_RAW is marked as optional in the POSIX specification */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, SOCK_RAW);
Berker Peksag95e0df82016-08-08 14:07:05 +03006905#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006907#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006909#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006910#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006912#endif
6913#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006915#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006925#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006926#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006928#endif
6929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006947#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006948#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006951#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006979#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006980#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006982#endif
6983#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006985#endif
6986#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006988#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04006989#ifdef SO_PASSSEC
6990 PyModule_AddIntMacro(m, SO_PASSSEC);
6991#endif
6992#ifdef SO_PEERSEC
6993 PyModule_AddIntMacro(m, SO_PEERSEC);
6994#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006995#ifdef SO_BINDTODEVICE
6996 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6997#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006998#ifdef SO_PRIORITY
6999 PyModule_AddIntMacro(m, SO_PRIORITY);
7000#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01007001#ifdef SO_MARK
7002 PyModule_AddIntMacro(m, SO_MARK);
7003#endif
R David Murraybdfa0eb2016-08-23 21:12:40 -04007004#ifdef SO_DOMAIN
7005 PyModule_AddIntMacro(m, SO_DOMAIN);
7006#endif
7007#ifdef SO_PROTOCOL
7008 PyModule_AddIntMacro(m, SO_PROTOCOL);
7009#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011 /* Maximum number of connections for "listen" */
7012#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007014#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007015 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007016#endif
7017
Raymond Hettinger15f44ab2016-08-30 10:47:49 -07007018 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007019#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007020 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007021#endif
7022#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007024#endif
7025#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007027#endif
7028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029 /* Flags for send, recv */
7030#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007032#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007033#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007038#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00007041#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007042#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007044#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007045#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007047#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007057#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007059#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007060#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007062#endif
7063#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007065#endif
7066#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007068#endif
7069#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007071#endif
7072#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007074#endif
7075#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007077#endif
7078#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007080#endif
7081#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007082 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007083#endif
7084#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007085 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007086#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007087#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007088 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007089#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007091 /* Protocol level and numbers, usable for [gs]etsockopt */
7092#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007097#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00007099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00007102#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007103#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007104 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00007105#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00007108#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007109#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00007111#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007115#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007118 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00007119#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007122#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00007124#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007125#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02007127#endif
7128#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, SOL_CAN_RAW);
7130 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02007131#endif
7132#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
7134 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
7135 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02007136
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, CAN_SFF_MASK);
7138 PyModule_AddIntMacro(m, CAN_EFF_MASK);
7139 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04007140#ifdef CAN_ISOTP
7141 PyModule_AddIntMacro(m, CAN_ISOTP);
7142#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02007143#endif
7144#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
7146 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
7147 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
7148 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02007149#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04007150#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
7151 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
7152#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01007153#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01007155 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
7156 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
7157 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
7158 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
7159 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
7160 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
7161 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
7162 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
7163 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
7164 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
7165 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
7166 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
7167#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007168#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007169 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007170#endif
Christian Heimesdffa3942016-09-05 23:54:41 +02007171#ifdef HAVE_SOCKADDR_ALG
7172 PyModule_AddIntMacro(m, SOL_ALG);
7173#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007174#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007175 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007176#endif
7177#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007178 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007179#endif
7180#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007181 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007182#endif
7183#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007185#endif
7186#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007188#endif
7189#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007192#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00007194#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00007202#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007203 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007205#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007206 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007209 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007211#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007212 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00007216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007218 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007220#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007221 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00007222#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007223 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007225#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007226 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007228#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007229 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007232 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00007233#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007234 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007236#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007239#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007242#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007244#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007245#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007251#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007253#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007254#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007259#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007260#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007261 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007262#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007263#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007264 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007267 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007268#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007269#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007273 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007276 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007278#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007279 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007284#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007285 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007287#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007288 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007290#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007291 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007292#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007293#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007294 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10007295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007297 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007298#endif
7299/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007300#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007301 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00007302#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007303 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007304#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007305#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007306 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007307#endif
7308
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007309#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007310 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01007311#endif
7312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007313 /* Some port configuration */
7314#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007315 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007316#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007317 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007319#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007320 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007321#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007322 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007323#endif
7324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007325 /* Some reserved IP v.4 addresses */
7326#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007327 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007328#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007329 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007331#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007332 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007333#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007334 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007336#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007337 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007338#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007339 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007341#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007342 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007343#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007344 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007346#ifdef INADDR_ALLHOSTS_GROUP
7347 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
7348 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007350 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007352#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007353 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007354#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007355 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007357#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007358 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007359#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007360 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00007361#endif
7362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007363 /* IPv4 [gs]etsockopt options */
7364#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007365 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007367#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007368 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007370#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007371 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007373#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007374 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007376#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007377 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007379#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007380 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007382#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007383 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007385#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007386 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007388#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007389 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007391#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007392 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007394#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007395 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007396#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007397#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007398 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007400#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007401 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00007402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007403#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007404 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00007405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007406#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007407 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00007408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007409#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007410 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00007411#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01007412#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007413 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01007414#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007416 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
7417#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007418 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007420#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007421 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007423#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007424 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007426#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007427 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007429#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007430 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007432#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007433 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007435 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007436#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007437 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007439 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007440#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007441 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007442#endif
7443#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007444 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007445#endif
7446#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007447 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007448#endif
7449#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007450 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007451#endif
7452#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007453 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007454#endif
7455#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007456 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007457#endif
7458#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007459 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007460#endif
7461#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007462 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007463#endif
7464#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007465 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007466#endif
7467#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007468 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007469#endif
7470#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007471 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007472#endif
7473#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007474 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007475#endif
7476#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007477 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007478#endif
7479#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007480 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007481#endif
7482#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007483 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007484#endif
7485#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007486 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007487#endif
7488#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007489 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007490#endif
7491#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007492 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007493#endif
7494#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007495 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007496#endif
7497#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007498 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007499#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007501 /* TCP options */
7502#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007503 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007505#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007506 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007508#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007509 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007511#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007512 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007514#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007515 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007517#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007518 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007520#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007521 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007523#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007524 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007526#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007527 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007529#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007530 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007532#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007533 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007535#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007536 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007537#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007538#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007539 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007540#endif
Victor Stinner4f8dc3d2016-11-29 16:55:04 +01007541#ifdef TCP_CONGESTION
7542 PyModule_AddIntMacro(m, TCP_CONGESTION);
7543#endif
7544#ifdef TCP_USER_TIMEOUT
7545 PyModule_AddIntMacro(m, TCP_USER_TIMEOUT);
7546#endif
Nathaniel J. Smith1e2147b2017-03-22 20:56:55 -07007547#ifdef TCP_NOTSENT_LOWAT
7548 PyModule_AddIntMacro(m, TCP_NOTSENT_LOWAT);
7549#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007551 /* IPX options */
7552#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007553 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007554#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007555
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007556/* Reliable Datagram Sockets */
7557#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007558 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007559#endif
7560#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007561 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007562#endif
7563#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007564 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007565#endif
7566#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007567 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007568#endif
7569#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007570 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007571#endif
7572#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007573 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007574#endif
7575#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007576 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007577#endif
7578#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007579 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007580#endif
7581#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007582 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007583#endif
7584#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007585 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007586#endif
7587#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007588 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007589#endif
7590#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007591 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007592#endif
7593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007594 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007595#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007596 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007597#endif
7598#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007599 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007600#endif
7601#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007602 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007603#endif
7604#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007605 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007606#endif
7607#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007608 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007609#endif
7610#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007611 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007612#endif
7613#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007614 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007615#endif
7616#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007617 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007618#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007619#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007620 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007621#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007622#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007623 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007624#endif
7625#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007626 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007627#endif
7628#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007629 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007630#endif
7631#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007632 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007633#endif
7634#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007635 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007636#endif
7637#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007638 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007639#endif
7640#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007641 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007642#endif
7643#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007644 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007645#endif
7646#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007647 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007648#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007649#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007650 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007651#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007652#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007653 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007654#endif
7655#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007656 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007657#endif
7658#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007659 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007660#endif
7661#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007662 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007663#endif
7664#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007665 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007666#endif
7667#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007668 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007669#endif
7670#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007671 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007672#endif
7673#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007674 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007675#endif
7676#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007677 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007678#endif
7679#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007680 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007681#endif
7682#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007683 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007684#endif
7685#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007686 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007687#endif
7688#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007689 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007690#endif
7691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007692 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007693#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007694 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007695#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007696 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007697#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007698 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007699#endif
7700#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007701 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007702#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007703 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007704#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007705 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007706#endif
7707#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007708 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007709#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007710 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007712 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007713#endif
7714
Christian Heimesfaf2f632008-01-06 16:59:19 +00007715#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007716 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007717 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7718#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007719 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007720#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007721 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007722 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7723#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007724 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007725#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007726 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007727 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007728 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007729 PyObject *tmp;
7730 tmp = PyLong_FromUnsignedLong(codes[i]);
7731 if (tmp == NULL)
7732 return NULL;
7733 PyModule_AddObject(m, names[i], tmp);
7734 }
7735 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007736 PyModule_AddIntMacro(m, RCVALL_OFF);
7737 PyModule_AddIntMacro(m, RCVALL_ON);
7738 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007739#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007740 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007741#endif
7742#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007743 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007744#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007745#endif /* _MSTCPIP_ */
7746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007747 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007748#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007749 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007751 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007752}