blob: d21d18f7e3dec74394edde189f276ebed6faaebd [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\
139setsockopt(level, optname, value) -- set socket options\n\
140settimeout(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
156#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000157# undef HAVE_GETHOSTBYNAME_R_3_ARG
158# undef HAVE_GETHOSTBYNAME_R_5_ARG
159# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000160#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000161
Victor Stinner710d27e2011-08-23 10:57:32 +0200162#if defined(__OpenBSD__)
163# include <sys/uio.h>
164#endif
165
Stefan Krah1f9eb872016-05-22 17:35:34 +0200166#if !defined(WITH_THREAD)
167# undef HAVE_GETHOSTBYNAME_R
168#endif
169
170#if defined(__ANDROID__) && __ANDROID_API__ < 23
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000171# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000172#endif
173
Guido van Rossume7de2061999-03-24 17:24:33 +0000174#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100175# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000176# define HAVE_GETHOSTBYNAME_R_3_ARG
177# elif defined(__sun) || defined(__sgi)
178# define HAVE_GETHOSTBYNAME_R_5_ARG
179# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000180/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000181# else
182# undef HAVE_GETHOSTBYNAME_R
183# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000184#endif
185
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000186#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
187 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000188# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000189#endif
190
Ned Deilye1d4e582016-02-23 22:05:29 +1100191/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000192#ifdef HAVE_SYS_PARAM_H
193#include <sys/param.h>
194#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000195/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100196 (this includes the getaddrinfo emulation) protect access with a lock.
197
198 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
199 a mix of code including an unsafe implementation from an old BSD's
200 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
201 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100202 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100203
Ned Deilye1d4e582016-02-23 22:05:29 +1100204 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
205 http://www.openbsd.org/plus54.html
206
207 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
208
209http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/net/getaddrinfo.c.diff?r1=1.82&r2=1.83
Ned Deily47299fd2016-02-15 16:54:08 +1100210 */
211#if defined(WITH_THREAD) && ( \
212 (defined(__APPLE__) && \
213 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000214 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100215 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
216 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100217 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000218#define USE_GETADDRINFO_LOCK
219#endif
220
221#ifdef USE_GETADDRINFO_LOCK
222#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
223#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
224#else
225#define ACQUIRE_GETADDRINFO_LOCK
226#define RELEASE_GETADDRINFO_LOCK
227#endif
228
229#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000231#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000232
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000233#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000234# include <types.h>
235# include <io.h>
236# include <sys/ioctl.h>
237# include <utils.h>
238# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000239#endif
240
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100241#ifdef __APPLE__
242# include <sys/ioctl.h>
243#endif
244
245
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000247/* make sure that the reentrant (gethostbyaddr_r etc)
248 functions are declared correctly if compiling with
249 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250
Thomas Wouters477c8d52006-05-27 19:21:47 +0000251/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000252 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000253#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000254#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000255
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000256#undef _XOPEN_SOURCE
257#include <sys/socket.h>
258#include <sys/types.h>
259#include <netinet/in.h>
260#ifdef _SS_ALIGNSIZE
261#define HAVE_GETADDRINFO 1
262#define HAVE_GETNAMEINFO 1
263#endif
264
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000265#define HAVE_INET_PTON
266#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000267#endif
268
Thomas Wouters477c8d52006-05-27 19:21:47 +0000269/* Irix 6.5 fails to define this variable at all. This is needed
270 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000271 are just busted. Same thing for Solaris. */
272#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000273#define INET_ADDRSTRLEN 16
274#endif
275
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000278#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000279#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700281#ifdef HAVE_SYS_SOCKET_H
282#include <sys/socket.h>
283#endif
284
285#ifdef HAVE_NET_IF_H
286#include <net/if.h>
287#endif
288
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000289/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000291#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
293/* Addressing includes */
294
Guido van Rossum6f489d91996-06-28 20:15:15 +0000295#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000296
297/* Non-MS WINDOWS includes */
298# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000299# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000300
Guido van Rossum9376b741999-09-15 22:01:40 +0000301/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000303
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000305
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000306#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000307
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000308/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309# ifdef HAVE_FCNTL_H
310# include <fcntl.h>
311# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000312
Steve Dower65e4cb12014-11-22 12:54:57 -0800313#if defined(_MSC_VER) && _MSC_VER >= 1800
314/* Provides the IsWindows7SP1OrGreater() function */
315#include <VersionHelpers.h>
316#endif
317
Jeremy Hylton22308652001-02-02 03:23:09 +0000318#endif
319
Skip Montanaro7befb992004-02-10 16:50:21 +0000320#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000321
Neal Norwitz39d22e52002-11-02 19:55:21 +0000322#ifndef O_NONBLOCK
323# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000324#endif
325
Trent Micka708d6e2004-09-07 17:48:26 +0000326/* include Python's addrinfo.h unless it causes trouble */
327#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
328 /* Do not include addinfo.h on some newer IRIX versions.
329 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
330 * for example, but not by 6.5.10.
331 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000332#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000333 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
334 * EAI_* constants are defined in (the already included) ws2tcpip.h.
335 */
336#else
337# include "addrinfo.h"
338#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000339
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000340#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000341#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000342int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000343const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000344#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000345#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000346
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#ifdef __APPLE__
348/* On OS X, getaddrinfo returns no error indication of lookup
349 failure, so we must use the emulation instead of the libinfo
350 implementation. Unfortunately, performing an autoconf test
351 for this bug would require DNS access for the machine performing
352 the configuration, which is not acceptable. Therefore, we
353 determine the bug just by checking for __APPLE__. If this bug
354 gets ever fixed, perhaps checking for sys/version.h would be
355 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000356#ifndef HAVE_GETNAMEINFO
357/* This bug seems to be fixed in Jaguar. Ths easiest way I could
358 Find to check for Jaguar is that it has getnameinfo(), which
359 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000360#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000361#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000362
363#ifdef HAVE_INET_ATON
364#define USE_INET_ATON_WEAKLINK
365#endif
366
Jack Jansen84262fb2002-07-02 14:40:42 +0000367#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000368
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000369/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000370#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000371/* avoid clashes with the C library definition of the symbol. */
372#define getaddrinfo fake_getaddrinfo
373#define gai_strerror fake_gai_strerror
374#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000375#include "getaddrinfo.c"
376#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000377#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000378#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000379#include "getnameinfo.c"
380#endif
381
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000382#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000383#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000384#endif
385
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000386#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000387#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000388#define EAFNOSUPPORT WSAEAFNOSUPPORT
389#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000390#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000391
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000392#ifndef SOCKETCLOSE
393#define SOCKETCLOSE close
394#endif
395
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000396#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000397#define USE_BLUETOOTH 1
398#if defined(__FreeBSD__)
399#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
400#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000401#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000402#define SOL_HCI SOL_HCI_RAW
403#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000404#define sockaddr_l2 sockaddr_l2cap
405#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000406#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000407#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
408#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000409#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000410#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000411#define sockaddr_l2 sockaddr_bt
412#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000413#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000414#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000415#define SOL_HCI BTPROTO_HCI
416#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000417#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
418#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000419#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000420#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000421#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000422#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
423#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000424#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000425#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
426#endif
427#endif
428
Charles-François Natali8b759652011-12-23 16:44:51 +0100429/* Convert "sock_addr_t *" to "struct sockaddr *". */
430#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000431
Martin v. Löwise9416172003-05-03 10:12:45 +0000432/*
433 * Constants for getnameinfo()
434 */
435#if !defined(NI_MAXHOST)
436#define NI_MAXHOST 1025
437#endif
438#if !defined(NI_MAXSERV)
439#define NI_MAXSERV 32
440#endif
441
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000442#ifndef INVALID_SOCKET /* MS defines this */
443#define INVALID_SOCKET (-1)
444#endif
445
Charles-François Natali0cc86852013-09-13 19:53:08 +0200446#ifndef INADDR_NONE
447#define INADDR_NONE (-1)
448#endif
449
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000450/* XXX There's a problem here: *static* functions are not supposed to have
451 a Py prefix (or use CapitalizedWords). Later... */
452
Guido van Rossum30a685f1991-06-27 15:51:29 +0000453/* Global variable holding the exception type for errors detected
454 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000455static PyObject *socket_herror;
456static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000457static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000458
Tim Peters643a7fc2002-02-17 04:13:21 +0000459/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000460 The sock_type variable contains pointers to various functions,
461 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000462 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000463static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000464
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465#if defined(HAVE_POLL_H)
466#include <poll.h>
467#elif defined(HAVE_SYS_POLL_H)
468#include <sys/poll.h>
469#endif
470
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000471/* Largest value to try to store in a socklen_t (used when handling
472 ancillary data). POSIX requires socklen_t to hold at least
473 (2**31)-1 and recommends against storing larger values, but
474 socklen_t was originally int in the BSD interface, so to be on the
475 safe side we use the smaller of (2**31)-1 and INT_MAX. */
476#if INT_MAX > 0x7fffffff
477#define SOCKLEN_T_LIMIT 0x7fffffff
478#else
479#define SOCKLEN_T_LIMIT INT_MAX
480#endif
481
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200482#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000483/* Instead of select(), we'll use poll() since poll() works on any fd. */
484#define IS_SELECTABLE(s) 1
485/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000486#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200487/* If there's no timeout left, we don't have to call select, so it's a safe,
488 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100489#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000490#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000491
492static PyObject*
493select_error(void)
494{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200495 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000497}
498
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000499#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000500#ifndef WSAEAGAIN
501#define WSAEAGAIN WSAEWOULDBLOCK
502#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000503#define CHECK_ERRNO(expected) \
504 (WSAGetLastError() == WSA ## expected)
505#else
506#define CHECK_ERRNO(expected) \
507 (errno == expected)
508#endif
509
Victor Stinnerdaf45552013-08-28 00:53:59 +0200510#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200511# define GET_SOCK_ERROR WSAGetLastError()
512# define SET_SOCK_ERROR(err) WSASetLastError(err)
513# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
514# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
515#else
516# define GET_SOCK_ERROR errno
517# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
518# define SOCK_TIMEOUT_ERR EWOULDBLOCK
519# define SOCK_INPROGRESS_ERR EINPROGRESS
520#endif
521
522
523#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200524/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
525static int support_wsa_no_inherit = -1;
526#endif
527
Guido van Rossum30a685f1991-06-27 15:51:29 +0000528/* Convenience function to raise an error according to errno
529 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000530
Guido van Rossum73624e91994-10-10 17:59:00 +0000531static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000532set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000533{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000534#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 int err_no = WSAGetLastError();
536 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
537 recognizes the error codes used by both GetLastError() and
538 WSAGetLastError */
539 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200540 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000541#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000542
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200543 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000544}
545
Guido van Rossum30a685f1991-06-27 15:51:29 +0000546
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000548set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000551
552#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000554#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 if (v != NULL) {
558 PyErr_SetObject(socket_herror, v);
559 Py_DECREF(v);
560 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000563}
564
565
566static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000567set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000570
Martin v. Löwis272cb402002-03-01 08:31:07 +0000571#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 /* EAI_SYSTEM is not available on Windows XP. */
573 if (error == EAI_SYSTEM)
574 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000575#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000576
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000577#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000579#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000582 if (v != NULL) {
583 PyErr_SetObject(socket_gaierror, v);
584 Py_DECREF(v);
585 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000588}
589
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000590/* Function to perform the setting of socket blocking mode
591 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592static int
593internal_setblocking(PySocketSockObject *s, int block)
594{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200595#ifdef MS_WINDOWS
596 u_long arg;
597#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100598#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100599 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100600 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000601#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000602#ifdef SOCK_NONBLOCK
603 if (block)
604 s->sock_type &= (~SOCK_NONBLOCK);
605 else
606 s->sock_type |= SOCK_NONBLOCK;
607#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100611#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 block = !block;
613 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100614#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
616 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100617 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 else
Victor Stinner9a954832013-12-04 00:41:24 +0100619 new_delay_flag = delay_flag | O_NONBLOCK;
620 if (new_delay_flag != delay_flag)
621 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
622#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000623#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200624 arg = !block;
625 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* Since these don't return anything */
630 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000631}
632
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000633static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200634internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
635 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100638#ifdef HAVE_POLL
639 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200640 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100641#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200642 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200643 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100644#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000645
Victor Stinnerb7df3142015-03-27 22:59:32 +0100646#ifdef WITH_THREAD
647 /* must be called with the GIL held */
648 assert(PyGILState_Check());
649#endif
650
Victor Stinner416f2e62015-03-31 13:56:29 +0200651 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200652 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200655 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 /* Prefer poll, if available, since you can poll() any fd
659 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100661 pollfd.fd = s->sock_fd;
662 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200663 if (connect) {
664 /* On Windows, the socket becomes writable on connection success,
665 but a connection failure is notified as an error. On POSIX, the
666 socket becomes writable on connection success or on connection
667 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200668 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200669 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000670
Victor Stinner71694d52015-03-28 01:18:54 +0100671 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200672 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200673 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000674
Victor Stinner71694d52015-03-28 01:18:54 +0100675 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200676 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100677 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000678#else
Victor Stinnerced11742015-04-09 10:27:25 +0200679 if (interval >= 0) {
680 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
681 tvp = &tv;
682 }
683 else
684 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000685
Victor Stinner71694d52015-03-28 01:18:54 +0100686 FD_ZERO(&fds);
687 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200688 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200689 if (connect) {
690 /* On Windows, the socket becomes writable on connection success,
691 but a connection failure is notified as an error. On POSIX, the
692 socket becomes writable on connection success or on connection
693 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200694 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200695 }
Victor Stinner71694d52015-03-28 01:18:54 +0100696
697 /* See if the socket is ready */
698 Py_BEGIN_ALLOW_THREADS;
699 if (writing)
700 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200701 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100702 else
703 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200704 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100705 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000706#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 if (n < 0)
709 return -1;
710 if (n == 0)
711 return 1;
712 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000713}
714
Victor Stinner31bf2d52015-04-01 21:57:09 +0200715/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000716
Victor Stinner81c41db2015-04-02 11:50:57 +0200717 On error, raise an exception and return -1 if err is set, or fill err and
718 return -1 otherwise. If a signal was received and the signal handler raised
719 an exception, return -1, and set err to -1 if err is set.
720
721 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100722
Victor Stinner31bf2d52015-04-01 21:57:09 +0200723 If the socket has a timeout, wait until the socket is ready before calling
724 the function: wait until the socket is writable if writing is nonzero, wait
725 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100726
Victor Stinner81c41db2015-04-02 11:50:57 +0200727 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200728 the function, except if the signal handler raised an exception (PEP 475).
729
730 When the function is retried, recompute the timeout using a monotonic clock.
731
Victor Stinner81c41db2015-04-02 11:50:57 +0200732 sock_call_ex() must be called with the GIL held. The socket function is
733 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200734static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200735sock_call_ex(PySocketSockObject *s,
736 int writing,
737 int (*sock_func) (PySocketSockObject *s, void *data),
738 void *data,
739 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200740 int *err,
741 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200742{
Victor Stinner8912d142015-04-06 23:16:34 +0200743 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200744 _PyTime_t deadline = 0;
745 int deadline_initialized = 0;
746 int res;
747
Victor Stinner92f01132015-10-11 09:54:42 +0200748#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200749 /* sock_call() must be called with the GIL held. */
750 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200751#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200752
753 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200755 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200756 /* For connect(), poll even for blocking socket. The connection
757 runs asynchronously. */
758 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200759 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200760 _PyTime_t interval;
761
Victor Stinner81c41db2015-04-02 11:50:57 +0200762 if (deadline_initialized) {
763 /* recompute the timeout */
764 interval = deadline - _PyTime_GetMonotonicClock();
765 }
766 else {
767 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200768 deadline = _PyTime_GetMonotonicClock() + timeout;
769 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200770 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200771
Victor Stinner10550cd2015-04-03 13:22:27 +0200772 if (interval >= 0)
773 res = internal_select(s, writing, interval, connect);
774 else
775 res = 1;
776 }
777 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200778 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200779 }
780
Victor Stinner31bf2d52015-04-01 21:57:09 +0200781 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200782 if (err)
783 *err = GET_SOCK_ERROR;
784
Victor Stinner31bf2d52015-04-01 21:57:09 +0200785 if (CHECK_ERRNO(EINTR)) {
786 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200787 if (PyErr_CheckSignals()) {
788 if (err)
789 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200790 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200791 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200792
793 /* retry select() */
794 continue;
795 }
796
797 /* select() failed */
798 s->errorhandler();
799 return -1;
800 }
801
802 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200803 if (err)
804 *err = SOCK_TIMEOUT_ERR;
805 else
806 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807 return -1;
808 }
809
810 /* the socket is ready */
811 }
812
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 /* inner loop to retry sock_func() when sock_func() is interrupted
814 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200815 while (1) {
816 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818 Py_END_ALLOW_THREADS
819
820 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 /* sock_func() succeeded */
822 if (err)
823 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200824 return 0;
825 }
826
Victor Stinner81c41db2015-04-02 11:50:57 +0200827 if (err)
828 *err = GET_SOCK_ERROR;
829
Victor Stinner31bf2d52015-04-01 21:57:09 +0200830 if (!CHECK_ERRNO(EINTR))
831 break;
832
Victor Stinner81c41db2015-04-02 11:50:57 +0200833 /* sock_func() was interrupted by a signal */
834 if (PyErr_CheckSignals()) {
835 if (err)
836 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200839
Victor Stinner81c41db2015-04-02 11:50:57 +0200840 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200841 }
842
843 if (s->sock_timeout > 0
844 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200845 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200846
847 For example, select() could indicate a socket is ready for
848 reading, but the data then discarded by the OS because of a
849 wrong checksum.
850
851 Loop on select() to recheck for socket readyness. */
852 continue;
853 }
854
Victor Stinner81c41db2015-04-02 11:50:57 +0200855 /* sock_func() failed */
856 if (!err)
857 s->errorhandler();
858 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000859 return -1;
860 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200861}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000862
Victor Stinner81c41db2015-04-02 11:50:57 +0200863static int
864sock_call(PySocketSockObject *s,
865 int writing,
866 int (*func) (PySocketSockObject *s, void *data),
867 void *data)
868{
Victor Stinner8912d142015-04-06 23:16:34 +0200869 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200870}
871
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000872
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000873/* Initialize a new socket object. */
874
Victor Stinner88ed6402015-04-09 10:23:12 +0200875/* Default timeout for new sockets */
876static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000877
Martin v. Löwis1a214512008-06-11 05:26:20 +0000878static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000879init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 s->sock_fd = fd;
883 s->sock_family = family;
884 s->sock_type = type;
885 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000888#ifdef SOCK_NONBLOCK
889 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100890 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000891 else
892#endif
893 {
894 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100895 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000896 internal_setblocking(s, 0);
897 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000898
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000899}
900
901
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902/* Create a new socket object.
903 This just creates the object and initializes it.
904 If the creation fails, return NULL and set an exception (implicit
905 in NEWOBJ()). */
906
Guido van Rossum73624e91994-10-10 17:59:00 +0000907static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000908new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 PySocketSockObject *s;
911 s = (PySocketSockObject *)
912 PyType_GenericNew(&sock_type, NULL, NULL);
913 if (s != NULL)
914 init_sockobject(s, fd, family, type, proto);
915 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916}
917
Guido van Rossum30a685f1991-06-27 15:51:29 +0000918
Guido van Rossum48a680c2001-03-02 06:34:14 +0000919/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000920 thread to be in gethostbyname or getaddrinfo */
921#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200922static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000923#endif
924
925
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926/* Convert a string specifying a host name or one of a few symbolic
927 names to a numeric IP address. This usually calls gethostbyname()
928 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000929 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930 an error occurred; then an exception is raised. */
931
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200933setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 struct addrinfo hints, *res;
936 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
939 if (name[0] == '\0') {
940 int siz;
941 memset(&hints, 0, sizeof(hints));
942 hints.ai_family = af;
943 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
944 hints.ai_flags = AI_PASSIVE;
945 Py_BEGIN_ALLOW_THREADS
946 ACQUIRE_GETADDRINFO_LOCK
947 error = getaddrinfo(NULL, "0", &hints, &res);
948 Py_END_ALLOW_THREADS
949 /* We assume that those thread-unsafe getaddrinfo() versions
950 *are* safe regarding their return value, ie. that a
951 subsequent call to getaddrinfo() does not destroy the
952 outcome of the first call. */
953 RELEASE_GETADDRINFO_LOCK
954 if (error) {
955 set_gaierror(error);
956 return -1;
957 }
958 switch (res->ai_family) {
959 case AF_INET:
960 siz = 4;
961 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000962#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 case AF_INET6:
964 siz = 16;
965 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 default:
968 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200969 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 "unsupported address family");
971 return -1;
972 }
973 if (res->ai_next) {
974 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200975 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 "wildcard resolved to multiple address");
977 return -1;
978 }
979 if (res->ai_addrlen < addr_ret_size)
980 addr_ret_size = res->ai_addrlen;
981 memcpy(addr_ret, res->ai_addr, addr_ret_size);
982 freeaddrinfo(res);
983 return siz;
984 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200985 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100986 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200987 if (strcmp(name, "255.255.255.255") == 0 ||
988 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 struct sockaddr_in *sin;
990 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200991 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 "address family mismatched");
993 return -1;
994 }
995 sin = (struct sockaddr_in *)addr_ret;
996 memset((void *) sin, '\0', sizeof(*sin));
997 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000998#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 sin->sin_addr.s_addr = INADDR_BROADCAST;
1002 return sizeof(sin->sin_addr);
1003 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001004
1005 /* avoid a name resolution in case of numeric address */
1006#ifdef HAVE_INET_PTON
1007 /* check for an IPv4 address */
1008 if (af == AF_UNSPEC || af == AF_INET) {
1009 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1010 memset(sin, 0, sizeof(*sin));
1011 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1012 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001013#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001015#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001016 return 4;
1017 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001019#ifdef ENABLE_IPV6
1020 /* check for an IPv6 address - if the address contains a scope ID, we
1021 * fallback to getaddrinfo(), which can handle translation from interface
1022 * name to interface index */
1023 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1024 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1025 memset(sin, 0, sizeof(*sin));
1026 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1027 sin->sin6_family = AF_INET6;
1028#ifdef HAVE_SOCKADDR_SA_LEN
1029 sin->sin6_len = sizeof(*sin);
1030#endif
1031 return 16;
1032 }
1033 }
1034#endif /* ENABLE_IPV6 */
1035#else /* HAVE_INET_PTON */
1036 /* check for an IPv4 address */
1037 if (af == AF_INET || af == AF_UNSPEC) {
1038 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1039 memset(sin, 0, sizeof(*sin));
1040 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1041 sin->sin_family = AF_INET;
1042#ifdef HAVE_SOCKADDR_SA_LEN
1043 sin->sin_len = sizeof(*sin);
1044#endif
1045 return 4;
1046 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001047 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001048#endif /* HAVE_INET_PTON */
1049
1050 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 memset(&hints, 0, sizeof(hints));
1052 hints.ai_family = af;
1053 Py_BEGIN_ALLOW_THREADS
1054 ACQUIRE_GETADDRINFO_LOCK
1055 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001056#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 if (error == EAI_NONAME && af == AF_UNSPEC) {
1058 /* On Tru64 V5.1, numeric-to-addr conversion fails
1059 if no address family is given. Assume IPv4 for now.*/
1060 hints.ai_family = AF_INET;
1061 error = getaddrinfo(name, NULL, &hints, &res);
1062 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 Py_END_ALLOW_THREADS
1065 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1066 if (error) {
1067 set_gaierror(error);
1068 return -1;
1069 }
1070 if (res->ai_addrlen < addr_ret_size)
1071 addr_ret_size = res->ai_addrlen;
1072 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1073 freeaddrinfo(res);
1074 switch (addr_ret->sa_family) {
1075 case AF_INET:
1076 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001077#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 case AF_INET6:
1079 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001082 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001083 return -1;
1084 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001085}
1086
Guido van Rossum30a685f1991-06-27 15:51:29 +00001087
Guido van Rossum30a685f1991-06-27 15:51:29 +00001088/* Create a string object representing an IP address.
1089 This is always a string of the form 'dd.dd.dd.dd' (with variable
1090 size numbers). */
1091
Guido van Rossum73624e91994-10-10 17:59:00 +00001092static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001093makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 char buf[NI_MAXHOST];
1096 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1099 NI_NUMERICHOST);
1100 if (error) {
1101 set_gaierror(error);
1102 return NULL;
1103 }
1104 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001105}
1106
1107
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001108#ifdef USE_BLUETOOTH
1109/* Convert a string representation of a Bluetooth address into a numeric
1110 address. Returns the length (6), or raises an exception and returns -1 if
1111 an error occurred. */
1112
1113static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001114setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001115{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 unsigned int b0, b1, b2, b3, b4, b5;
1117 char ch;
1118 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1121 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1122 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1123 bdaddr->b[0] = b0;
1124 bdaddr->b[1] = b1;
1125 bdaddr->b[2] = b2;
1126 bdaddr->b[3] = b3;
1127 bdaddr->b[4] = b4;
1128 bdaddr->b[5] = b5;
1129 return 6;
1130 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001131 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 return -1;
1133 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001134}
1135
1136/* Create a string representation of the Bluetooth address. This is always a
1137 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1138 value (zero padded if necessary). */
1139
1140static PyObject *
1141makebdaddr(bdaddr_t *bdaddr)
1142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1146 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1147 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1148 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001149}
1150#endif
1151
1152
Guido van Rossum30a685f1991-06-27 15:51:29 +00001153/* Create an object representing the given socket address,
1154 suitable for passing it back to bind(), connect() etc.
1155 The family field of the sockaddr structure is inspected
1156 to determine what kind of address it really is. */
1157
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001158/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001159static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001160makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001161{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (addrlen == 0) {
1163 /* No address -- may be recvfrom() from known socket */
1164 Py_INCREF(Py_None);
1165 return Py_None;
1166 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 case AF_INET:
1171 {
1172 struct sockaddr_in *a;
1173 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1174 PyObject *ret = NULL;
1175 if (addrobj) {
1176 a = (struct sockaddr_in *)addr;
1177 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1178 Py_DECREF(addrobj);
1179 }
1180 return ret;
1181 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001182
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001183#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 case AF_UNIX:
1185 {
1186 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001187#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001188 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1189 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001190 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001191 }
1192 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001193#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 {
1195 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001196 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 }
1198 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001199#endif /* AF_UNIX */
1200
Martin v. Löwis11017b12006-01-14 18:12:57 +00001201#if defined(AF_NETLINK)
1202 case AF_NETLINK:
1203 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1205 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001206 }
1207#endif /* AF_NETLINK */
1208
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001209#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 case AF_INET6:
1211 {
1212 struct sockaddr_in6 *a;
1213 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1214 PyObject *ret = NULL;
1215 if (addrobj) {
1216 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001217 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 addrobj,
1219 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001220 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 a->sin6_scope_id);
1222 Py_DECREF(addrobj);
1223 }
1224 return ret;
1225 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001226#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001227
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001228#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 case AF_BLUETOOTH:
1230 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 case BTPROTO_L2CAP:
1233 {
1234 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1235 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1236 PyObject *ret = NULL;
1237 if (addrobj) {
1238 ret = Py_BuildValue("Oi",
1239 addrobj,
1240 _BT_L2_MEMB(a, psm));
1241 Py_DECREF(addrobj);
1242 }
1243 return ret;
1244 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 case BTPROTO_RFCOMM:
1247 {
1248 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1249 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1250 PyObject *ret = NULL;
1251 if (addrobj) {
1252 ret = Py_BuildValue("Oi",
1253 addrobj,
1254 _BT_RC_MEMB(a, channel));
1255 Py_DECREF(addrobj);
1256 }
1257 return ret;
1258 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 case BTPROTO_HCI:
1261 {
1262 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001263#if defined(__NetBSD__) || defined(__DragonFly__)
1264 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1265#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 PyObject *ret = NULL;
1267 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1268 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001271
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001272#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001273 case BTPROTO_SCO:
1274 {
1275 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1276 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1277 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001278#endif
1279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 default:
1281 PyErr_SetString(PyExc_ValueError,
1282 "Unknown Bluetooth protocol");
1283 return NULL;
1284 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001285#endif
1286
Antoine Pitroub156a462010-10-27 20:13:57 +00001287#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 case AF_PACKET:
1289 {
1290 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1291 char *ifname = "";
1292 struct ifreq ifr;
1293 /* need to look up interface name give index */
1294 if (a->sll_ifindex) {
1295 ifr.ifr_ifindex = a->sll_ifindex;
1296 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1297 ifname = ifr.ifr_name;
1298 }
1299 return Py_BuildValue("shbhy#",
1300 ifname,
1301 ntohs(a->sll_protocol),
1302 a->sll_pkttype,
1303 a->sll_hatype,
1304 a->sll_addr,
1305 a->sll_halen);
1306 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001307#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001308
Christian Heimes043d6f62008-01-07 17:19:16 +00001309#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 case AF_TIPC:
1311 {
1312 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1313 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1314 return Py_BuildValue("IIIII",
1315 a->addrtype,
1316 a->addr.nameseq.type,
1317 a->addr.nameseq.lower,
1318 a->addr.nameseq.upper,
1319 a->scope);
1320 } else if (a->addrtype == TIPC_ADDR_NAME) {
1321 return Py_BuildValue("IIIII",
1322 a->addrtype,
1323 a->addr.name.name.type,
1324 a->addr.name.name.instance,
1325 a->addr.name.name.instance,
1326 a->scope);
1327 } else if (a->addrtype == TIPC_ADDR_ID) {
1328 return Py_BuildValue("IIIII",
1329 a->addrtype,
1330 a->addr.id.node,
1331 a->addr.id.ref,
1332 0,
1333 a->scope);
1334 } else {
1335 PyErr_SetString(PyExc_ValueError,
1336 "Invalid address type");
1337 return NULL;
1338 }
1339 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001340#endif
1341
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001342#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001343 case AF_CAN:
1344 {
1345 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1346 char *ifname = "";
1347 struct ifreq ifr;
1348 /* need to look up interface name given index */
1349 if (a->can_ifindex) {
1350 ifr.ifr_ifindex = a->can_ifindex;
1351 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1352 ifname = ifr.ifr_name;
1353 }
1354
1355 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1356 ifname,
1357 a->can_family);
1358 }
1359#endif
1360
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001361#ifdef PF_SYSTEM
1362 case PF_SYSTEM:
1363 switch(proto) {
1364#ifdef SYSPROTO_CONTROL
1365 case SYSPROTO_CONTROL:
1366 {
1367 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1368 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1369 }
1370#endif
1371 default:
1372 PyErr_SetString(PyExc_ValueError,
1373 "Invalid address type");
1374 return 0;
1375 }
1376#endif
1377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 default:
1381 /* If we don't know the address family, don't raise an
1382 exception -- return it as an (int, bytes) tuple. */
1383 return Py_BuildValue("iy#",
1384 addr->sa_family,
1385 addr->sa_data,
1386 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001388 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001389}
1390
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001391/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1392 (in particular, numeric IP addresses). */
1393struct maybe_idna {
1394 PyObject *obj;
1395 char *buf;
1396};
1397
1398static void
1399idna_cleanup(struct maybe_idna *data)
1400{
1401 Py_CLEAR(data->obj);
1402}
1403
1404static int
1405idna_converter(PyObject *obj, struct maybe_idna *data)
1406{
1407 size_t len;
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001408 PyObject *obj2;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001409 if (obj == NULL) {
1410 idna_cleanup(data);
1411 return 1;
1412 }
1413 data->obj = NULL;
1414 len = -1;
1415 if (PyBytes_Check(obj)) {
1416 data->buf = PyBytes_AsString(obj);
1417 len = PyBytes_Size(obj);
1418 }
1419 else if (PyByteArray_Check(obj)) {
1420 data->buf = PyByteArray_AsString(obj);
1421 len = PyByteArray_Size(obj);
1422 }
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001423 else if (PyUnicode_Check(obj)) {
1424 if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1425 data->buf = PyUnicode_DATA(obj);
1426 len = PyUnicode_GET_LENGTH(obj);
1427 }
1428 else {
1429 obj2 = PyUnicode_AsEncodedString(obj, "idna", NULL);
1430 if (!obj2) {
1431 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1432 return 0;
1433 }
1434 assert(PyBytes_Check(obj2));
1435 data->obj = obj2;
1436 data->buf = PyBytes_AS_STRING(obj2);
1437 len = PyBytes_GET_SIZE(obj2);
1438 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001439 }
1440 else {
Serhiy Storchaka21a663e2016-04-13 15:37:23 +03001441 PyErr_Format(PyExc_TypeError, "str, bytes or bytearray expected, not %s",
1442 obj->ob_type->tp_name);
1443 return 0;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001444 }
1445 if (strlen(data->buf) != len) {
1446 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001447 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001448 return 0;
1449 }
1450 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001451}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001452
1453/* Parse a socket address argument according to the socket object's
1454 address family. Return 1 if the address was in the proper format,
1455 0 of not. The address is returned through addr_ret, its length
1456 through len_ret. */
1457
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001458static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001459getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001463
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001464#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 case AF_UNIX:
1466 {
1467 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001468 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001469 int retval = 0;
1470
1471 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1472 allow embedded nulls on Linux. */
1473 if (PyUnicode_Check(args)) {
1474 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1475 return 0;
1476 }
1477 else
1478 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001479 if (!PyArg_Parse(args, "y*", &path)) {
1480 Py_DECREF(args);
1481 return retval;
1482 }
1483 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001487 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001489 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001490 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001492 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 }
1494 }
1495 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001496#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 {
1498 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001499 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001500 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001502 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001504 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 }
1506 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001507 memcpy(addr->sun_path, path.buf, path.len);
1508 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001509 retval = 1;
1510 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001511 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001512 Py_DECREF(args);
1513 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001515#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001516
Martin v. Löwis11017b12006-01-14 18:12:57 +00001517#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 case AF_NETLINK:
1519 {
1520 struct sockaddr_nl* addr;
1521 int pid, groups;
1522 addr = (struct sockaddr_nl *)addr_ret;
1523 if (!PyTuple_Check(args)) {
1524 PyErr_Format(
1525 PyExc_TypeError,
1526 "getsockaddrarg: "
1527 "AF_NETLINK address must be tuple, not %.500s",
1528 Py_TYPE(args)->tp_name);
1529 return 0;
1530 }
1531 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1532 return 0;
1533 addr->nl_family = AF_NETLINK;
1534 addr->nl_pid = pid;
1535 addr->nl_groups = groups;
1536 *len_ret = sizeof(*addr);
1537 return 1;
1538 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001539#endif
1540
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001541#ifdef AF_RDS
1542 case AF_RDS:
1543 /* RDS sockets use sockaddr_in: fall-through */
1544#endif
1545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 case AF_INET:
1547 {
1548 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001549 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 int port, result;
1551 if (!PyTuple_Check(args)) {
1552 PyErr_Format(
1553 PyExc_TypeError,
1554 "getsockaddrarg: "
1555 "AF_INET address must be tuple, not %.500s",
1556 Py_TYPE(args)->tp_name);
1557 return 0;
1558 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001559 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1560 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 return 0;
1562 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001563 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001565 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (result < 0)
1567 return 0;
1568 if (port < 0 || port > 0xffff) {
1569 PyErr_SetString(
1570 PyExc_OverflowError,
1571 "getsockaddrarg: port must be 0-65535.");
1572 return 0;
1573 }
1574 addr->sin_family = AF_INET;
1575 addr->sin_port = htons((short)port);
1576 *len_ret = sizeof *addr;
1577 return 1;
1578 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001580#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 case AF_INET6:
1582 {
1583 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001584 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001585 int port, result;
1586 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 flowinfo = scope_id = 0;
1588 if (!PyTuple_Check(args)) {
1589 PyErr_Format(
1590 PyExc_TypeError,
1591 "getsockaddrarg: "
1592 "AF_INET6 address must be tuple, not %.500s",
1593 Py_TYPE(args)->tp_name);
1594 return 0;
1595 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001596 if (!PyArg_ParseTuple(args, "O&i|II",
1597 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 &scope_id)) {
1599 return 0;
1600 }
1601 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001602 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001604 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (result < 0)
1606 return 0;
1607 if (port < 0 || port > 0xffff) {
1608 PyErr_SetString(
1609 PyExc_OverflowError,
1610 "getsockaddrarg: port must be 0-65535.");
1611 return 0;
1612 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001613 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001614 PyErr_SetString(
1615 PyExc_OverflowError,
1616 "getsockaddrarg: flowinfo must be 0-1048575.");
1617 return 0;
1618 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 addr->sin6_family = s->sock_family;
1620 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001621 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 addr->sin6_scope_id = scope_id;
1623 *len_ret = sizeof *addr;
1624 return 1;
1625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001626#endif
1627
Hye-Shik Chang81268602004-02-02 06:05:24 +00001628#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 case AF_BLUETOOTH:
1630 {
1631 switch (s->sock_proto) {
1632 case BTPROTO_L2CAP:
1633 {
1634 struct sockaddr_l2 *addr;
1635 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 addr = (struct sockaddr_l2 *)addr_ret;
1638 memset(addr, 0, sizeof(struct sockaddr_l2));
1639 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1640 if (!PyArg_ParseTuple(args, "si", &straddr,
1641 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001642 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 "wrong format");
1644 return 0;
1645 }
1646 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1647 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 *len_ret = sizeof *addr;
1650 return 1;
1651 }
1652 case BTPROTO_RFCOMM:
1653 {
1654 struct sockaddr_rc *addr;
1655 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 addr = (struct sockaddr_rc *)addr_ret;
1658 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1659 if (!PyArg_ParseTuple(args, "si", &straddr,
1660 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001661 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 "wrong format");
1663 return 0;
1664 }
1665 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1666 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 *len_ret = sizeof *addr;
1669 return 1;
1670 }
1671 case BTPROTO_HCI:
1672 {
1673 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001674#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001675 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001676
Alexander Belopolskye239d232010-12-08 23:31:48 +00001677 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001678 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001679 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001680 "wrong format");
1681 return 0;
1682 }
1683 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1684 return 0;
1685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1687 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001688 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 "wrong format");
1690 return 0;
1691 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 *len_ret = sizeof *addr;
1694 return 1;
1695 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001696#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 case BTPROTO_SCO:
1698 {
1699 struct sockaddr_sco *addr;
1700 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 addr = (struct sockaddr_sco *)addr_ret;
1703 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1704 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001705 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 "wrong format");
1707 return 0;
1708 }
1709 straddr = PyBytes_AS_STRING(args);
1710 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1711 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 *len_ret = sizeof *addr;
1714 return 1;
1715 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001718 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 return 0;
1720 }
1721 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001722#endif
1723
Antoine Pitroub156a462010-10-27 20:13:57 +00001724#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 case AF_PACKET:
1726 {
1727 struct sockaddr_ll* addr;
1728 struct ifreq ifr;
1729 char *interfaceName;
1730 int protoNumber;
1731 int hatype = 0;
1732 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001733 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 if (!PyTuple_Check(args)) {
1736 PyErr_Format(
1737 PyExc_TypeError,
1738 "getsockaddrarg: "
1739 "AF_PACKET address must be tuple, not %.500s",
1740 Py_TYPE(args)->tp_name);
1741 return 0;
1742 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001743 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001745 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 return 0;
1747 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1748 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1749 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1750 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001751 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 return 0;
1753 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001754 if (haddr.buf && haddr.len > 8) {
1755 PyErr_SetString(PyExc_ValueError,
1756 "Hardware address must be 8 bytes or less");
1757 PyBuffer_Release(&haddr);
1758 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 }
1760 if (protoNumber < 0 || protoNumber > 0xffff) {
1761 PyErr_SetString(
1762 PyExc_OverflowError,
1763 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001764 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return 0;
1766 }
1767 addr = (struct sockaddr_ll*)addr_ret;
1768 addr->sll_family = AF_PACKET;
1769 addr->sll_protocol = htons((short)protoNumber);
1770 addr->sll_ifindex = ifr.ifr_ifindex;
1771 addr->sll_pkttype = pkttype;
1772 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001773 if (haddr.buf) {
1774 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1775 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001777 else
1778 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001780 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 return 1;
1782 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001783#endif
1784
Christian Heimes043d6f62008-01-07 17:19:16 +00001785#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 case AF_TIPC:
1787 {
1788 unsigned int atype, v1, v2, v3;
1789 unsigned int scope = TIPC_CLUSTER_SCOPE;
1790 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 if (!PyTuple_Check(args)) {
1793 PyErr_Format(
1794 PyExc_TypeError,
1795 "getsockaddrarg: "
1796 "AF_TIPC address must be tuple, not %.500s",
1797 Py_TYPE(args)->tp_name);
1798 return 0;
1799 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 if (!PyArg_ParseTuple(args,
1802 "IIII|I;Invalid TIPC address format",
1803 &atype, &v1, &v2, &v3, &scope))
1804 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 addr = (struct sockaddr_tipc *) addr_ret;
1807 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 addr->family = AF_TIPC;
1810 addr->scope = scope;
1811 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 if (atype == TIPC_ADDR_NAMESEQ) {
1814 addr->addr.nameseq.type = v1;
1815 addr->addr.nameseq.lower = v2;
1816 addr->addr.nameseq.upper = v3;
1817 } else if (atype == TIPC_ADDR_NAME) {
1818 addr->addr.name.name.type = v1;
1819 addr->addr.name.name.instance = v2;
1820 } else if (atype == TIPC_ADDR_ID) {
1821 addr->addr.id.node = v1;
1822 addr->addr.id.ref = v2;
1823 } else {
1824 /* Shouldn't happen */
1825 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1826 return 0;
1827 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 1;
1832 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001833#endif
1834
Vinay Sajiped6783f2014-03-21 11:44:32 +00001835#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001836 case AF_CAN:
1837 switch (s->sock_proto) {
1838 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001839 /* fall-through */
1840 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001841 {
1842 struct sockaddr_can *addr;
1843 PyObject *interfaceName;
1844 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001845 Py_ssize_t len;
1846
Benjamin Peterson18b71912013-05-16 15:29:44 -05001847 addr = (struct sockaddr_can *)addr_ret;
1848
Charles-François Natali47413c12011-10-06 19:47:44 +02001849 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1850 &interfaceName))
1851 return 0;
1852
1853 len = PyBytes_GET_SIZE(interfaceName);
1854
1855 if (len == 0) {
1856 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001857 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001858 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1859 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001860 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1861 s->errorhandler();
1862 Py_DECREF(interfaceName);
1863 return 0;
1864 }
1865 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001866 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001867 "AF_CAN interface name too long");
1868 Py_DECREF(interfaceName);
1869 return 0;
1870 }
1871
1872 addr->can_family = AF_CAN;
1873 addr->can_ifindex = ifr.ifr_ifindex;
1874
1875 *len_ret = sizeof(*addr);
1876 Py_DECREF(interfaceName);
1877 return 1;
1878 }
1879 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001880 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001881 "getsockaddrarg: unsupported CAN protocol");
1882 return 0;
1883 }
1884#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001885
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001886#ifdef PF_SYSTEM
1887 case PF_SYSTEM:
1888 switch (s->sock_proto) {
1889#ifdef SYSPROTO_CONTROL
1890 case SYSPROTO_CONTROL:
1891 {
1892 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001893
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001894 addr = (struct sockaddr_ctl *)addr_ret;
1895 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001896 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001897
1898 if (PyUnicode_Check(args)) {
1899 struct ctl_info info;
1900 PyObject *ctl_name;
1901
1902 if (!PyArg_Parse(args, "O&",
1903 PyUnicode_FSConverter, &ctl_name)) {
1904 return 0;
1905 }
1906
Victor Stinnerf50e1872015-03-20 11:32:24 +01001907 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001908 PyErr_SetString(PyExc_ValueError,
1909 "provided string is too long");
1910 Py_DECREF(ctl_name);
1911 return 0;
1912 }
1913 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1914 sizeof(info.ctl_name));
1915 Py_DECREF(ctl_name);
1916
1917 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1918 PyErr_SetString(PyExc_OSError,
1919 "cannot find kernel control with provided name");
1920 return 0;
1921 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001922
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001923 addr->sc_id = info.ctl_id;
1924 addr->sc_unit = 0;
1925 } else if (!PyArg_ParseTuple(args, "II",
1926 &(addr->sc_id), &(addr->sc_unit))) {
1927 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1928 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001929
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001930 return 0;
1931 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001932
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001933 *len_ret = sizeof(*addr);
1934 return 1;
1935 }
1936#endif
1937 default:
1938 PyErr_SetString(PyExc_OSError,
1939 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1940 return 0;
1941 }
1942#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001947 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001951}
1952
Guido van Rossum30a685f1991-06-27 15:51:29 +00001953
Guido van Rossum48a680c2001-03-02 06:34:14 +00001954/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001955 Return 1 if the family is known, 0 otherwise. The length is returned
1956 through len_ret. */
1957
1958static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001959getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001962
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001963#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 case AF_UNIX:
1965 {
1966 *len_ret = sizeof (struct sockaddr_un);
1967 return 1;
1968 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001969#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001970#if defined(AF_NETLINK)
1971 case AF_NETLINK:
1972 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 *len_ret = sizeof (struct sockaddr_nl);
1974 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001975 }
1976#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001977
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001978#ifdef AF_RDS
1979 case AF_RDS:
1980 /* RDS sockets use sockaddr_in: fall-through */
1981#endif
1982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 case AF_INET:
1984 {
1985 *len_ret = sizeof (struct sockaddr_in);
1986 return 1;
1987 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001988
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001989#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 case AF_INET6:
1991 {
1992 *len_ret = sizeof (struct sockaddr_in6);
1993 return 1;
1994 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001995#endif
1996
Hye-Shik Chang81268602004-02-02 06:05:24 +00001997#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 case AF_BLUETOOTH:
1999 {
2000 switch(s->sock_proto)
2001 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 case BTPROTO_L2CAP:
2004 *len_ret = sizeof (struct sockaddr_l2);
2005 return 1;
2006 case BTPROTO_RFCOMM:
2007 *len_ret = sizeof (struct sockaddr_rc);
2008 return 1;
2009 case BTPROTO_HCI:
2010 *len_ret = sizeof (struct sockaddr_hci);
2011 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002012#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 case BTPROTO_SCO:
2014 *len_ret = sizeof (struct sockaddr_sco);
2015 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002018 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 "unknown BT protocol");
2020 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 }
2023 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002024#endif
2025
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002026#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 case AF_PACKET:
2028 {
2029 *len_ret = sizeof (struct sockaddr_ll);
2030 return 1;
2031 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002032#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002033
Christian Heimes043d6f62008-01-07 17:19:16 +00002034#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 case AF_TIPC:
2036 {
2037 *len_ret = sizeof (struct sockaddr_tipc);
2038 return 1;
2039 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002040#endif
2041
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002042#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002043 case AF_CAN:
2044 {
2045 *len_ret = sizeof (struct sockaddr_can);
2046 return 1;
2047 }
2048#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002049
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002050#ifdef PF_SYSTEM
2051 case PF_SYSTEM:
2052 switch(s->sock_proto) {
2053#ifdef SYSPROTO_CONTROL
2054 case SYSPROTO_CONTROL:
2055 *len_ret = sizeof (struct sockaddr_ctl);
2056 return 1;
2057#endif
2058 default:
2059 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2060 "unknown PF_SYSTEM protocol");
2061 return 0;
2062 }
2063#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002068 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002072}
2073
2074
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002075/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2076 Currently, these methods are only compiled if the RFC 2292/3542
2077 CMSG_LEN() macro is available. Older systems seem to have used
2078 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2079 it may be possible to define CMSG_LEN() that way if it's not
2080 provided. Some architectures might need extra padding after the
2081 cmsghdr, however, and CMSG_LEN() would have to take account of
2082 this. */
2083#ifdef CMSG_LEN
2084/* If length is in range, set *result to CMSG_LEN(length) and return
2085 true; otherwise, return false. */
2086static int
2087get_CMSG_LEN(size_t length, size_t *result)
2088{
2089 size_t tmp;
2090
2091 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2092 return 0;
2093 tmp = CMSG_LEN(length);
2094 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2095 return 0;
2096 *result = tmp;
2097 return 1;
2098}
2099
2100#ifdef CMSG_SPACE
2101/* If length is in range, set *result to CMSG_SPACE(length) and return
2102 true; otherwise, return false. */
2103static int
2104get_CMSG_SPACE(size_t length, size_t *result)
2105{
2106 size_t tmp;
2107
2108 /* Use CMSG_SPACE(1) here in order to take account of the padding
2109 necessary before *and* after the data. */
2110 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2111 return 0;
2112 tmp = CMSG_SPACE(length);
2113 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2114 return 0;
2115 *result = tmp;
2116 return 1;
2117}
2118#endif
2119
2120/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2121 pointer in msg->msg_control with at least "space" bytes after it,
2122 and its cmsg_len member inside the buffer. */
2123static int
2124cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2125{
2126 size_t cmsg_offset;
2127 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2128 sizeof(cmsgh->cmsg_len));
2129
Charles-François Natali466517d2011-08-28 18:23:43 +02002130 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002131 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002132 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002133 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2134 annoying under OS X as it's unsigned there and so it triggers a
2135 tautological comparison warning under Clang when compared against 0.
2136 Since the check is valid on other platforms, silence the warning under
2137 Clang. */
2138 #ifdef __clang__
2139 #pragma clang diagnostic push
2140 #pragma clang diagnostic ignored "-Wtautological-compare"
2141 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002142 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002143 #pragma GCC diagnostic push
2144 #pragma GCC diagnostic ignored "-Wtype-limits"
2145 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002146 if (msg->msg_controllen < 0)
2147 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002148 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002149 #pragma GCC diagnostic pop
2150 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002151 #ifdef __clang__
2152 #pragma clang diagnostic pop
2153 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002154 if (space < cmsg_len_end)
2155 space = cmsg_len_end;
2156 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2157 return (cmsg_offset <= (size_t)-1 - space &&
2158 cmsg_offset + space <= msg->msg_controllen);
2159}
2160
2161/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2162 *space to number of bytes following it in the buffer and return
2163 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2164 msg->msg_controllen are valid. */
2165static int
2166get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2167{
2168 size_t data_offset;
2169 char *data_ptr;
2170
2171 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2172 return 0;
2173 data_offset = data_ptr - (char *)msg->msg_control;
2174 if (data_offset > msg->msg_controllen)
2175 return 0;
2176 *space = msg->msg_controllen - data_offset;
2177 return 1;
2178}
2179
2180/* If cmsgh is invalid or not contained in the buffer pointed to by
2181 msg->msg_control, return -1. If cmsgh is valid and its associated
2182 data is entirely contained in the buffer, set *data_len to the
2183 length of the associated data and return 0. If only part of the
2184 associated data is contained in the buffer but cmsgh is otherwise
2185 valid, set *data_len to the length contained in the buffer and
2186 return 1. */
2187static int
2188get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2189{
2190 size_t space, cmsg_data_len;
2191
2192 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2193 cmsgh->cmsg_len < CMSG_LEN(0))
2194 return -1;
2195 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2196 if (!get_cmsg_data_space(msg, cmsgh, &space))
2197 return -1;
2198 if (space >= cmsg_data_len) {
2199 *data_len = cmsg_data_len;
2200 return 0;
2201 }
2202 *data_len = space;
2203 return 1;
2204}
2205#endif /* CMSG_LEN */
2206
2207
Victor Stinner31bf2d52015-04-01 21:57:09 +02002208struct sock_accept {
2209 socklen_t *addrlen;
2210 sock_addr_t *addrbuf;
2211 SOCKET_T result;
2212};
2213
2214#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2215/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2216static int accept4_works = -1;
2217#endif
2218
2219static int
2220sock_accept_impl(PySocketSockObject *s, void *data)
2221{
2222 struct sock_accept *ctx = data;
2223
2224#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2225 if (accept4_works != 0) {
2226 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2227 SOCK_CLOEXEC);
2228 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2229 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2230 accept4_works = (errno != ENOSYS);
2231 }
2232 }
2233 if (accept4_works == 0)
2234 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2235#else
2236 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2237#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002238
2239#ifdef MS_WINDOWS
2240 return (ctx->result != INVALID_SOCKET);
2241#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002242 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002243#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002244}
2245
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002246/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002247
Guido van Rossum73624e91994-10-10 17:59:00 +00002248static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002249sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002252 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 socklen_t addrlen;
2254 PyObject *sock = NULL;
2255 PyObject *addr = NULL;
2256 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002257 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if (!getsockaddrlen(s, &addrlen))
2260 return NULL;
2261 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (!IS_SELECTABLE(s))
2264 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002265
Victor Stinner31bf2d52015-04-01 21:57:09 +02002266 ctx.addrlen = &addrlen;
2267 ctx.addrbuf = &addrbuf;
2268 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002270 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002271
Victor Stinnerdaf45552013-08-28 00:53:59 +02002272#ifdef MS_WINDOWS
2273 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2274 PyErr_SetFromWindowsErr(0);
2275 SOCKETCLOSE(newfd);
2276 goto finally;
2277 }
2278#else
2279
2280#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2281 if (!accept4_works)
2282#endif
2283 {
2284 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2285 SOCKETCLOSE(newfd);
2286 goto finally;
2287 }
2288 }
2289#endif
2290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 sock = PyLong_FromSocket_t(newfd);
2292 if (sock == NULL) {
2293 SOCKETCLOSE(newfd);
2294 goto finally;
2295 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2298 addrlen, s->sock_proto);
2299 if (addr == NULL)
2300 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002303
Guido van Rossum67f7a382002-06-06 21:08:16 +00002304finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 Py_XDECREF(sock);
2306 Py_XDECREF(addr);
2307 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002308}
2309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002310PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002311"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002312\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002313Wait for an incoming connection. Return a new socket file descriptor\n\
2314representing the connection, and the address of the client.\n\
2315For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002316
Guido van Rossum11ba0942002-06-13 15:07:44 +00002317/* s.setblocking(flag) method. Argument:
2318 False -- non-blocking mode; same as settimeout(0)
2319 True -- blocking mode; same as settimeout(None)
2320*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002321
Guido van Rossum73624e91994-10-10 17:59:00 +00002322static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002323sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002324{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002325 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 block = PyLong_AsLong(arg);
2328 if (block == -1 && PyErr_Occurred())
2329 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002330
Victor Stinner9001d802015-04-06 23:06:01 +02002331 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 Py_INCREF(Py_None);
2335 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002336}
Guido van Rossume4485b01994-09-07 14:32:49 +00002337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002338PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002339"setblocking(flag)\n\
2340\n\
2341Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002342setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344
Victor Stinner71694d52015-03-28 01:18:54 +01002345static int
2346socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2347{
2348#ifdef MS_WINDOWS
2349 struct timeval tv;
2350#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002351#ifndef HAVE_POLL
2352 _PyTime_t ms;
2353#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002354 int overflow = 0;
2355
2356 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002357 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002358 return 0;
2359 }
2360
Victor Stinner869e1772015-03-30 03:49:14 +02002361 if (_PyTime_FromSecondsObject(timeout,
2362 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002363 return -1;
2364
2365 if (*timeout < 0) {
2366 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2367 return -1;
2368 }
2369
2370#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002371 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002372#endif
2373#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002374 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2375 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002376#endif
2377 if (overflow) {
2378 PyErr_SetString(PyExc_OverflowError,
2379 "timeout doesn't fit into C timeval");
2380 return -1;
2381 }
2382
2383 return 0;
2384}
2385
Guido van Rossum11ba0942002-06-13 15:07:44 +00002386/* s.settimeout(timeout) method. Argument:
2387 None -- no timeout, blocking mode; same as setblocking(True)
2388 0.0 -- non-blocking mode; same as setblocking(False)
2389 > 0 -- timeout mode; operations time out after timeout seconds
2390 < 0 -- illegal; raises an exception
2391*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002393sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002394{
Victor Stinner71694d52015-03-28 01:18:54 +01002395 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002396
Victor Stinner71694d52015-03-28 01:18:54 +01002397 if (socket_parse_timeout(&timeout, arg) < 0)
2398 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002401 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 Py_INCREF(Py_None);
2404 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002405}
2406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002408"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002410Set a timeout on socket operations. 'timeout' can be a float,\n\
2411giving in seconds, or None. Setting a timeout of None disables\n\
2412the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002414
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002415/* s.gettimeout() method.
2416 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002419{
Victor Stinner71694d52015-03-28 01:18:54 +01002420 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_INCREF(Py_None);
2422 return Py_None;
2423 }
Victor Stinner71694d52015-03-28 01:18:54 +01002424 else {
2425 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2426 return PyFloat_FromDouble(seconds);
2427 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002428}
2429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002430PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002431"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002433Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002436
Guido van Rossumaee08791992-09-08 09:05:33 +00002437/* s.setsockopt() method.
2438 With an integer third argument, sets an integer option.
2439 With a string third argument, sets an option from a buffer;
2440 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002441
Guido van Rossum73624e91994-10-10 17:59:00 +00002442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002443sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 int level;
2446 int optname;
2447 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002448 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (PyArg_ParseTuple(args, "iii:setsockopt",
2452 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002453 res = setsockopt(s->sock_fd, level, optname,
2454 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 }
2456 else {
2457 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002458 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2459 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 return NULL;
Victor Stinnercc739322016-03-23 21:35:29 +01002461#ifdef MS_WINDOWS
2462 if (optval.len > INT_MAX) {
2463 PyBuffer_Release(&optval);
2464 PyErr_Format(PyExc_OverflowError,
2465 "socket option is larger than %i bytes",
2466 INT_MAX);
2467 return NULL;
2468 }
2469 res = setsockopt(s->sock_fd, level, optname,
2470 optval.buf, (int)optval.len);
2471#else
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002472 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
Victor Stinnercc739322016-03-23 21:35:29 +01002473#endif
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002474 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 }
Victor Stinnercc739322016-03-23 21:35:29 +01002476 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002478 }
2479
2480 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002481}
2482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484"setsockopt(level, option, value)\n\
2485\n\
2486Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002487The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002488
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002489
Guido van Rossumaee08791992-09-08 09:05:33 +00002490/* s.getsockopt() method.
2491 With two arguments, retrieves an integer option.
2492 With a third integer argument, retrieves a string buffer of that size;
2493 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002494
Guido van Rossum73624e91994-10-10 17:59:00 +00002495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002496sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 int level;
2499 int optname;
2500 int res;
2501 PyObject *buf;
2502 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2505 &level, &optname, &buflen))
2506 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 if (buflen == 0) {
2509 int flag = 0;
2510 socklen_t flagsize = sizeof flag;
2511 res = getsockopt(s->sock_fd, level, optname,
2512 (void *)&flag, &flagsize);
2513 if (res < 0)
2514 return s->errorhandler();
2515 return PyLong_FromLong(flag);
2516 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002518 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 "getsockopt buflen out of range");
2520 return NULL;
2521 }
2522 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2523 if (buf == NULL)
2524 return NULL;
2525 res = getsockopt(s->sock_fd, level, optname,
2526 (void *)PyBytes_AS_STRING(buf), &buflen);
2527 if (res < 0) {
2528 Py_DECREF(buf);
2529 return s->errorhandler();
2530 }
2531 _PyBytes_Resize(&buf, buflen);
2532 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002533}
2534
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002535PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002536"getsockopt(level, option[, buffersize]) -> value\n\
2537\n\
2538Get a socket option. See the Unix manual for level and option.\n\
2539If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002541
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002542
Fred Drake728819a2000-07-01 03:40:12 +00002543/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002544
Guido van Rossum73624e91994-10-10 17:59:00 +00002545static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 sock_addr_t addrbuf;
2549 int addrlen;
2550 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2553 return NULL;
2554 Py_BEGIN_ALLOW_THREADS
2555 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2556 Py_END_ALLOW_THREADS
2557 if (res < 0)
2558 return s->errorhandler();
2559 Py_INCREF(Py_None);
2560 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002561}
2562
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002563PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002564"bind(address)\n\
2565\n\
2566Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002567pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002568sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002569
Guido van Rossum30a685f1991-06-27 15:51:29 +00002570
2571/* s.close() method.
2572 Set the file descriptor to -1 so operations tried subsequently
2573 will surely fail. */
2574
Guido van Rossum73624e91994-10-10 17:59:00 +00002575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002576sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 SOCKET_T fd;
Martin Panter50ab1a32016-04-11 00:38:12 +00002579 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002580
Victor Stinner19a8e842016-03-21 16:36:48 +01002581 fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002582 if (fd != INVALID_SOCKET) {
2583 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01002584
2585 /* We do not want to retry upon EINTR: see
2586 http://lwn.net/Articles/576478/ and
2587 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2588 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 Py_BEGIN_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002590 res = SOCKETCLOSE(fd);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 Py_END_ALLOW_THREADS
Martin Panter50ab1a32016-04-11 00:38:12 +00002592 if (res < 0) {
2593 return s->errorhandler();
2594 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 }
2596 Py_INCREF(Py_None);
2597 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002598}
2599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002600PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002601"close()\n\
2602\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002603Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002604
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002605static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002606sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002607{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002608 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002609 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002610 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002611}
2612
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002613PyDoc_STRVAR(detach_doc,
2614"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002615\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002616Close the socket object without closing the underlying file descriptor.\n\
2617The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002618can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002619
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002620static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002621sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002622{
Victor Stinner81c41db2015-04-02 11:50:57 +02002623 int err;
2624 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002625
Victor Stinner81c41db2015-04-02 11:50:57 +02002626 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2627 /* getsockopt() failed */
2628 return 0;
2629 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002630
Victor Stinner81c41db2015-04-02 11:50:57 +02002631 if (err == EISCONN)
2632 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002633 if (err != 0) {
2634 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2635 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002636 return 0;
2637 }
2638 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002639}
2640
2641static int
2642internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2643 int raise)
2644{
2645 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002646
2647 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002649 Py_END_ALLOW_THREADS
2650
Victor Stinner70a46f62015-03-31 22:03:59 +02002651 if (!res) {
2652 /* connect() succeeded, the socket is connected */
2653 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002655
Victor Stinner81c41db2015-04-02 11:50:57 +02002656 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002657
Victor Stinner81c41db2015-04-02 11:50:57 +02002658 /* save error, PyErr_CheckSignals() can replace it */
2659 err = GET_SOCK_ERROR;
2660 if (CHECK_ERRNO(EINTR)) {
2661 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002662 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002663
2664 /* Issue #23618: when connect() fails with EINTR, the connection is
2665 running asynchronously.
2666
2667 If the socket is blocking or has a timeout, wait until the
2668 connection completes, fails or timed out using select(), and then
2669 get the connection status using getsockopt(SO_ERROR).
2670
2671 If the socket is non-blocking, raise InterruptedError. The caller is
2672 responsible to wait until the connection completes, fails or timed
2673 out (it's the case in asyncio for example). */
2674 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2675 }
2676 else {
2677 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2678 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002679 }
2680
Victor Stinner81c41db2015-04-02 11:50:57 +02002681 if (!wait_connect) {
2682 if (raise) {
2683 /* restore error, maybe replaced by PyErr_CheckSignals() */
2684 SET_SOCK_ERROR(err);
2685 s->errorhandler();
2686 return -1;
2687 }
2688 else
2689 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002690 }
2691
Victor Stinner81c41db2015-04-02 11:50:57 +02002692 if (raise) {
2693 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002694 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2695 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002696 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002697 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002698 else {
2699 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002700 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2701 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002702 return err;
2703 }
2704 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002705}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002706
Fred Drake728819a2000-07-01 03:40:12 +00002707/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002708
Guido van Rossum73624e91994-10-10 17:59:00 +00002709static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002710sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 sock_addr_t addrbuf;
2713 int addrlen;
2714 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2717 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718
Victor Stinner81c41db2015-04-02 11:50:57 +02002719 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002720 if (res < 0)
2721 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002722
Victor Stinneree699e92015-03-31 21:28:42 +02002723 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002724}
2725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002727"connect(address)\n\
2728\n\
2729Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002730is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002731
Guido van Rossum30a685f1991-06-27 15:51:29 +00002732
Fred Drake728819a2000-07-01 03:40:12 +00002733/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002734
2735static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002736sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002737{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 sock_addr_t addrbuf;
2739 int addrlen;
2740 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2743 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002744
Victor Stinner81c41db2015-04-02 11:50:57 +02002745 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002746 if (res < 0)
2747 return NULL;
2748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002750}
2751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002753"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002754\n\
2755This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002756instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002757
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002758
Guido van Rossumed233a51992-06-23 09:07:03 +00002759/* s.fileno() method */
2760
Guido van Rossum73624e91994-10-10 17:59:00 +00002761static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002762sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002765}
2766
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002767PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002768"fileno() -> integer\n\
2769\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002770Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002771
Guido van Rossumed233a51992-06-23 09:07:03 +00002772
Guido van Rossumc89705d1992-11-26 08:54:07 +00002773/* s.getsockname() method */
2774
Guido van Rossum73624e91994-10-10 17:59:00 +00002775static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002776sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002777{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 sock_addr_t addrbuf;
2779 int res;
2780 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002782 if (!getsockaddrlen(s, &addrlen))
2783 return NULL;
2784 memset(&addrbuf, 0, addrlen);
2785 Py_BEGIN_ALLOW_THREADS
2786 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2787 Py_END_ALLOW_THREADS
2788 if (res < 0)
2789 return s->errorhandler();
2790 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2791 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002792}
2793
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002794PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002795"getsockname() -> address info\n\
2796\n\
2797Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002799
Guido van Rossumc89705d1992-11-26 08:54:07 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002802/* s.getpeername() method */
2803
Guido van Rossum73624e91994-10-10 17:59:00 +00002804static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002805sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 sock_addr_t addrbuf;
2808 int res;
2809 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002811 if (!getsockaddrlen(s, &addrlen))
2812 return NULL;
2813 memset(&addrbuf, 0, addrlen);
2814 Py_BEGIN_ALLOW_THREADS
2815 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2816 Py_END_ALLOW_THREADS
2817 if (res < 0)
2818 return s->errorhandler();
2819 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2820 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002821}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002822
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002823PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002824"getpeername() -> address info\n\
2825\n\
2826Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002827info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002828
Guido van Rossumb6775db1994-08-01 11:34:53 +00002829#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002830
2831
Guido van Rossum30a685f1991-06-27 15:51:29 +00002832/* s.listen(n) method */
2833
Guido van Rossum73624e91994-10-10 17:59:00 +00002834static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002835sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002836{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002837 /* We try to choose a default backlog high enough to avoid connection drops
2838 * for common workloads, yet not too high to limit resource usage. */
2839 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002841
Charles-François Natali644b8f52014-05-22 19:45:39 +01002842 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002843 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002844
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002846 /* To avoid problems on systems that don't allow a negative backlog
2847 * (which doesn't make sense anyway) we force a minimum value of 0. */
2848 if (backlog < 0)
2849 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 res = listen(s->sock_fd, backlog);
2851 Py_END_ALLOW_THREADS
2852 if (res < 0)
2853 return s->errorhandler();
2854 Py_INCREF(Py_None);
2855 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002856}
2857
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002858PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002859"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002860\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002861Enable a server to accept connections. If backlog is specified, it must be\n\
2862at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002863unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002864connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002865
Victor Stinner31bf2d52015-04-01 21:57:09 +02002866struct sock_recv {
2867 char *cbuf;
2868 Py_ssize_t len;
2869 int flags;
2870 Py_ssize_t result;
2871};
2872
2873static int
2874sock_recv_impl(PySocketSockObject *s, void *data)
2875{
2876 struct sock_recv *ctx = data;
2877
2878#ifdef MS_WINDOWS
2879 if (ctx->len > INT_MAX)
2880 ctx->len = INT_MAX;
2881 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2882#else
2883 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2884#endif
2885 return (ctx->result >= 0);
2886}
2887
Guido van Rossum82a5c661998-07-07 20:45:43 +00002888
Thomas Wouters477c8d52006-05-27 19:21:47 +00002889/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002890 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002891 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002892 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002893 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002894 * also possible that we return a number of bytes smaller than the request
2895 * bytes.
2896 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002897
Antoine Pitrou19467d22010-08-17 19:33:30 +00002898static Py_ssize_t
2899sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002900{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002901 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 if (!IS_SELECTABLE(s)) {
2904 select_error();
2905 return -1;
2906 }
2907 if (len == 0) {
2908 /* If 0 bytes were requested, do nothing. */
2909 return 0;
2910 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002911
Victor Stinner31bf2d52015-04-01 21:57:09 +02002912 ctx.cbuf = cbuf;
2913 ctx.len = len;
2914 ctx.flags = flags;
2915 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002916 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002917
2918 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919}
2920
Guido van Rossum48a680c2001-03-02 06:34:14 +00002921
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002922/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002923
Guido van Rossum73624e91994-10-10 17:59:00 +00002924static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002925sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002926{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002927 Py_ssize_t recvlen, outlen;
2928 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002930
Antoine Pitrou19467d22010-08-17 19:33:30 +00002931 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 if (recvlen < 0) {
2935 PyErr_SetString(PyExc_ValueError,
2936 "negative buffersize in recv");
2937 return NULL;
2938 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 /* Allocate a new string. */
2941 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2942 if (buf == NULL)
2943 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 /* Call the guts */
2946 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2947 if (outlen < 0) {
2948 /* An error occurred, release the string and return an
2949 error. */
2950 Py_DECREF(buf);
2951 return NULL;
2952 }
2953 if (outlen != recvlen) {
2954 /* We did not read as many bytes as we anticipated, resize the
2955 string if possible and be successful. */
2956 _PyBytes_Resize(&buf, outlen);
2957 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002960}
2961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002962PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002963"recv(buffersize[, flags]) -> data\n\
2964\n\
2965Receive up to buffersize bytes from the socket. For the optional flags\n\
2966argument, see the Unix manual. When no data is available, block until\n\
2967at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002969
Guido van Rossum30a685f1991-06-27 15:51:29 +00002970
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002971/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002972
Thomas Wouters477c8d52006-05-27 19:21:47 +00002973static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002974sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002977
Antoine Pitrou19467d22010-08-17 19:33:30 +00002978 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 Py_buffer pbuf;
2980 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002981 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002984 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 &pbuf, &recvlen, &flags))
2986 return NULL;
2987 buf = pbuf.buf;
2988 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002990 if (recvlen < 0) {
2991 PyBuffer_Release(&pbuf);
2992 PyErr_SetString(PyExc_ValueError,
2993 "negative buffersize in recv_into");
2994 return NULL;
2995 }
2996 if (recvlen == 0) {
2997 /* If nbytes was not specified, use the buffer's length */
2998 recvlen = buflen;
2999 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003001 /* Check if the buffer is large enough */
3002 if (buflen < recvlen) {
3003 PyBuffer_Release(&pbuf);
3004 PyErr_SetString(PyExc_ValueError,
3005 "buffer too small for requested bytes");
3006 return NULL;
3007 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 /* Call the guts */
3010 readlen = sock_recv_guts(s, buf, recvlen, flags);
3011 if (readlen < 0) {
3012 /* Return an error. */
3013 PyBuffer_Release(&pbuf);
3014 return NULL;
3015 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 PyBuffer_Release(&pbuf);
3018 /* Return the number of bytes read. Note that we do not do anything
3019 special here in the case that readlen < recvlen. */
3020 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003021}
3022
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003023PyDoc_STRVAR(recv_into_doc,
3024"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003025\n\
3026A version of recv() that stores its data into a buffer rather than creating \n\
3027a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3028is not specified (or 0), receive up to the size available in the given buffer.\n\
3029\n\
3030See recv() for documentation about the flags.");
3031
Victor Stinner31bf2d52015-04-01 21:57:09 +02003032struct sock_recvfrom {
3033 char* cbuf;
3034 Py_ssize_t len;
3035 int flags;
3036 socklen_t *addrlen;
3037 sock_addr_t *addrbuf;
3038 Py_ssize_t result;
3039};
3040
3041static int
3042sock_recvfrom_impl(PySocketSockObject *s, void *data)
3043{
3044 struct sock_recvfrom *ctx = data;
3045
3046 memset(ctx->addrbuf, 0, *ctx->addrlen);
3047
3048#ifdef MS_WINDOWS
3049 if (ctx->len > INT_MAX)
3050 ctx->len = INT_MAX;
3051 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3052 SAS2SA(ctx->addrbuf), ctx->addrlen);
3053#else
3054 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3055 SAS2SA(ctx->addrbuf), ctx->addrlen);
3056#endif
3057 return (ctx->result >= 0);
3058}
3059
Thomas Wouters477c8d52006-05-27 19:21:47 +00003060
3061/*
Christian Heimes99170a52007-12-19 02:07:34 +00003062 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3063 * into a char buffer. If you have any inc/def ref to do to the objects that
3064 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003065 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003066 * that it is also possible that we return a number of bytes smaller than the
3067 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003068 *
3069 * 'addr' is a return value for the address object. Note that you must decref
3070 * it yourself.
3071 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003072static Py_ssize_t
3073sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003074 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003078 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003080 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 if (!getsockaddrlen(s, &addrlen))
3083 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 if (!IS_SELECTABLE(s)) {
3086 select_error();
3087 return -1;
3088 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003089
Victor Stinner31bf2d52015-04-01 21:57:09 +02003090 ctx.cbuf = cbuf;
3091 ctx.len = len;
3092 ctx.flags = flags;
3093 ctx.addrbuf = &addrbuf;
3094 ctx.addrlen = &addrlen;
3095 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003097
Victor Stinner31bf2d52015-04-01 21:57:09 +02003098 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3099 s->sock_proto);
3100 if (*addr == NULL)
3101 return -1;
3102
3103 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003104}
3105
3106/* s.recvfrom(nbytes [,flags]) method */
3107
3108static PyObject *
3109sock_recvfrom(PySocketSockObject *s, PyObject *args)
3110{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 PyObject *buf = NULL;
3112 PyObject *addr = NULL;
3113 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003114 int flags = 0;
3115 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003116
Antoine Pitrou19467d22010-08-17 19:33:30 +00003117 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003120 if (recvlen < 0) {
3121 PyErr_SetString(PyExc_ValueError,
3122 "negative buffersize in recvfrom");
3123 return NULL;
3124 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3127 if (buf == NULL)
3128 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003130 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3131 recvlen, flags, &addr);
3132 if (outlen < 0) {
3133 goto finally;
3134 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 if (outlen != recvlen) {
3137 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003138 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003140 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 goto finally;
3142 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003144 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003145
3146finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 Py_XDECREF(buf);
3148 Py_XDECREF(addr);
3149 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003150}
3151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003152PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003153"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3154\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003155Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003156
Thomas Wouters477c8d52006-05-27 19:21:47 +00003157
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003158/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003159
3160static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003161sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003162{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003163 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003164
Antoine Pitrou19467d22010-08-17 19:33:30 +00003165 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 Py_buffer pbuf;
3167 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003168 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003170 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003171
Antoine Pitrou19467d22010-08-17 19:33:30 +00003172 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003173 kwlist, &pbuf,
3174 &recvlen, &flags))
3175 return NULL;
3176 buf = pbuf.buf;
3177 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003179 if (recvlen < 0) {
3180 PyBuffer_Release(&pbuf);
3181 PyErr_SetString(PyExc_ValueError,
3182 "negative buffersize in recvfrom_into");
3183 return NULL;
3184 }
3185 if (recvlen == 0) {
3186 /* If nbytes was not specified, use the buffer's length */
3187 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003188 } else if (recvlen > buflen) {
3189 PyBuffer_Release(&pbuf);
3190 PyErr_SetString(PyExc_ValueError,
3191 "nbytes is greater than the length of the buffer");
3192 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003193 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003195 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3196 if (readlen < 0) {
3197 PyBuffer_Release(&pbuf);
3198 /* Return an error */
3199 Py_XDECREF(addr);
3200 return NULL;
3201 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003203 PyBuffer_Release(&pbuf);
3204 /* Return the number of bytes read and the address. Note that we do
3205 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003206 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003207}
3208
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003209PyDoc_STRVAR(recvfrom_into_doc,
3210"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003211\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003212Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003213
Victor Stinner35bee932015-04-02 12:28:07 +02003214/* The sendmsg() and recvmsg[_into]() methods require a working
3215 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3216#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003217struct sock_recvmsg {
3218 struct msghdr *msg;
3219 int flags;
3220 ssize_t result;
3221};
3222
3223static int
3224sock_recvmsg_impl(PySocketSockObject *s, void *data)
3225{
3226 struct sock_recvmsg *ctx = data;
3227
3228 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3229 return (ctx->result >= 0);
3230}
3231
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003232/*
3233 * Call recvmsg() with the supplied iovec structures, flags, and
3234 * ancillary data buffer size (controllen). Returns the tuple return
3235 * value for recvmsg() or recvmsg_into(), with the first item provided
3236 * by the supplied makeval() function. makeval() will be called with
3237 * the length read and makeval_data as arguments, and must return a
3238 * new reference (which will be decrefed if there is a subsequent
3239 * error). On error, closes any file descriptors received via
3240 * SCM_RIGHTS.
3241 */
3242static PyObject *
3243sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3244 int flags, Py_ssize_t controllen,
3245 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3246{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003247 sock_addr_t addrbuf;
3248 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003249 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003250 PyObject *cmsg_list = NULL, *retval = NULL;
3251 void *controlbuf = NULL;
3252 struct cmsghdr *cmsgh;
3253 size_t cmsgdatalen = 0;
3254 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003255 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003256
3257 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3258 ignored" when the socket is connected (Linux fills them in
3259 anyway for AF_UNIX sockets at least). Normally msg_namelen
3260 seems to be set to 0 if there's no address, but try to
3261 initialize msg_name to something that won't be mistaken for a
3262 real address if that doesn't happen. */
3263 if (!getsockaddrlen(s, &addrbuflen))
3264 return NULL;
3265 memset(&addrbuf, 0, addrbuflen);
3266 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3267
3268 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3269 PyErr_SetString(PyExc_ValueError,
3270 "invalid ancillary data buffer length");
3271 return NULL;
3272 }
3273 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3274 return PyErr_NoMemory();
3275
3276 /* Make the system call. */
3277 if (!IS_SELECTABLE(s)) {
3278 select_error();
3279 goto finally;
3280 }
3281
Victor Stinner31bf2d52015-04-01 21:57:09 +02003282 msg.msg_name = SAS2SA(&addrbuf);
3283 msg.msg_namelen = addrbuflen;
3284 msg.msg_iov = iov;
3285 msg.msg_iovlen = iovlen;
3286 msg.msg_control = controlbuf;
3287 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003288
Victor Stinner31bf2d52015-04-01 21:57:09 +02003289 ctx.msg = &msg;
3290 ctx.flags = flags;
3291 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003292 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003293
3294 /* Make list of (level, type, data) tuples from control messages. */
3295 if ((cmsg_list = PyList_New(0)) == NULL)
3296 goto err_closefds;
3297 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3298 implementations didn't do so. */
3299 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3300 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3301 PyObject *bytes, *tuple;
3302 int tmp;
3303
3304 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3305 if (cmsg_status != 0) {
3306 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3307 "received malformed or improperly-truncated "
3308 "ancillary data", 1) == -1)
3309 goto err_closefds;
3310 }
3311 if (cmsg_status < 0)
3312 break;
3313 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003314 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003315 goto err_closefds;
3316 }
3317
3318 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3319 cmsgdatalen);
3320 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3321 (int)cmsgh->cmsg_type, bytes);
3322 if (tuple == NULL)
3323 goto err_closefds;
3324 tmp = PyList_Append(cmsg_list, tuple);
3325 Py_DECREF(tuple);
3326 if (tmp != 0)
3327 goto err_closefds;
3328
3329 if (cmsg_status != 0)
3330 break;
3331 }
3332
3333 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003334 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003335 cmsg_list,
3336 (int)msg.msg_flags,
3337 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3338 ((msg.msg_namelen > addrbuflen) ?
3339 addrbuflen : msg.msg_namelen),
3340 s->sock_proto));
3341 if (retval == NULL)
3342 goto err_closefds;
3343
3344finally:
3345 Py_XDECREF(cmsg_list);
3346 PyMem_Free(controlbuf);
3347 return retval;
3348
3349err_closefds:
3350#ifdef SCM_RIGHTS
3351 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3352 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3353 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3354 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3355 if (cmsg_status < 0)
3356 break;
3357 if (cmsgh->cmsg_level == SOL_SOCKET &&
3358 cmsgh->cmsg_type == SCM_RIGHTS) {
3359 size_t numfds;
3360 int *fdp;
3361
3362 numfds = cmsgdatalen / sizeof(int);
3363 fdp = (int *)CMSG_DATA(cmsgh);
3364 while (numfds-- > 0)
3365 close(*fdp++);
3366 }
3367 if (cmsg_status != 0)
3368 break;
3369 }
3370#endif /* SCM_RIGHTS */
3371 goto finally;
3372}
3373
3374
3375static PyObject *
3376makeval_recvmsg(ssize_t received, void *data)
3377{
3378 PyObject **buf = data;
3379
3380 if (received < PyBytes_GET_SIZE(*buf))
3381 _PyBytes_Resize(buf, received);
3382 Py_XINCREF(*buf);
3383 return *buf;
3384}
3385
3386/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3387
3388static PyObject *
3389sock_recvmsg(PySocketSockObject *s, PyObject *args)
3390{
3391 Py_ssize_t bufsize, ancbufsize = 0;
3392 int flags = 0;
3393 struct iovec iov;
3394 PyObject *buf = NULL, *retval = NULL;
3395
3396 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3397 return NULL;
3398
3399 if (bufsize < 0) {
3400 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3401 return NULL;
3402 }
3403 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3404 return NULL;
3405 iov.iov_base = PyBytes_AS_STRING(buf);
3406 iov.iov_len = bufsize;
3407
3408 /* Note that we're passing a pointer to *our pointer* to the bytes
3409 object here (&buf); makeval_recvmsg() may incref the object, or
3410 deallocate it and set our pointer to NULL. */
3411 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3412 &makeval_recvmsg, &buf);
3413 Py_XDECREF(buf);
3414 return retval;
3415}
3416
3417PyDoc_STRVAR(recvmsg_doc,
3418"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3419\n\
3420Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3421socket. The ancbufsize argument sets the size in bytes of the\n\
3422internal buffer used to receive the ancillary data; it defaults to 0,\n\
3423meaning that no ancillary data will be received. Appropriate buffer\n\
3424sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3425CMSG_LEN(), and items which do not fit into the buffer might be\n\
3426truncated or discarded. The flags argument defaults to 0 and has the\n\
3427same meaning as for recv().\n\
3428\n\
3429The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3430The data item is a bytes object holding the non-ancillary data\n\
3431received. The ancdata item is a list of zero or more tuples\n\
3432(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3433(control messages) received: cmsg_level and cmsg_type are integers\n\
3434specifying the protocol level and protocol-specific type respectively,\n\
3435and cmsg_data is a bytes object holding the associated data. The\n\
3436msg_flags item is the bitwise OR of various flags indicating\n\
3437conditions on the received message; see your system documentation for\n\
3438details. If the receiving socket is unconnected, address is the\n\
3439address of the sending socket, if available; otherwise, its value is\n\
3440unspecified.\n\
3441\n\
3442If recvmsg() raises an exception after the system call returns, it\n\
3443will first attempt to close any file descriptors received via the\n\
3444SCM_RIGHTS mechanism.");
3445
3446
3447static PyObject *
3448makeval_recvmsg_into(ssize_t received, void *data)
3449{
3450 return PyLong_FromSsize_t(received);
3451}
3452
3453/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3454
3455static PyObject *
3456sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3457{
3458 Py_ssize_t ancbufsize = 0;
3459 int flags = 0;
3460 struct iovec *iovs = NULL;
3461 Py_ssize_t i, nitems, nbufs = 0;
3462 Py_buffer *bufs = NULL;
3463 PyObject *buffers_arg, *fast, *retval = NULL;
3464
3465 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3466 &buffers_arg, &ancbufsize, &flags))
3467 return NULL;
3468
3469 if ((fast = PySequence_Fast(buffers_arg,
3470 "recvmsg_into() argument 1 must be an "
3471 "iterable")) == NULL)
3472 return NULL;
3473 nitems = PySequence_Fast_GET_SIZE(fast);
3474 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003475 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003476 goto finally;
3477 }
3478
3479 /* Fill in an iovec for each item, and save the Py_buffer
3480 structs to release afterwards. */
3481 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3482 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3483 PyErr_NoMemory();
3484 goto finally;
3485 }
3486 for (; nbufs < nitems; nbufs++) {
3487 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3488 "w*;recvmsg_into() argument 1 must be an iterable "
3489 "of single-segment read-write buffers",
3490 &bufs[nbufs]))
3491 goto finally;
3492 iovs[nbufs].iov_base = bufs[nbufs].buf;
3493 iovs[nbufs].iov_len = bufs[nbufs].len;
3494 }
3495
3496 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3497 &makeval_recvmsg_into, NULL);
3498finally:
3499 for (i = 0; i < nbufs; i++)
3500 PyBuffer_Release(&bufs[i]);
3501 PyMem_Free(bufs);
3502 PyMem_Free(iovs);
3503 Py_DECREF(fast);
3504 return retval;
3505}
3506
3507PyDoc_STRVAR(recvmsg_into_doc,
3508"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3509\n\
3510Receive normal data and ancillary data from the socket, scattering the\n\
3511non-ancillary data into a series of buffers. The buffers argument\n\
3512must be an iterable of objects that export writable buffers\n\
3513(e.g. bytearray objects); these will be filled with successive chunks\n\
3514of the non-ancillary data until it has all been written or there are\n\
3515no more buffers. The ancbufsize argument sets the size in bytes of\n\
3516the internal buffer used to receive the ancillary data; it defaults to\n\
35170, meaning that no ancillary data will be received. Appropriate\n\
3518buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3519or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3520truncated or discarded. The flags argument defaults to 0 and has the\n\
3521same meaning as for recv().\n\
3522\n\
3523The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3524The nbytes item is the total number of bytes of non-ancillary data\n\
3525written into the buffers. The ancdata item is a list of zero or more\n\
3526tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3527data (control messages) received: cmsg_level and cmsg_type are\n\
3528integers specifying the protocol level and protocol-specific type\n\
3529respectively, and cmsg_data is a bytes object holding the associated\n\
3530data. The msg_flags item is the bitwise OR of various flags\n\
3531indicating conditions on the received message; see your system\n\
3532documentation for details. If the receiving socket is unconnected,\n\
3533address is the address of the sending socket, if available; otherwise,\n\
3534its value is unspecified.\n\
3535\n\
3536If recvmsg_into() raises an exception after the system call returns,\n\
3537it will first attempt to close any file descriptors received via the\n\
3538SCM_RIGHTS mechanism.");
3539#endif /* CMSG_LEN */
3540
3541
Victor Stinner31bf2d52015-04-01 21:57:09 +02003542struct sock_send {
3543 char *buf;
3544 Py_ssize_t len;
3545 int flags;
3546 Py_ssize_t result;
3547};
3548
3549static int
3550sock_send_impl(PySocketSockObject *s, void *data)
3551{
3552 struct sock_send *ctx = data;
3553
3554#ifdef MS_WINDOWS
3555 if (ctx->len > INT_MAX)
3556 ctx->len = INT_MAX;
3557 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3558#else
3559 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3560#endif
3561 return (ctx->result >= 0);
3562}
3563
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003564/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003565
Guido van Rossum73624e91994-10-10 17:59:00 +00003566static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003567sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003568{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003569 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003571 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3574 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 if (!IS_SELECTABLE(s)) {
3577 PyBuffer_Release(&pbuf);
3578 return select_error();
3579 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003580 ctx.buf = pbuf.buf;
3581 ctx.len = pbuf.len;
3582 ctx.flags = flags;
3583 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003584 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 return NULL;
3586 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003587 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003588
3589 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003590}
3591
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003592PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003593"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003594\n\
3595Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003596argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003597sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003598
3599
3600/* s.sendall(data [,flags]) method */
3601
3602static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003603sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003604{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003605 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003606 Py_ssize_t len, n;
3607 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003608 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003609 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003610 int has_timeout = (s->sock_timeout > 0);
3611 _PyTime_t interval = s->sock_timeout;
3612 _PyTime_t deadline = 0;
3613 int deadline_initialized = 0;
3614 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3617 return NULL;
3618 buf = pbuf.buf;
3619 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003621 if (!IS_SELECTABLE(s)) {
3622 PyBuffer_Release(&pbuf);
3623 return select_error();
3624 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003626 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003627 if (has_timeout) {
3628 if (deadline_initialized) {
3629 /* recompute the timeout */
3630 interval = deadline - _PyTime_GetMonotonicClock();
3631 }
3632 else {
3633 deadline_initialized = 1;
3634 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3635 }
3636
3637 if (interval <= 0) {
3638 PyErr_SetString(socket_timeout, "timed out");
3639 goto done;
3640 }
3641 }
3642
Victor Stinner02f32ab2015-04-01 22:53:26 +02003643 ctx.buf = buf;
3644 ctx.len = len;
3645 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003646 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3647 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003648 n = ctx.result;
3649 assert(n >= 0);
3650
3651 buf += n;
3652 len -= n;
3653
3654 /* We must run our signal handlers before looping again.
3655 send() can return a successful partial write when it is
3656 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003657 if (PyErr_CheckSignals())
3658 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003659 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003660 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003661
Victor Stinner8912d142015-04-06 23:16:34 +02003662 Py_INCREF(Py_None);
3663 res = Py_None;
3664
3665done:
3666 PyBuffer_Release(&pbuf);
3667 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003668}
3669
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003670PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003671"sendall(data[, flags])\n\
3672\n\
3673Send a data string to the socket. For the optional flags\n\
3674argument, see the Unix manual. This calls send() repeatedly\n\
3675until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003676to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003677
Guido van Rossum30a685f1991-06-27 15:51:29 +00003678
Victor Stinner31bf2d52015-04-01 21:57:09 +02003679struct sock_sendto {
3680 char *buf;
3681 Py_ssize_t len;
3682 int flags;
3683 int addrlen;
3684 sock_addr_t *addrbuf;
3685 Py_ssize_t result;
3686};
3687
3688static int
3689sock_sendto_impl(PySocketSockObject *s, void *data)
3690{
3691 struct sock_sendto *ctx = data;
3692
3693#ifdef MS_WINDOWS
3694 if (ctx->len > INT_MAX)
3695 ctx->len = INT_MAX;
3696 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3697 SAS2SA(ctx->addrbuf), ctx->addrlen);
3698#else
3699 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3700 SAS2SA(ctx->addrbuf), ctx->addrlen);
3701#endif
3702 return (ctx->result >= 0);
3703}
3704
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003705/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003706
Guido van Rossum73624e91994-10-10 17:59:00 +00003707static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003708sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003710 Py_buffer pbuf;
3711 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003712 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003714 int addrlen, flags;
3715 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003718 arglen = PyTuple_Size(args);
3719 switch (arglen) {
3720 case 2:
3721 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3722 break;
3723 case 3:
3724 PyArg_ParseTuple(args, "y*iO:sendto",
3725 &pbuf, &flags, &addro);
3726 break;
3727 default:
3728 PyErr_Format(PyExc_TypeError,
3729 "sendto() takes 2 or 3 arguments (%d given)",
3730 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003731 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003733 if (PyErr_Occurred())
3734 return NULL;
3735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003736 if (!IS_SELECTABLE(s)) {
3737 PyBuffer_Release(&pbuf);
3738 return select_error();
3739 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3742 PyBuffer_Release(&pbuf);
3743 return NULL;
3744 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003745
Victor Stinner31bf2d52015-04-01 21:57:09 +02003746 ctx.buf = pbuf.buf;
3747 ctx.len = pbuf.len;
3748 ctx.flags = flags;
3749 ctx.addrlen = addrlen;
3750 ctx.addrbuf = &addrbuf;
3751 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003752 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003753 return NULL;
3754 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003755 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003756
3757 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003758}
3759
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003760PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003761"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003762\n\
3763Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003764For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003765
Guido van Rossum30a685f1991-06-27 15:51:29 +00003766
Victor Stinner35bee932015-04-02 12:28:07 +02003767/* The sendmsg() and recvmsg[_into]() methods require a working
3768 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3769#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003770struct sock_sendmsg {
3771 struct msghdr *msg;
3772 int flags;
3773 ssize_t result;
3774};
3775
3776static int
3777sock_sendmsg_impl(PySocketSockObject *s, void *data)
3778{
3779 struct sock_sendmsg *ctx = data;
3780
3781 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3782 return (ctx->result >= 0);
3783}
3784
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003785/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3786
3787static PyObject *
3788sock_sendmsg(PySocketSockObject *s, PyObject *args)
3789{
3790 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3791 Py_buffer *databufs = NULL;
3792 struct iovec *iovs = NULL;
3793 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003794 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003795 struct cmsginfo {
3796 int level;
3797 int type;
3798 Py_buffer data;
3799 } *cmsgs = NULL;
3800 void *controlbuf = NULL;
3801 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003802 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3804 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003805 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806
3807 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3808 &data_arg, &cmsg_arg, &flags, &addr_arg))
3809 return NULL;
3810
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003811 /* Parse destination address. */
3812 if (addr_arg != NULL && addr_arg != Py_None) {
3813 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3814 goto finally;
3815 msg.msg_name = &addrbuf;
3816 msg.msg_namelen = addrlen;
3817 }
3818
3819 /* Fill in an iovec for each message part, and save the Py_buffer
3820 structs to release afterwards. */
3821 if ((data_fast = PySequence_Fast(data_arg,
3822 "sendmsg() argument 1 must be an "
3823 "iterable")) == NULL)
3824 goto finally;
3825 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3826 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003827 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003828 goto finally;
3829 }
3830 msg.msg_iovlen = ndataparts;
3831 if (ndataparts > 0 &&
3832 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3833 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3834 PyErr_NoMemory();
3835 goto finally;
3836 }
3837 for (; ndatabufs < ndataparts; ndatabufs++) {
3838 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3839 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003840 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003841 &databufs[ndatabufs]))
3842 goto finally;
3843 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3844 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3845 }
3846
3847 if (cmsg_arg == NULL)
3848 ncmsgs = 0;
3849 else {
3850 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3851 "sendmsg() argument 2 must be an "
3852 "iterable")) == NULL)
3853 goto finally;
3854 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3855 }
3856
3857#ifndef CMSG_SPACE
3858 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003859 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003860 "sending multiple control messages is not supported "
3861 "on this system");
3862 goto finally;
3863 }
3864#endif
3865 /* Save level, type and Py_buffer for each control message,
3866 and calculate total size. */
3867 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3868 PyErr_NoMemory();
3869 goto finally;
3870 }
3871 controllen = controllen_last = 0;
3872 while (ncmsgbufs < ncmsgs) {
3873 size_t bufsize, space;
3874
3875 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3876 "(iiy*):[sendmsg() ancillary data items]",
3877 &cmsgs[ncmsgbufs].level,
3878 &cmsgs[ncmsgbufs].type,
3879 &cmsgs[ncmsgbufs].data))
3880 goto finally;
3881 bufsize = cmsgs[ncmsgbufs++].data.len;
3882
3883#ifdef CMSG_SPACE
3884 if (!get_CMSG_SPACE(bufsize, &space)) {
3885#else
3886 if (!get_CMSG_LEN(bufsize, &space)) {
3887#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003888 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003889 goto finally;
3890 }
3891 controllen += space;
3892 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003893 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003894 goto finally;
3895 }
3896 controllen_last = controllen;
3897 }
3898
3899 /* Construct ancillary data block from control message info. */
3900 if (ncmsgbufs > 0) {
3901 struct cmsghdr *cmsgh = NULL;
3902
3903 if ((msg.msg_control = controlbuf =
3904 PyMem_Malloc(controllen)) == NULL) {
3905 PyErr_NoMemory();
3906 goto finally;
3907 }
3908 msg.msg_controllen = controllen;
3909
3910 /* Need to zero out the buffer as a workaround for glibc's
3911 CMSG_NXTHDR() implementation. After getting the pointer to
3912 the next header, it checks its (uninitialized) cmsg_len
3913 member to see if the "message" fits in the buffer, and
3914 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003915 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003916 memset(controlbuf, 0, controllen);
3917
3918 for (i = 0; i < ncmsgbufs; i++) {
3919 size_t msg_len, data_len = cmsgs[i].data.len;
3920 int enough_space = 0;
3921
3922 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3923 if (cmsgh == NULL) {
3924 PyErr_Format(PyExc_RuntimeError,
3925 "unexpected NULL result from %s()",
3926 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3927 goto finally;
3928 }
3929 if (!get_CMSG_LEN(data_len, &msg_len)) {
3930 PyErr_SetString(PyExc_RuntimeError,
3931 "item size out of range for CMSG_LEN()");
3932 goto finally;
3933 }
3934 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3935 size_t space;
3936
3937 cmsgh->cmsg_len = msg_len;
3938 if (get_cmsg_data_space(&msg, cmsgh, &space))
3939 enough_space = (space >= data_len);
3940 }
3941 if (!enough_space) {
3942 PyErr_SetString(PyExc_RuntimeError,
3943 "ancillary data does not fit in calculated "
3944 "space");
3945 goto finally;
3946 }
3947 cmsgh->cmsg_level = cmsgs[i].level;
3948 cmsgh->cmsg_type = cmsgs[i].type;
3949 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3950 }
3951 }
3952
3953 /* Make the system call. */
3954 if (!IS_SELECTABLE(s)) {
3955 select_error();
3956 goto finally;
3957 }
3958
Victor Stinner31bf2d52015-04-01 21:57:09 +02003959 ctx.msg = &msg;
3960 ctx.flags = flags;
3961 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003962 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003963
3964 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003965
3966finally:
3967 PyMem_Free(controlbuf);
3968 for (i = 0; i < ncmsgbufs; i++)
3969 PyBuffer_Release(&cmsgs[i].data);
3970 PyMem_Free(cmsgs);
3971 Py_XDECREF(cmsg_fast);
3972 for (i = 0; i < ndatabufs; i++)
3973 PyBuffer_Release(&databufs[i]);
3974 PyMem_Free(databufs);
3975 PyMem_Free(iovs);
3976 Py_XDECREF(data_fast);
3977 return retval;
3978}
3979
3980PyDoc_STRVAR(sendmsg_doc,
3981"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3982\n\
3983Send normal and ancillary data to the socket, gathering the\n\
3984non-ancillary data from a series of buffers and concatenating it into\n\
3985a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003986data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003987The ancdata argument specifies the ancillary data (control messages)\n\
3988as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3989cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3990protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003991is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003992argument defaults to 0 and has the same meaning as for send(). If\n\
3993address is supplied and not None, it sets a destination address for\n\
3994the message. The return value is the number of bytes of non-ancillary\n\
3995data sent.");
3996#endif /* CMSG_LEN */
3997
3998
Guido van Rossum30a685f1991-06-27 15:51:29 +00003999/* s.shutdown(how) method */
4000
Guido van Rossum73624e91994-10-10 17:59:00 +00004001static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004002sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 int how;
4005 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004006
Serhiy Storchaka78980432013-01-15 01:12:17 +02004007 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 if (how == -1 && PyErr_Occurred())
4009 return NULL;
4010 Py_BEGIN_ALLOW_THREADS
4011 res = shutdown(s->sock_fd, how);
4012 Py_END_ALLOW_THREADS
4013 if (res < 0)
4014 return s->errorhandler();
4015 Py_INCREF(Py_None);
4016 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004017}
4018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004019PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004020"shutdown(flag)\n\
4021\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004022Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4023of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004024
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004025#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004026static PyObject*
4027sock_ioctl(PySocketSockObject *s, PyObject *arg)
4028{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 unsigned long cmd = SIO_RCVALL;
4030 PyObject *argO;
4031 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004033 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4034 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004036 switch (cmd) {
4037 case SIO_RCVALL: {
4038 unsigned int option = RCVALL_ON;
4039 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4040 return NULL;
4041 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4042 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4043 return set_error();
4044 }
4045 return PyLong_FromUnsignedLong(recv); }
4046 case SIO_KEEPALIVE_VALS: {
4047 struct tcp_keepalive ka;
4048 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4049 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4050 return NULL;
4051 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4052 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4053 return set_error();
4054 }
4055 return PyLong_FromUnsignedLong(recv); }
Steve Dowerea93ac02016-06-17 12:52:18 -07004056#if defined(SIO_LOOPBACK_FAST_PATH)
4057 case SIO_LOOPBACK_FAST_PATH: {
4058 unsigned int option;
4059 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4060 return NULL;
4061 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4062 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4063 return set_error();
4064 }
4065 return PyLong_FromUnsignedLong(recv); }
4066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 default:
4068 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4069 return NULL;
4070 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004071}
4072PyDoc_STRVAR(sock_ioctl_doc,
4073"ioctl(cmd, option) -> long\n\
4074\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004075Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4076SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
Steve Dowerea93ac02016-06-17 12:52:18 -07004077SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).\n\
4078SIO_LOOPBACK_FAST_PATH: 'option' is a boolean value, and is disabled by default");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004079#endif
4080
4081#if defined(MS_WINDOWS)
4082static PyObject*
4083sock_share(PySocketSockObject *s, PyObject *arg)
4084{
4085 WSAPROTOCOL_INFO info;
4086 DWORD processId;
4087 int result;
4088
4089 if (!PyArg_ParseTuple(arg, "I", &processId))
4090 return NULL;
4091
4092 Py_BEGIN_ALLOW_THREADS
4093 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4094 Py_END_ALLOW_THREADS
4095 if (result == SOCKET_ERROR)
4096 return set_error();
4097 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4098}
4099PyDoc_STRVAR(sock_share_doc,
4100"share(process_id) -> bytes\n\
4101\n\
4102Share the socket with another process. The target process id\n\
4103must be provided and the resulting bytes object passed to the target\n\
4104process. There the shared socket can be instantiated by calling\n\
4105socket.fromshare().");
4106
Christian Heimesfaf2f632008-01-06 16:59:19 +00004107
4108#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004109
4110/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004111
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004112static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4114 accept_doc},
4115 {"bind", (PyCFunction)sock_bind, METH_O,
4116 bind_doc},
4117 {"close", (PyCFunction)sock_close, METH_NOARGS,
4118 close_doc},
4119 {"connect", (PyCFunction)sock_connect, METH_O,
4120 connect_doc},
4121 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4122 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004123 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4124 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4126 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004127#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 {"getpeername", (PyCFunction)sock_getpeername,
4129 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004130#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004131 {"getsockname", (PyCFunction)sock_getsockname,
4132 METH_NOARGS, getsockname_doc},
4133 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4134 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004135#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4137 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004138#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004139#if defined(MS_WINDOWS)
4140 {"share", (PyCFunction)sock_share, METH_VARARGS,
4141 sock_share_doc},
4142#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004143 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 listen_doc},
4145 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4146 recv_doc},
4147 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4148 recv_into_doc},
4149 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4150 recvfrom_doc},
4151 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4152 recvfrom_into_doc},
4153 {"send", (PyCFunction)sock_send, METH_VARARGS,
4154 send_doc},
4155 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4156 sendall_doc},
4157 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4158 sendto_doc},
4159 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4160 setblocking_doc},
4161 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4162 settimeout_doc},
4163 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4164 gettimeout_doc},
4165 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4166 setsockopt_doc},
4167 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4168 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004169#ifdef CMSG_LEN
4170 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4171 recvmsg_doc},
4172 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4173 recvmsg_into_doc,},
4174 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4175 sendmsg_doc},
4176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004178};
4179
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004180/* SockObject members */
4181static PyMemberDef sock_memberlist[] = {
4182 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4183 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4184 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004185 {0},
4186};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004187
Victor Stinner71694d52015-03-28 01:18:54 +01004188static PyGetSetDef sock_getsetlist[] = {
4189 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4190 {NULL} /* sentinel */
4191};
4192
Guido van Rossum73624e91994-10-10 17:59:00 +00004193/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004194 First close the file description. */
4195
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004196static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004197sock_finalize(PySocketSockObject *s)
4198{
4199 SOCKET_T fd;
4200 PyObject *error_type, *error_value, *error_traceback;
4201
4202 /* Save the current exception, if any. */
4203 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4204
Victor Stinnerd3afb622016-07-22 17:47:09 +02004205 if (s->sock_fd != INVALID_SOCKET) {
Victor Stinner19a8e842016-03-21 16:36:48 +01004206 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4207 /* Spurious errors can appear at shutdown */
4208 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4209 PyErr_WriteUnraisable((PyObject *)s);
4210 }
4211 }
4212
4213 /* Only close the socket *after* logging the ResourceWarning warning
4214 to allow the logger to call socket methods like
4215 socket.getsockname(). If the socket is closed before, socket
4216 methods fails with the EBADF error. */
4217 fd = s->sock_fd;
Victor Stinnerd3afb622016-07-22 17:47:09 +02004218 s->sock_fd = INVALID_SOCKET;
Victor Stinner19a8e842016-03-21 16:36:48 +01004219
4220 /* We do not want to retry upon EINTR: see sock_close() */
4221 Py_BEGIN_ALLOW_THREADS
4222 (void) SOCKETCLOSE(fd);
4223 Py_END_ALLOW_THREADS
4224 }
4225
4226 /* Restore the saved exception. */
4227 PyErr_Restore(error_type, error_value, error_traceback);
4228}
4229
4230static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004231sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004232{
Victor Stinner19a8e842016-03-21 16:36:48 +01004233 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4234 return;
4235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004237}
4238
Guido van Rossum30a685f1991-06-27 15:51:29 +00004239
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004240static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004241sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004242{
Victor Stinnere254e532014-07-26 14:36:55 +02004243 long sock_fd;
4244 /* On Windows, this test is needed because SOCKET_T is unsigned */
4245 if (s->sock_fd == INVALID_SOCKET) {
4246 sock_fd = -1;
4247 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004248#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004249 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004250 /* this can occur on Win64, and actually there is a special
4251 ugly printf formatter for decimal pointer length integer
4252 printing, only bother if necessary*/
4253 PyErr_SetString(PyExc_OverflowError,
4254 "no printf formatter to display "
4255 "the socket descriptor in decimal");
4256 return NULL;
4257 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004258#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004259 else
4260 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 return PyUnicode_FromFormat(
4262 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004263 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 s->sock_type,
4265 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004266}
4267
4268
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004269/* Create a new, uninitialized socket object. */
4270
4271static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004272sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004273{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 new = type->tp_alloc(type, 0);
4277 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004278 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004279 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004280 ((PySocketSockObject *)new)->errorhandler = &set_error;
4281 }
4282 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004283}
4284
4285
4286/* Initialize a new socket object. */
4287
Victor Stinnerdaf45552013-08-28 00:53:59 +02004288#ifdef SOCK_CLOEXEC
4289/* socket() and socketpair() fail with EINVAL on Linux kernel older
4290 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4291static int sock_cloexec_works = -1;
4292#endif
4293
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004294/*ARGSUSED*/
4295static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004296sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004297{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 PySocketSockObject *s = (PySocketSockObject *)self;
4299 PyObject *fdobj = NULL;
4300 SOCKET_T fd = INVALID_SOCKET;
4301 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4302 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004303#ifndef MS_WINDOWS
4304#ifdef SOCK_CLOEXEC
4305 int *atomic_flag_works = &sock_cloexec_works;
4306#else
4307 int *atomic_flag_works = NULL;
4308#endif
4309#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4312 "|iiiO:socket", keywords,
4313 &family, &type, &proto, &fdobj))
4314 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004317#ifdef MS_WINDOWS
4318 /* recreate a socket that was duplicated */
4319 if (PyBytes_Check(fdobj)) {
4320 WSAPROTOCOL_INFO info;
4321 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4322 PyErr_Format(PyExc_ValueError,
4323 "socket descriptor string has wrong size, "
4324 "should be %zu bytes.", sizeof(info));
4325 return -1;
4326 }
4327 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4328 Py_BEGIN_ALLOW_THREADS
4329 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4330 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4331 Py_END_ALLOW_THREADS
4332 if (fd == INVALID_SOCKET) {
4333 set_error();
4334 return -1;
4335 }
4336 family = info.iAddressFamily;
4337 type = info.iSocketType;
4338 proto = info.iProtocol;
4339 }
4340 else
4341#endif
4342 {
4343 fd = PyLong_AsSocket_t(fdobj);
4344 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4345 return -1;
4346 if (fd == INVALID_SOCKET) {
4347 PyErr_SetString(PyExc_ValueError,
4348 "can't use invalid socket value");
4349 return -1;
4350 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 }
4352 }
4353 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004354#ifdef MS_WINDOWS
4355 /* Windows implementation */
4356#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4357#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4358#endif
4359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004361 if (support_wsa_no_inherit) {
4362 fd = WSASocket(family, type, proto,
4363 NULL, 0,
4364 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4365 if (fd == INVALID_SOCKET) {
4366 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4367 support_wsa_no_inherit = 0;
4368 fd = socket(family, type, proto);
4369 }
4370 }
4371 else {
4372 fd = socket(family, type, proto);
4373 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 if (fd == INVALID_SOCKET) {
4377 set_error();
4378 return -1;
4379 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004380
4381 if (!support_wsa_no_inherit) {
4382 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4383 closesocket(fd);
4384 PyErr_SetFromWindowsErr(0);
4385 return -1;
4386 }
4387 }
4388#else
4389 /* UNIX */
4390 Py_BEGIN_ALLOW_THREADS
4391#ifdef SOCK_CLOEXEC
4392 if (sock_cloexec_works != 0) {
4393 fd = socket(family, type | SOCK_CLOEXEC, proto);
4394 if (sock_cloexec_works == -1) {
4395 if (fd >= 0) {
4396 sock_cloexec_works = 1;
4397 }
4398 else if (errno == EINVAL) {
4399 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4400 sock_cloexec_works = 0;
4401 fd = socket(family, type, proto);
4402 }
4403 }
4404 }
4405 else
4406#endif
4407 {
4408 fd = socket(family, type, proto);
4409 }
4410 Py_END_ALLOW_THREADS
4411
4412 if (fd == INVALID_SOCKET) {
4413 set_error();
4414 return -1;
4415 }
4416
4417 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4418 SOCKETCLOSE(fd);
4419 return -1;
4420 }
4421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 }
4423 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004426
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004427}
4428
4429
Guido van Rossumb6775db1994-08-01 11:34:53 +00004430/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004431
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004432static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4434 "_socket.socket", /* tp_name */
4435 sizeof(PySocketSockObject), /* tp_basicsize */
4436 0, /* tp_itemsize */
4437 (destructor)sock_dealloc, /* tp_dealloc */
4438 0, /* tp_print */
4439 0, /* tp_getattr */
4440 0, /* tp_setattr */
4441 0, /* tp_reserved */
4442 (reprfunc)sock_repr, /* tp_repr */
4443 0, /* tp_as_number */
4444 0, /* tp_as_sequence */
4445 0, /* tp_as_mapping */
4446 0, /* tp_hash */
4447 0, /* tp_call */
4448 0, /* tp_str */
4449 PyObject_GenericGetAttr, /* tp_getattro */
4450 0, /* tp_setattro */
4451 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004452 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4453 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 sock_doc, /* tp_doc */
4455 0, /* tp_traverse */
4456 0, /* tp_clear */
4457 0, /* tp_richcompare */
4458 0, /* tp_weaklistoffset */
4459 0, /* tp_iter */
4460 0, /* tp_iternext */
4461 sock_methods, /* tp_methods */
4462 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004463 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 0, /* tp_base */
4465 0, /* tp_dict */
4466 0, /* tp_descr_get */
4467 0, /* tp_descr_set */
4468 0, /* tp_dictoffset */
4469 sock_initobj, /* tp_init */
4470 PyType_GenericAlloc, /* tp_alloc */
4471 sock_new, /* tp_new */
4472 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004473 0, /* tp_is_gc */
4474 0, /* tp_bases */
4475 0, /* tp_mro */
4476 0, /* tp_cache */
4477 0, /* tp_subclasses */
4478 0, /* tp_weaklist */
4479 0, /* tp_del */
4480 0, /* tp_version_tag */
4481 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004482};
4483
Guido van Rossum30a685f1991-06-27 15:51:29 +00004484
Guido van Rossum81194471991-07-27 21:42:02 +00004485/* Python interface to gethostname(). */
4486
4487/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004488static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004489socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004490{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004491#ifdef MS_WINDOWS
4492 /* Don't use winsock's gethostname, as this returns the ANSI
4493 version of the hostname, whereas we need a Unicode string.
4494 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004495 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004496 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004497 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004498 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004499
4500 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004501 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004502
4503 if (GetLastError() != ERROR_MORE_DATA)
4504 return PyErr_SetFromWindowsErr(0);
4505
4506 if (size == 0)
4507 return PyUnicode_New(0, 0);
4508
4509 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4510 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004511 name = PyMem_New(wchar_t, size);
4512 if (!name) {
4513 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004514 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004515 }
Victor Stinner74168972011-11-17 01:11:36 +01004516 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4517 name,
4518 &size))
4519 {
4520 PyMem_Free(name);
4521 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004522 }
Victor Stinner74168972011-11-17 01:11:36 +01004523
4524 result = PyUnicode_FromWideChar(name, size);
4525 PyMem_Free(name);
4526 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004527#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 char buf[1024];
4529 int res;
4530 Py_BEGIN_ALLOW_THREADS
4531 res = gethostname(buf, (int) sizeof buf - 1);
4532 Py_END_ALLOW_THREADS
4533 if (res < 0)
4534 return set_error();
4535 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004536 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004537#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004538}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004540PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004541"gethostname() -> string\n\
4542\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004543Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004544
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004545#ifdef HAVE_SETHOSTNAME
4546PyDoc_STRVAR(sethostname_doc,
4547"sethostname(name)\n\n\
4548Sets the hostname to name.");
4549
4550static PyObject *
4551socket_sethostname(PyObject *self, PyObject *args)
4552{
4553 PyObject *hnobj;
4554 Py_buffer buf;
4555 int res, flag = 0;
4556
Christian Heimesd2774c72013-06-19 02:06:29 +02004557#ifdef _AIX
4558/* issue #18259, not declared in any useful header file */
4559extern int sethostname(const char *, size_t);
4560#endif
4561
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004562 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4563 PyErr_Clear();
4564 if (!PyArg_ParseTuple(args, "O&:sethostname",
4565 PyUnicode_FSConverter, &hnobj))
4566 return NULL;
4567 flag = 1;
4568 }
4569 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4570 if (!res) {
4571 res = sethostname(buf.buf, buf.len);
4572 PyBuffer_Release(&buf);
4573 }
4574 if (flag)
4575 Py_DECREF(hnobj);
4576 if (res)
4577 return set_error();
4578 Py_RETURN_NONE;
4579}
4580#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004581
Guido van Rossum30a685f1991-06-27 15:51:29 +00004582/* Python interface to gethostbyname(name). */
4583
4584/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004585static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004586socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004587{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 char *name;
4589 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004590 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004591
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004592 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 return NULL;
4594 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004595 goto finally;
4596 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4597finally:
4598 PyMem_Free(name);
4599 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004600}
4601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004602PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004603"gethostbyname(host) -> address\n\
4604\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004605Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606
4607
Victor Stinner72400302016-01-28 15:41:01 +01004608static PyObject*
4609sock_decode_hostname(const char *name)
4610{
4611#ifdef MS_WINDOWS
4612 /* Issue #26227: gethostbyaddr() returns a string encoded
4613 * to the ANSI code page */
4614 return PyUnicode_DecodeFSDefault(name);
4615#else
4616 /* Decode from UTF-8 */
4617 return PyUnicode_FromString(name);
4618#endif
4619}
4620
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004621/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4622
4623static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004624gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004625{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 char **pch;
4627 PyObject *rtn_tuple = (PyObject *)NULL;
4628 PyObject *name_list = (PyObject *)NULL;
4629 PyObject *addr_list = (PyObject *)NULL;
4630 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004631 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 if (h == NULL) {
4634 /* Let's get real error message to return */
4635 set_herror(h_errno);
4636 return NULL;
4637 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 if (h->h_addrtype != af) {
4640 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004641 errno = EAFNOSUPPORT;
4642 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 return NULL;
4644 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 case AF_INET:
4649 if (alen < sizeof(struct sockaddr_in))
4650 return NULL;
4651 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004652
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004653#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 case AF_INET6:
4655 if (alen < sizeof(struct sockaddr_in6))
4656 return NULL;
4657 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004658#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 if ((name_list = PyList_New(0)) == NULL)
4663 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 if ((addr_list = PyList_New(0)) == NULL)
4666 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 /* SF #1511317: h_aliases can be NULL */
4669 if (h->h_aliases) {
4670 for (pch = h->h_aliases; *pch != NULL; pch++) {
4671 int status;
4672 tmp = PyUnicode_FromString(*pch);
4673 if (tmp == NULL)
4674 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 status = PyList_Append(name_list, tmp);
4677 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 if (status)
4680 goto err;
4681 }
4682 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4685 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 case AF_INET:
4690 {
4691 struct sockaddr_in sin;
4692 memset(&sin, 0, sizeof(sin));
4693 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004694#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004696#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4698 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 if (pch == h->h_addr_list && alen >= sizeof(sin))
4701 memcpy((char *) addr, &sin, sizeof(sin));
4702 break;
4703 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004704
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004705#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 case AF_INET6:
4707 {
4708 struct sockaddr_in6 sin6;
4709 memset(&sin6, 0, sizeof(sin6));
4710 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004711#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4715 tmp = makeipaddr((struct sockaddr *)&sin6,
4716 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4719 memcpy((char *) addr, &sin6, sizeof(sin6));
4720 break;
4721 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004722#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004725 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 "unsupported address family");
4727 return NULL;
4728 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 if (tmp == NULL)
4731 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 status = PyList_Append(addr_list, tmp);
4734 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 if (status)
4737 goto err;
4738 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004739
Victor Stinner72400302016-01-28 15:41:01 +01004740 name = sock_decode_hostname(h->h_name);
4741 if (name == NULL)
4742 goto err;
4743 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004744
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004745 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 Py_XDECREF(name_list);
4747 Py_XDECREF(addr_list);
4748 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004749}
4750
4751
4752/* Python interface to gethostbyname_ex(name). */
4753
4754/*ARGSUSED*/
4755static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004756socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004757{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 char *name;
4759 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004760 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004762 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004763#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004765#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 char buf[16384];
4769 int buf_len = (sizeof buf) - 1;
4770 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004771#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004772#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004774#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004775#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004776
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004777 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004779 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004780 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004782#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004783#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004784 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004786#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004788#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 memset((void *) &data, '\0', sizeof(data));
4790 result = gethostbyname_r(name, &hp_allocated, &data);
4791 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004792#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004793#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004794#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004797 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004798#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 Py_END_ALLOW_THREADS
4800 /* Some C libraries would require addr.__ss_family instead of
4801 addr.ss_family.
4802 Therefore, we cast the sockaddr_storage into sockaddr to
4803 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004804 sa = SAS2SA(&addr);
4805 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004807#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004809#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004810finally:
4811 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004813}
4814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004815PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004816"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4817\n\
4818Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004819for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004820
4821
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004822/* Python interface to gethostbyaddr(IP). */
4823
4824/*ARGSUSED*/
4825static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004826socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004827{
Charles-François Natali8b759652011-12-23 16:44:51 +01004828 sock_addr_t addr;
4829 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830 char *ip_num;
4831 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004832 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004833#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004835#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004837#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 /* glibcs up to 2.10 assume that the buf argument to
4839 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4840 does not ensure. The attribute below instructs the compiler
4841 to maintain this alignment. */
4842 char buf[16384] Py_ALIGNED(8);
4843 int buf_len = (sizeof buf) - 1;
4844 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004845#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004846#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004848#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004849#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 char *ap;
4851 int al;
4852 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004853
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004854 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 return NULL;
4856 af = AF_UNSPEC;
4857 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004858 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 af = sa->sa_family;
4860 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004861 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 switch (af) {
4863 case AF_INET:
4864 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4865 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4866 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004867#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 case AF_INET6:
4869 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4870 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4871 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004874 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004875 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 }
4877 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004878#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004879#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004880 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 &hp_allocated, buf, buf_len,
4882 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004883#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 h = gethostbyaddr_r(ap, al, af,
4885 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004886#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 memset((void *) &data, '\0', sizeof(data));
4888 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4889 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004890#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004891#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004892#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004893 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004896#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004898 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004899#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004901#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004902finally:
4903 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004905}
4906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004907PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004908"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4909\n\
4910Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004911for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004912
Guido van Rossum30a685f1991-06-27 15:51:29 +00004913
4914/* Python interface to getservbyname(name).
4915 This only returns the port number, since the other info is already
4916 known or not useful (like the list of aliases). */
4917
4918/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004919static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004920socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 char *name, *proto=NULL;
4923 struct servent *sp;
4924 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4925 return NULL;
4926 Py_BEGIN_ALLOW_THREADS
4927 sp = getservbyname(name, proto);
4928 Py_END_ALLOW_THREADS
4929 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004930 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004931 return NULL;
4932 }
4933 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004934}
4935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004936PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004937"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004938\n\
4939Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004940The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4941otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004942
Guido van Rossum30a685f1991-06-27 15:51:29 +00004943
Barry Warsaw11b91a02004-06-28 00:50:43 +00004944/* Python interface to getservbyport(port).
4945 This only returns the service name, since the other info is already
4946 known or not useful (like the list of aliases). */
4947
4948/*ARGSUSED*/
4949static PyObject *
4950socket_getservbyport(PyObject *self, PyObject *args)
4951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 int port;
4953 char *proto=NULL;
4954 struct servent *sp;
4955 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4956 return NULL;
4957 if (port < 0 || port > 0xffff) {
4958 PyErr_SetString(
4959 PyExc_OverflowError,
4960 "getservbyport: port must be 0-65535.");
4961 return NULL;
4962 }
4963 Py_BEGIN_ALLOW_THREADS
4964 sp = getservbyport(htons((short)port), proto);
4965 Py_END_ALLOW_THREADS
4966 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004967 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 return NULL;
4969 }
4970 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004971}
4972
4973PyDoc_STRVAR(getservbyport_doc,
4974"getservbyport(port[, protocolname]) -> string\n\
4975\n\
4976Return the service name from a port number and protocol name.\n\
4977The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4978otherwise any protocol will match.");
4979
Guido van Rossum3901d851996-12-19 16:35:04 +00004980/* Python interface to getprotobyname(name).
4981 This only returns the protocol number, since the other info is
4982 already known or not useful (like the list of aliases). */
4983
4984/*ARGSUSED*/
4985static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004986socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 char *name;
4989 struct protoent *sp;
4990 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4991 return NULL;
4992 Py_BEGIN_ALLOW_THREADS
4993 sp = getprotobyname(name);
4994 Py_END_ALLOW_THREADS
4995 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004996 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 return NULL;
4998 }
4999 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00005000}
5001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005002PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005003"getprotobyname(name) -> integer\n\
5004\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005005Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005006
Guido van Rossum3901d851996-12-19 16:35:04 +00005007
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005008#ifndef NO_DUP
5009/* dup() function for socket fds */
5010
5011static PyObject *
5012socket_dup(PyObject *self, PyObject *fdobj)
5013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 SOCKET_T fd, newfd;
5015 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005016#ifdef MS_WINDOWS
5017 WSAPROTOCOL_INFO info;
5018#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 fd = PyLong_AsSocket_t(fdobj);
5021 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5022 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005023
Victor Stinnerdaf45552013-08-28 00:53:59 +02005024#ifdef MS_WINDOWS
5025 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5026 return set_error();
5027
5028 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5029 FROM_PROTOCOL_INFO,
5030 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005031 if (newfd == INVALID_SOCKET)
5032 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005033
Victor Stinnerdaf45552013-08-28 00:53:59 +02005034 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5035 closesocket(newfd);
5036 PyErr_SetFromWindowsErr(0);
5037 return NULL;
5038 }
5039#else
5040 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5041 newfd = _Py_dup(fd);
5042 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005043 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005044#endif
5045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 newfdobj = PyLong_FromSocket_t(newfd);
5047 if (newfdobj == NULL)
5048 SOCKETCLOSE(newfd);
5049 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005050}
5051
5052PyDoc_STRVAR(dup_doc,
5053"dup(integer) -> integer\n\
5054\n\
5055Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5056sockets; on some platforms os.dup() won't work for socket file descriptors.");
5057#endif
5058
5059
Dave Cole331708b2004-08-09 04:51:41 +00005060#ifdef HAVE_SOCKETPAIR
5061/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005062 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005063 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005064
5065/*ARGSUSED*/
5066static PyObject *
5067socket_socketpair(PyObject *self, PyObject *args)
5068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 PySocketSockObject *s0 = NULL, *s1 = NULL;
5070 SOCKET_T sv[2];
5071 int family, type = SOCK_STREAM, proto = 0;
5072 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005073#ifdef SOCK_CLOEXEC
5074 int *atomic_flag_works = &sock_cloexec_works;
5075#else
5076 int *atomic_flag_works = NULL;
5077#endif
5078 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005079
5080#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005082#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005084#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5086 &family, &type, &proto))
5087 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005090 Py_BEGIN_ALLOW_THREADS
5091#ifdef SOCK_CLOEXEC
5092 if (sock_cloexec_works != 0) {
5093 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5094 if (sock_cloexec_works == -1) {
5095 if (ret >= 0) {
5096 sock_cloexec_works = 1;
5097 }
5098 else if (errno == EINVAL) {
5099 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5100 sock_cloexec_works = 0;
5101 ret = socketpair(family, type, proto, sv);
5102 }
5103 }
5104 }
5105 else
5106#endif
5107 {
5108 ret = socketpair(family, type, proto, sv);
5109 }
5110 Py_END_ALLOW_THREADS
5111
5112 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005114
5115 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5116 goto finally;
5117 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5118 goto finally;
5119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 s0 = new_sockobject(sv[0], family, type, proto);
5121 if (s0 == NULL)
5122 goto finally;
5123 s1 = new_sockobject(sv[1], family, type, proto);
5124 if (s1 == NULL)
5125 goto finally;
5126 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005127
5128finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 if (res == NULL) {
5130 if (s0 == NULL)
5131 SOCKETCLOSE(sv[0]);
5132 if (s1 == NULL)
5133 SOCKETCLOSE(sv[1]);
5134 }
5135 Py_XDECREF(s0);
5136 Py_XDECREF(s1);
5137 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005138}
5139
5140PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005141"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005142\n\
5143Create a pair of socket objects from the sockets returned by the platform\n\
5144socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005145The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005146AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005147
5148#endif /* HAVE_SOCKETPAIR */
5149
5150
Guido van Rossum006bf911996-06-12 04:04:55 +00005151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005152socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005154 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5157 return NULL;
5158 }
5159 if (x1 < 0) {
5160 PyErr_SetString(PyExc_OverflowError,
5161 "can't convert negative number to unsigned long");
5162 return NULL;
5163 }
5164 x2 = (unsigned int)ntohs((unsigned short)x1);
5165 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005166}
5167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005168PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005169"ntohs(integer) -> integer\n\
5170\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005171Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005172
5173
Guido van Rossum006bf911996-06-12 04:04:55 +00005174static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005175socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005176{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 if (PyLong_Check(arg)) {
5180 x = PyLong_AsUnsignedLong(arg);
5181 if (x == (unsigned long) -1 && PyErr_Occurred())
5182 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005183#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 {
5185 unsigned long y;
5186 /* only want the trailing 32 bits */
5187 y = x & 0xFFFFFFFFUL;
5188 if (y ^ x)
5189 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005190 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 x = y;
5192 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005193#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005194 }
5195 else
5196 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005197 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005198 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005200}
5201
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005202PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005203"ntohl(integer) -> integer\n\
5204\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005205Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005206
5207
Guido van Rossum006bf911996-06-12 04:04:55 +00005208static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005209socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5214 return NULL;
5215 }
5216 if (x1 < 0) {
5217 PyErr_SetString(PyExc_OverflowError,
5218 "can't convert negative number to unsigned long");
5219 return NULL;
5220 }
5221 x2 = (unsigned int)htons((unsigned short)x1);
5222 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005223}
5224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005225PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005226"htons(integer) -> integer\n\
5227\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005228Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005229
5230
Guido van Rossum006bf911996-06-12 04:04:55 +00005231static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005232socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 if (PyLong_Check(arg)) {
5237 x = PyLong_AsUnsignedLong(arg);
5238 if (x == (unsigned long) -1 && PyErr_Occurred())
5239 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005240#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 {
5242 unsigned long y;
5243 /* only want the trailing 32 bits */
5244 y = x & 0xFFFFFFFFUL;
5245 if (y ^ x)
5246 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005247 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005248 x = y;
5249 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005250#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 }
5252 else
5253 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005254 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 Py_TYPE(arg)->tp_name);
5256 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005257}
5258
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005259PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005260"htonl(integer) -> integer\n\
5261\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005262Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005263
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005264/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005265
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005266PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005267"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005268\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005269Convert 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 +00005270binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005271
5272static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005273socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005274{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005275#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005277#endif
5278
5279#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005280#if (SIZEOF_INT != 4)
5281#error "Not sure if in_addr_t exists and int is not 32-bits."
5282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 /* Have to use inet_addr() instead */
5284 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5289 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005290
Tim Peters1df9fdd2003-02-13 03:13:40 +00005291
5292#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005293
5294#ifdef USE_INET_ATON_WEAKLINK
5295 if (inet_aton != NULL) {
5296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 if (inet_aton(ip_addr, &buf))
5298 return PyBytes_FromStringAndSize((char *)(&buf),
5299 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005300
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005301 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 "illegal IP address string passed to inet_aton");
5303 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005304
Thomas Wouters477c8d52006-05-27 19:21:47 +00005305#ifdef USE_INET_ATON_WEAKLINK
5306 } else {
5307#endif
5308
5309#endif
5310
5311#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 /* special-case this address as inet_addr might return INADDR_NONE
5314 * for this */
5315 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005316 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005322 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005323 "illegal IP address string passed to inet_aton");
5324 return NULL;
5325 }
5326 }
5327 return PyBytes_FromStringAndSize((char *) &packed_addr,
5328 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005329
5330#ifdef USE_INET_ATON_WEAKLINK
5331 }
5332#endif
5333
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005334#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005335}
5336
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005337PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005338"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005339\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005340Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005341
5342static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005343socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005344{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005345 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005347
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005348 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 return NULL;
5350 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005351
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005352 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005353 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005355 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 return NULL;
5357 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005358
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005359 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5360 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005363}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005364
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005365#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005366
5367PyDoc_STRVAR(inet_pton_doc,
5368"inet_pton(af, ip) -> packed IP address string\n\
5369\n\
5370Convert an IP address from string format to a packed string suitable\n\
5371for use with low-level network functions.");
5372
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005373#endif
5374
5375#ifdef HAVE_INET_PTON
5376
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005377static PyObject *
5378socket_inet_pton(PyObject *self, PyObject *args)
5379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 int af;
5381 char* ip;
5382 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005383#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005384 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005385#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5389 return NULL;
5390 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005391
Martin v. Löwis04697e82004-06-02 12:35:29 +00005392#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005394 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 "can't use AF_INET6, IPv6 is disabled");
5396 return NULL;
5397 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005398#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 retval = inet_pton(af, ip, packed);
5401 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005402 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 return NULL;
5404 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005405 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 "illegal IP address string passed to inet_pton");
5407 return NULL;
5408 } else if (af == AF_INET) {
5409 return PyBytes_FromStringAndSize(packed,
5410 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005411#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 } else if (af == AF_INET6) {
5413 return PyBytes_FromStringAndSize(packed,
5414 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005417 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 return NULL;
5419 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005420}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005421#elif defined(MS_WINDOWS)
5422
5423static PyObject *
5424socket_inet_pton(PyObject *self, PyObject *args)
5425{
5426 int af;
5427 char* ip;
5428 struct sockaddr_in6 addr;
5429 INT ret, size;
5430
5431 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5432 return NULL;
5433 }
5434
Victor Stinnere990c6e2013-11-16 00:18:58 +01005435 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005436 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5437
5438 if (ret) {
5439 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5440 return NULL;
5441 } else if(af == AF_INET) {
5442 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005443 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005444 sizeof(addr4->sin_addr));
5445 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005446 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005447 sizeof(addr.sin6_addr));
5448 } else {
5449 PyErr_SetString(PyExc_OSError, "unknown address family");
5450 return NULL;
5451 }
5452}
5453
5454#endif
5455
5456#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005457
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005458PyDoc_STRVAR(inet_ntop_doc,
5459"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5460\n\
5461Convert a packed IP address of the given family to string format.");
5462
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005463#endif
5464
5465
5466#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005467static PyObject *
5468socket_inet_ntop(PyObject *self, PyObject *args)
5469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005471 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005473#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005474 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005477#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005479 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5480 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005481
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005482 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 return NULL;
5484 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005487 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 PyErr_SetString(PyExc_ValueError,
5489 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005490 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005491 return NULL;
5492 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005493#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005495 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 PyErr_SetString(PyExc_ValueError,
5497 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005498 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 return NULL;
5500 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 } else {
5503 PyErr_Format(PyExc_ValueError,
5504 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005505 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 return NULL;
5507 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005508
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005509 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5510 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005512 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 return NULL;
5514 } else {
5515 return PyUnicode_FromString(retval);
5516 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005517}
5518
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005519#elif defined(MS_WINDOWS)
5520
5521static PyObject *
5522socket_inet_ntop(PyObject *self, PyObject *args)
5523{
5524 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005525 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005526 struct sockaddr_in6 addr;
5527 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005528#ifdef ENABLE_IPV6
5529 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5530#else
5531 char ip[INET_ADDRSTRLEN + 1];
5532#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005533
5534 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5535 memset((void *) &ip[0], '\0', sizeof(ip));
5536
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005537 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005538 return NULL;
5539 }
5540
5541 if (af == AF_INET) {
5542 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5543
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005544 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005545 PyErr_SetString(PyExc_ValueError,
5546 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005547 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005548 return NULL;
5549 }
5550 memset(addr4, 0, sizeof(struct sockaddr_in));
5551 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005552 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005553 addrlen = sizeof(struct sockaddr_in);
5554 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005555 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005556 PyErr_SetString(PyExc_ValueError,
5557 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005558 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005559 return NULL;
5560 }
5561
5562 memset(&addr, 0, sizeof(addr));
5563 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005564 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005565 addrlen = sizeof(addr);
5566 } else {
5567 PyErr_Format(PyExc_ValueError,
5568 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005569 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005570 return NULL;
5571 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005572 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005573
5574 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005575 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005576 ip, &retlen);
5577
5578 if (ret) {
5579 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5580 return NULL;
5581 } else {
5582 return PyUnicode_FromString(ip);
5583 }
5584}
5585
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005586#endif /* HAVE_INET_PTON */
5587
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005588/* Python interface to getaddrinfo(host, port). */
5589
5590/*ARGSUSED*/
5591static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005592socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005593{
Victor Stinner77af1722011-05-26 14:05:59 +02005594 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005595 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 struct addrinfo hints, *res;
5597 struct addrinfo *res0 = NULL;
5598 PyObject *hobj = NULL;
5599 PyObject *pobj = (PyObject *)NULL;
5600 char pbuf[30];
5601 char *hptr, *pptr;
5602 int family, socktype, protocol, flags;
5603 int error;
5604 PyObject *all = (PyObject *)NULL;
5605 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005606
Georg Brandl6083a4b2013-10-14 06:51:46 +02005607 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005609 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005610 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 &protocol, &flags)) {
5612 return NULL;
5613 }
5614 if (hobj == Py_None) {
5615 hptr = NULL;
5616 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005617 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 if (!idna)
5619 return NULL;
5620 assert(PyBytes_Check(idna));
5621 hptr = PyBytes_AS_STRING(idna);
5622 } else if (PyBytes_Check(hobj)) {
5623 hptr = PyBytes_AsString(hobj);
5624 } else {
5625 PyErr_SetString(PyExc_TypeError,
5626 "getaddrinfo() argument 1 must be string or None");
5627 return NULL;
5628 }
5629 if (PyLong_CheckExact(pobj)) {
5630 long value = PyLong_AsLong(pobj);
5631 if (value == -1 && PyErr_Occurred())
5632 goto err;
5633 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5634 pptr = pbuf;
5635 } else if (PyUnicode_Check(pobj)) {
5636 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005637 if (pptr == NULL)
5638 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005640 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 } else if (pobj == Py_None) {
5642 pptr = (char *)NULL;
5643 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005644 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 goto err;
5646 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005647#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005648 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5649 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005650 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5651 * This workaround avoids a segfault in libsystem.
5652 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005653 pptr = "00";
5654 }
5655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 memset(&hints, 0, sizeof(hints));
5657 hints.ai_family = family;
5658 hints.ai_socktype = socktype;
5659 hints.ai_protocol = protocol;
5660 hints.ai_flags = flags;
5661 Py_BEGIN_ALLOW_THREADS
5662 ACQUIRE_GETADDRINFO_LOCK
5663 error = getaddrinfo(hptr, pptr, &hints, &res0);
5664 Py_END_ALLOW_THREADS
5665 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5666 if (error) {
5667 set_gaierror(error);
5668 goto err;
5669 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005670
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005671 all = PyList_New(0);
5672 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 goto err;
5674 for (res = res0; res; res = res->ai_next) {
5675 PyObject *single;
5676 PyObject *addr =
5677 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5678 if (addr == NULL)
5679 goto err;
5680 single = Py_BuildValue("iiisO", res->ai_family,
5681 res->ai_socktype, res->ai_protocol,
5682 res->ai_canonname ? res->ai_canonname : "",
5683 addr);
5684 Py_DECREF(addr);
5685 if (single == NULL)
5686 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 if (PyList_Append(all, single))
5689 goto err;
5690 Py_XDECREF(single);
5691 }
5692 Py_XDECREF(idna);
5693 if (res0)
5694 freeaddrinfo(res0);
5695 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005696 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 Py_XDECREF(all);
5698 Py_XDECREF(idna);
5699 if (res0)
5700 freeaddrinfo(res0);
5701 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005702}
5703
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005704PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005705"getaddrinfo(host, port [, family, type, proto, flags])\n\
5706 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005707\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005708Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005709
5710/* Python interface to getnameinfo(sa, flags). */
5711
5712/*ARGSUSED*/
5713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005714socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005716 PyObject *sa = (PyObject *)NULL;
5717 int flags;
5718 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005719 int port;
5720 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5722 struct addrinfo hints, *res = NULL;
5723 int error;
5724 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005725 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 flags = flowinfo = scope_id = 0;
5728 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5729 return NULL;
5730 if (!PyTuple_Check(sa)) {
5731 PyErr_SetString(PyExc_TypeError,
5732 "getnameinfo() argument 1 must be a tuple");
5733 return NULL;
5734 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005735 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005736 &hostp, &port, &flowinfo, &scope_id))
5737 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005738 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005739 PyErr_SetString(PyExc_OverflowError,
5740 "getsockaddrarg: flowinfo must be 0-1048575.");
5741 return NULL;
5742 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5744 memset(&hints, 0, sizeof(hints));
5745 hints.ai_family = AF_UNSPEC;
5746 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005747 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005748 Py_BEGIN_ALLOW_THREADS
5749 ACQUIRE_GETADDRINFO_LOCK
5750 error = getaddrinfo(hostp, pbuf, &hints, &res);
5751 Py_END_ALLOW_THREADS
5752 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5753 if (error) {
5754 set_gaierror(error);
5755 goto fail;
5756 }
5757 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005758 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 "sockaddr resolved to multiple addresses");
5760 goto fail;
5761 }
5762 switch (res->ai_family) {
5763 case AF_INET:
5764 {
5765 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005766 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005767 "IPv4 sockaddr must be 2 tuple");
5768 goto fail;
5769 }
5770 break;
5771 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005772#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005773 case AF_INET6:
5774 {
5775 struct sockaddr_in6 *sin6;
5776 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005777 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 sin6->sin6_scope_id = scope_id;
5779 break;
5780 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005783 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005784 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5785 if (error) {
5786 set_gaierror(error);
5787 goto fail;
5788 }
Victor Stinner72400302016-01-28 15:41:01 +01005789
5790 name = sock_decode_hostname(hbuf);
5791 if (name == NULL)
5792 goto fail;
5793 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005794
5795fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005796 if (res)
5797 freeaddrinfo(res);
5798 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005799}
5800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005801PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005802"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005803\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005804Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005805
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005806
5807/* Python API to getting and setting the default timeout value. */
5808
5809static PyObject *
5810socket_getdefaulttimeout(PyObject *self)
5811{
Victor Stinner71694d52015-03-28 01:18:54 +01005812 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 Py_INCREF(Py_None);
5814 return Py_None;
5815 }
Victor Stinner71694d52015-03-28 01:18:54 +01005816 else {
5817 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5818 return PyFloat_FromDouble(seconds);
5819 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005820}
5821
5822PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005823"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005824\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005825Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005826A value of None indicates that new socket objects have no timeout.\n\
5827When the socket module is first imported, the default is None.");
5828
5829static PyObject *
5830socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5831{
Victor Stinner71694d52015-03-28 01:18:54 +01005832 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005833
Victor Stinner71694d52015-03-28 01:18:54 +01005834 if (socket_parse_timeout(&timeout, arg) < 0)
5835 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 Py_INCREF(Py_None);
5840 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005841}
5842
5843PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005844"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005845\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005846Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005847A value of None indicates that new socket objects have no timeout.\n\
5848When the socket module is first imported, the default is None.");
5849
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005850#ifdef HAVE_IF_NAMEINDEX
5851/* Python API for getting interface indices and names */
5852
5853static PyObject *
5854socket_if_nameindex(PyObject *self, PyObject *arg)
5855{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005856 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005857 int i;
5858 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005859
Charles-François Natali60713592011-05-20 16:55:06 +02005860 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005861 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005862 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005863 return NULL;
5864 }
5865
5866 list = PyList_New(0);
5867 if (list == NULL) {
5868 if_freenameindex(ni);
5869 return NULL;
5870 }
5871
Charles-François Natali60713592011-05-20 16:55:06 +02005872 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5873 PyObject *ni_tuple = Py_BuildValue("IO&",
5874 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005875
5876 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5877 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005878 Py_DECREF(list);
5879 if_freenameindex(ni);
5880 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005881 }
5882 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005883 }
5884
5885 if_freenameindex(ni);
5886 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005887}
5888
5889PyDoc_STRVAR(if_nameindex_doc,
5890"if_nameindex()\n\
5891\n\
5892Returns a list of network interface information (index, name) tuples.");
5893
Charles-François Natali60713592011-05-20 16:55:06 +02005894static PyObject *
5895socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005896{
Charles-François Natali60713592011-05-20 16:55:06 +02005897 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005898 unsigned long index;
5899
Charles-François Natali60713592011-05-20 16:55:06 +02005900 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5901 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005902 return NULL;
5903
Charles-François Natali60713592011-05-20 16:55:06 +02005904 index = if_nametoindex(PyBytes_AS_STRING(oname));
5905 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005906 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005907 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005908 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005909 return NULL;
5910 }
5911
5912 return PyLong_FromUnsignedLong(index);
5913}
5914
5915PyDoc_STRVAR(if_nametoindex_doc,
5916"if_nametoindex(if_name)\n\
5917\n\
5918Returns the interface index corresponding to the interface name if_name.");
5919
Charles-François Natali60713592011-05-20 16:55:06 +02005920static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005921socket_if_indextoname(PyObject *self, PyObject *arg)
5922{
Charles-François Natali60713592011-05-20 16:55:06 +02005923 unsigned long index;
5924 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005925
Charles-François Natali60713592011-05-20 16:55:06 +02005926 index = PyLong_AsUnsignedLong(arg);
5927 if (index == (unsigned long) -1)
5928 return NULL;
5929
5930 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005931 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005932 return NULL;
5933 }
5934
Charles-François Natali60713592011-05-20 16:55:06 +02005935 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005936}
5937
5938PyDoc_STRVAR(if_indextoname_doc,
5939"if_indextoname(if_index)\n\
5940\n\
5941Returns the interface name corresponding to the interface index if_index.");
5942
5943#endif /* HAVE_IF_NAMEINDEX */
5944
5945
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005946#ifdef CMSG_LEN
5947/* Python interface to CMSG_LEN(length). */
5948
5949static PyObject *
5950socket_CMSG_LEN(PyObject *self, PyObject *args)
5951{
5952 Py_ssize_t length;
5953 size_t result;
5954
5955 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5956 return NULL;
5957 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5958 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5959 return NULL;
5960 }
5961 return PyLong_FromSize_t(result);
5962}
5963
5964PyDoc_STRVAR(CMSG_LEN_doc,
5965"CMSG_LEN(length) -> control message length\n\
5966\n\
5967Return the total length, without trailing padding, of an ancillary\n\
5968data item with associated data of the given length. This value can\n\
5969often be used as the buffer size for recvmsg() to receive a single\n\
5970item of ancillary data, but RFC 3542 requires portable applications to\n\
5971use CMSG_SPACE() and thus include space for padding, even when the\n\
5972item will be the last in the buffer. Raises OverflowError if length\n\
5973is outside the permissible range of values.");
5974
5975
5976#ifdef CMSG_SPACE
5977/* Python interface to CMSG_SPACE(length). */
5978
5979static PyObject *
5980socket_CMSG_SPACE(PyObject *self, PyObject *args)
5981{
5982 Py_ssize_t length;
5983 size_t result;
5984
5985 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5986 return NULL;
5987 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5988 PyErr_SetString(PyExc_OverflowError,
5989 "CMSG_SPACE() argument out of range");
5990 return NULL;
5991 }
5992 return PyLong_FromSize_t(result);
5993}
5994
5995PyDoc_STRVAR(CMSG_SPACE_doc,
5996"CMSG_SPACE(length) -> buffer size\n\
5997\n\
5998Return the buffer size needed for recvmsg() to receive an ancillary\n\
5999data item with associated data of the given length, along with any\n\
6000trailing padding. The buffer space needed to receive multiple items\n\
6001is the sum of the CMSG_SPACE() values for their associated data\n\
6002lengths. Raises OverflowError if length is outside the permissible\n\
6003range of values.");
6004#endif /* CMSG_SPACE */
6005#endif /* CMSG_LEN */
6006
6007
Guido van Rossum30a685f1991-06-27 15:51:29 +00006008/* List of functions exported by this module. */
6009
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006010static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011 {"gethostbyname", socket_gethostbyname,
6012 METH_VARARGS, gethostbyname_doc},
6013 {"gethostbyname_ex", socket_gethostbyname_ex,
6014 METH_VARARGS, ghbn_ex_doc},
6015 {"gethostbyaddr", socket_gethostbyaddr,
6016 METH_VARARGS, gethostbyaddr_doc},
6017 {"gethostname", socket_gethostname,
6018 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006019#ifdef HAVE_SETHOSTNAME
6020 {"sethostname", socket_sethostname,
6021 METH_VARARGS, sethostname_doc},
6022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 {"getservbyname", socket_getservbyname,
6024 METH_VARARGS, getservbyname_doc},
6025 {"getservbyport", socket_getservbyport,
6026 METH_VARARGS, getservbyport_doc},
6027 {"getprotobyname", socket_getprotobyname,
6028 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006029#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 {"dup", socket_dup,
6031 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006032#endif
Dave Cole331708b2004-08-09 04:51:41 +00006033#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034 {"socketpair", socket_socketpair,
6035 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 {"ntohs", socket_ntohs,
6038 METH_VARARGS, ntohs_doc},
6039 {"ntohl", socket_ntohl,
6040 METH_O, ntohl_doc},
6041 {"htons", socket_htons,
6042 METH_VARARGS, htons_doc},
6043 {"htonl", socket_htonl,
6044 METH_O, htonl_doc},
6045 {"inet_aton", socket_inet_aton,
6046 METH_VARARGS, inet_aton_doc},
6047 {"inet_ntoa", socket_inet_ntoa,
6048 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006049#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 {"inet_pton", socket_inet_pton,
6051 METH_VARARGS, inet_pton_doc},
6052 {"inet_ntop", socket_inet_ntop,
6053 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006054#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006055 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6056 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 {"getnameinfo", socket_getnameinfo,
6058 METH_VARARGS, getnameinfo_doc},
6059 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6060 METH_NOARGS, getdefaulttimeout_doc},
6061 {"setdefaulttimeout", socket_setdefaulttimeout,
6062 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006063#ifdef HAVE_IF_NAMEINDEX
6064 {"if_nameindex", socket_if_nameindex,
6065 METH_NOARGS, if_nameindex_doc},
6066 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006067 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006068 {"if_indextoname", socket_if_indextoname,
6069 METH_O, if_indextoname_doc},
6070#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006071#ifdef CMSG_LEN
6072 {"CMSG_LEN", socket_CMSG_LEN,
6073 METH_VARARGS, CMSG_LEN_doc},
6074#ifdef CMSG_SPACE
6075 {"CMSG_SPACE", socket_CMSG_SPACE,
6076 METH_VARARGS, CMSG_SPACE_doc},
6077#endif
6078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006080};
6081
Guido van Rossum30a685f1991-06-27 15:51:29 +00006082
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006083#ifdef MS_WINDOWS
6084#define OS_INIT_DEFINED
6085
6086/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006087
6088static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006089os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006092}
6093
6094static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006095os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006097 WSADATA WSAData;
6098 int ret;
6099 ret = WSAStartup(0x0101, &WSAData);
6100 switch (ret) {
6101 case 0: /* No error */
6102 Py_AtExit(os_cleanup);
6103 return 1; /* Success */
6104 case WSASYSNOTREADY:
6105 PyErr_SetString(PyExc_ImportError,
6106 "WSAStartup failed: network not ready");
6107 break;
6108 case WSAVERNOTSUPPORTED:
6109 case WSAEINVAL:
6110 PyErr_SetString(
6111 PyExc_ImportError,
6112 "WSAStartup failed: requested version not supported");
6113 break;
6114 default:
6115 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6116 break;
6117 }
6118 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006119}
6120
Guido van Rossum8d665e61996-06-26 18:22:49 +00006121#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006122
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006123
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006124
6125#ifndef OS_INIT_DEFINED
6126static int
6127os_init(void)
6128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006130}
6131#endif
6132
6133
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006134/* C API table - always add new things to the end for binary
6135 compatibility. */
6136static
6137PySocketModule_APIObject PySocketModuleAPI =
6138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006140 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006142};
6143
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006144
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006145/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006146
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006147 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006148 "socket.py" which implements some additional functionality.
6149 The import of "_socket" may fail with an ImportError exception if
6150 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006151 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006152 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006153*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006154
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006155PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006156"Implementation module for socket operations.\n\
6157\n\
6158See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006159
Martin v. Löwis1a214512008-06-11 05:26:20 +00006160static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 PyModuleDef_HEAD_INIT,
6162 PySocket_MODULE_NAME,
6163 socket_doc,
6164 -1,
6165 socket_methods,
6166 NULL,
6167 NULL,
6168 NULL,
6169 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006170};
6171
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006172PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006173PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177 if (!os_init())
6178 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006179
Victor Stinnerdaf45552013-08-28 00:53:59 +02006180#ifdef MS_WINDOWS
6181 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006182#if defined(_MSC_VER) && _MSC_VER >= 1800
6183 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6184#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006185 DWORD version = GetVersion();
6186 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6187 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6188 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006189 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6190#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006191 }
6192#endif
6193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 Py_TYPE(&sock_type) = &PyType_Type;
6195 m = PyModule_Create(&socketmodule);
6196 if (m == NULL)
6197 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006198
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006199 Py_INCREF(PyExc_OSError);
6200 PySocketModuleAPI.error = PyExc_OSError;
6201 Py_INCREF(PyExc_OSError);
6202 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006204 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 if (socket_herror == NULL)
6206 return NULL;
6207 Py_INCREF(socket_herror);
6208 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006209 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 NULL);
6211 if (socket_gaierror == NULL)
6212 return NULL;
6213 Py_INCREF(socket_gaierror);
6214 PyModule_AddObject(m, "gaierror", socket_gaierror);
6215 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006216 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 if (socket_timeout == NULL)
6218 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006219 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 Py_INCREF(socket_timeout);
6221 PyModule_AddObject(m, "timeout", socket_timeout);
6222 Py_INCREF((PyObject *)&sock_type);
6223 if (PyModule_AddObject(m, "SocketType",
6224 (PyObject *)&sock_type) != 0)
6225 return NULL;
6226 Py_INCREF((PyObject *)&sock_type);
6227 if (PyModule_AddObject(m, "socket",
6228 (PyObject *)&sock_type) != 0)
6229 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006230
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006231#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006233#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236 Py_INCREF(has_ipv6);
6237 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 /* Export C API */
6240 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6241 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6242 ) != 0)
6243 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006246#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006248#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, AF_INET);
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006250#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006251 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006252#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006253#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006255 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006256#endif
6257#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006258 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006259#endif
6260#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006263#endif
6264#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006265 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006266 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006267#endif
6268#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006271#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006272#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006274 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006275#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006276#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006277 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006278 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006279#endif
6280#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006283#endif
6284#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006286#endif
6287#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006290#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006291#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006293 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006294#endif
6295#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006298#endif
6299#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006302#endif
6303#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006305 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006306#endif
6307#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006308 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, AF_NETLINK);
6310 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006311#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006313#endif
6314#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006315 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006316#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006317 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6318 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006319#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006321#endif
6322#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006324#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006325#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006327#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006328#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006330#endif
6331#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006333#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006334 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006335#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006336 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006337#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006338#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006339 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006340#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006341#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006342#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006345#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006346#ifdef AF_LINK
6347 PyModule_AddIntMacro(m, AF_LINK);
6348#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006349#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006350 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006351 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006352#endif
6353#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006355 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006356#endif
6357#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006359 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006360#endif
6361#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006363 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006364#endif
6365#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006366 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006367 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006368#endif
6369#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006371 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006372#endif
6373#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006375 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006376#endif
6377#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006380#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006381
Hye-Shik Chang81268602004-02-02 06:05:24 +00006382#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6384 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6385 PyModule_AddIntMacro(m, BTPROTO_HCI);
6386 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006387#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006388 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006389#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006390#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006391#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006393#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006394 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6395 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006396#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6399 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006400#endif
6401
Charles-François Natali47413c12011-10-06 19:47:44 +02006402#ifdef AF_CAN
6403 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006404 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006405#endif
6406#ifdef PF_CAN
6407 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006409#endif
6410
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006411/* Reliable Datagram Sockets */
6412#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006413 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006414#endif
6415#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006417#endif
6418
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006419/* Kernel event messages */
6420#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006422#endif
6423#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006425#endif
6426
Antoine Pitroub156a462010-10-27 20:13:57 +00006427#ifdef AF_PACKET
6428 PyModule_AddIntMacro(m, AF_PACKET);
6429#endif
6430#ifdef PF_PACKET
6431 PyModule_AddIntMacro(m, PF_PACKET);
6432#endif
6433#ifdef PACKET_HOST
6434 PyModule_AddIntMacro(m, PACKET_HOST);
6435#endif
6436#ifdef PACKET_BROADCAST
6437 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6438#endif
6439#ifdef PACKET_MULTICAST
6440 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6441#endif
6442#ifdef PACKET_OTHERHOST
6443 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6444#endif
6445#ifdef PACKET_OUTGOING
6446 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6447#endif
6448#ifdef PACKET_LOOPBACK
6449 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6450#endif
6451#ifdef PACKET_FASTROUTE
6452 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006453#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006454
Christian Heimes043d6f62008-01-07 17:19:16 +00006455#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6460 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6461 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006462
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6464 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6465 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006468 PyModule_AddIntMacro(m, SOL_TIPC);
6469 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6470 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6471 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6472 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006473
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6475 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6476 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6477 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6481 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006482#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006485#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6487 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6488 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6489 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6490 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6491 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006492#endif
6493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, SOCK_STREAM);
6496 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006497/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, SOCK_RAW);
6499 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006500#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006502#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006503#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006505#endif
6506#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006508#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006517 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006518#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006519#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006521#endif
6522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006524 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006527 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006530 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006533 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006535#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006536 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006540#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006541#ifndef __GNU__
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006544#endif
doko@ubuntu.comfcff4372016-06-13 16:33:04 +02006545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006572#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006573#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006575#endif
6576#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006578#endif
6579#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006581#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006582#ifdef SO_BINDTODEVICE
6583 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6584#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006585#ifdef SO_PRIORITY
6586 PyModule_AddIntMacro(m, SO_PRIORITY);
6587#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006588#ifdef SO_MARK
6589 PyModule_AddIntMacro(m, SO_MARK);
6590#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592 /* Maximum number of connections for "listen" */
6593#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006595#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006597#endif
6598
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006599 /* Ancilliary message types */
6600#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006601 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006602#endif
6603#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006605#endif
6606#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006607 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006608#endif
6609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 /* Flags for send, recv */
6611#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006641#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006643#endif
6644#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006646#endif
6647#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006649#endif
6650#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006652#endif
6653#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006655#endif
6656#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006658#endif
6659#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006661#endif
6662#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006664#endif
6665#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006667#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006668#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006670#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* Protocol level and numbers, usable for [gs]etsockopt */
6673#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006678#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006690#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006705#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006706#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006708#endif
6709#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6711 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006712#endif
6713#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6715 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6716 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006717
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6719 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6720 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006721#endif
6722#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006723 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6724 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6725 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6726 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006727#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04006728#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
6729 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
6730#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006731#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006733 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6734 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6735 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6736 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6737 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6738 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6739 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6740 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6741 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6742 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6743 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6744 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6745#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006746#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006748#endif
6749#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006751#endif
6752#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006754#endif
6755#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006757#endif
6758#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006760#endif
6761#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006763#endif
6764#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006769#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006777#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006797#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006799#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006800#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006808#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006809 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006817#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006818 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006821 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006829#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006835#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006844#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006870#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006871#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006876#endif
6877/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006878#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006880#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006885#endif
6886
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006887#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006889#endif
6890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891 /* Some port configuration */
6892#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006894#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006899#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006901#endif
6902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006903 /* Some reserved IP v.4 addresses */
6904#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006906#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006907 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006911#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006912 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006914#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006916#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006921#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006923#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006924#ifdef INADDR_ALLHOSTS_GROUP
6925 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6926 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006927#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006932#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006934#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006937#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006938 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006939#endif
6940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 /* IPv4 [gs]etsockopt options */
6942#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006987#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006989#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006990#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006992#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006994 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6995#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006999 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007001#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007002 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007003#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007004#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007007#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007008 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007009#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007010#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007012#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007013 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007014#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007018#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007020#endif
7021#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007023#endif
7024#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007026#endif
7027#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007029#endif
7030#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007032#endif
7033#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007035#endif
7036#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007038#endif
7039#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007041#endif
7042#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007044#endif
7045#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007047#endif
7048#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007050#endif
7051#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007053#endif
7054#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007056#endif
7057#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007059#endif
7060#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007062#endif
7063#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007065#endif
7066#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007068#endif
7069#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007071#endif
7072#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007074#endif
7075#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007077#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007079 /* TCP options */
7080#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007089#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007101#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007106#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007110#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007113#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007115#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007116#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007118#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007120 /* IPX options */
7121#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007123#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007124
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007125/* Reliable Datagram Sockets */
7126#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007128#endif
7129#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007131#endif
7132#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007134#endif
7135#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007137#endif
7138#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007140#endif
7141#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007143#endif
7144#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007146#endif
7147#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007148 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007149#endif
7150#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007151 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007152#endif
7153#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007154 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007155#endif
7156#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007157 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007158#endif
7159#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007161#endif
7162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007164#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007166#endif
7167#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007169#endif
7170#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007172#endif
7173#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007175#endif
7176#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007178#endif
7179#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007181#endif
7182#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007184#endif
7185#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007187#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007188#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007190#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007191#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007193#endif
7194#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007196#endif
7197#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007199#endif
7200#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007202#endif
7203#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007205#endif
7206#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007208#endif
7209#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007211#endif
7212#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007214#endif
7215#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007217#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007218#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007220#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007221#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007223#endif
7224#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007226#endif
7227#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007229#endif
7230#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007232#endif
7233#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007235#endif
7236#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007238#endif
7239#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007241#endif
7242#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007244#endif
7245#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007247#endif
7248#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007250#endif
7251#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007252 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007253#endif
7254#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007256#endif
7257#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007258 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007259#endif
7260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007261 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007262#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007263 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007264#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007265 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007266#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007267 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007268#endif
7269#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007270 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007271#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007272 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007273#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007275#endif
7276#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007277 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007278#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007279 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007280#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007281 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007282#endif
7283
Christian Heimesfaf2f632008-01-06 16:59:19 +00007284#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007285 {
Steve Dowerea93ac02016-06-17 12:52:18 -07007286 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS,
7287#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007288 SIO_LOOPBACK_FAST_PATH
Steve Dowerea93ac02016-06-17 12:52:18 -07007289#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007290 };
Steve Dowerea93ac02016-06-17 12:52:18 -07007291 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS",
7292#if defined(SIO_LOOPBACK_FAST_PATH)
Berker Peksag3583c3b2016-06-18 16:43:25 +03007293 "SIO_LOOPBACK_FAST_PATH"
Steve Dowerea93ac02016-06-17 12:52:18 -07007294#endif
Berker Peksag3583c3b2016-06-18 16:43:25 +03007295 };
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007296 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007297 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007298 PyObject *tmp;
7299 tmp = PyLong_FromUnsignedLong(codes[i]);
7300 if (tmp == NULL)
7301 return NULL;
7302 PyModule_AddObject(m, names[i], tmp);
7303 }
7304 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007305 PyModule_AddIntMacro(m, RCVALL_OFF);
7306 PyModule_AddIntMacro(m, RCVALL_ON);
7307 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007308#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007309 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007310#endif
7311#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007312 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007313#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007314#endif /* _MSTCPIP_ */
7315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007316 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007317#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007318 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007320 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007321}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007322
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007323
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007324#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007325#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007326
7327/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007328/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007329
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007330int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007331inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007333 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007334#if (SIZEOF_INT != 4)
7335#error "Not sure if in_addr_t exists and int is not 32-bits."
7336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007337 unsigned int packed_addr;
7338 packed_addr = inet_addr(src);
7339 if (packed_addr == INADDR_NONE)
7340 return 0;
7341 memcpy(dst, &packed_addr, 4);
7342 return 1;
7343 }
7344 /* Should set errno to EAFNOSUPPORT */
7345 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007346}
7347
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007348const char *
7349inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007350{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007351 if (af == AF_INET) {
7352 struct in_addr packed_addr;
7353 if (size < 16)
7354 /* Should set errno to ENOSPC. */
7355 return NULL;
7356 memcpy(&packed_addr, src, sizeof(packed_addr));
7357 return strncpy(dst, inet_ntoa(packed_addr), size);
7358 }
7359 /* Should set errno to EAFNOSUPPORT */
7360 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007361}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007362
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007363#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007364#endif