blob: af6cc94415b6869d0b37e22bd6cc2d5b514348b0 [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
Guido van Rossum7a122991999-04-13 04:07:32 +0000166#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000168#endif
169
Guido van Rossume7de2061999-03-24 17:24:33 +0000170#ifdef HAVE_GETHOSTBYNAME_R
Martin Panterc9e08d82016-11-14 04:26:36 +0000171# if defined(_AIX) && !defined(_LINUX_SOURCE_COMPAT)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# define HAVE_GETHOSTBYNAME_R_3_ARG
173# elif defined(__sun) || defined(__sgi)
174# define HAVE_GETHOSTBYNAME_R_5_ARG
175# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000176/* Rely on the configure script */
Martin Panterc9e08d82016-11-14 04:26:36 +0000177# elif defined(_LINUX_SOURCE_COMPAT) /* Linux compatibility on AIX */
178# define HAVE_GETHOSTBYNAME_R_6_ARG
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# else
180# undef HAVE_GETHOSTBYNAME_R
181# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000182#endif
183
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000184#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
185 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000186# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000187#endif
188
Ned Deilye1d4e582016-02-23 22:05:29 +1100189/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000190#ifdef HAVE_SYS_PARAM_H
191#include <sys/param.h>
192#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000193/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100194 (this includes the getaddrinfo emulation) protect access with a lock.
195
196 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
197 a mix of code including an unsafe implementation from an old BSD's
198 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
199 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100200 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100201
Ned Deilye1d4e582016-02-23 22:05:29 +1100202 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
203 http://www.openbsd.org/plus54.html
204
205 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
206
207http://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 +1100208 */
209#if defined(WITH_THREAD) && ( \
210 (defined(__APPLE__) && \
211 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000212 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100213 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
214 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100215 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000216#define USE_GETADDRINFO_LOCK
217#endif
218
219#ifdef USE_GETADDRINFO_LOCK
220#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
221#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
222#else
223#define ACQUIRE_GETADDRINFO_LOCK
224#define RELEASE_GETADDRINFO_LOCK
225#endif
226
227#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000228# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000229#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000230
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000231#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000232# include <types.h>
233# include <io.h>
234# include <sys/ioctl.h>
235# include <utils.h>
236# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000237#endif
238
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100239#ifdef __APPLE__
240# include <sys/ioctl.h>
241#endif
242
243
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000244#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000245/* make sure that the reentrant (gethostbyaddr_r etc)
246 functions are declared correctly if compiling with
247 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248
Thomas Wouters477c8d52006-05-27 19:21:47 +0000249/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000250 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000251#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000252#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000253
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000254#undef _XOPEN_SOURCE
255#include <sys/socket.h>
256#include <sys/types.h>
257#include <netinet/in.h>
258#ifdef _SS_ALIGNSIZE
259#define HAVE_GETADDRINFO 1
260#define HAVE_GETNAMEINFO 1
261#endif
262
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000263#define HAVE_INET_PTON
264#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000265#endif
266
Thomas Wouters477c8d52006-05-27 19:21:47 +0000267/* Irix 6.5 fails to define this variable at all. This is needed
268 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000269 are just busted. Same thing for Solaris. */
270#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000271#define INET_ADDRSTRLEN 16
272#endif
273
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000276#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000277#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700279#ifdef HAVE_SYS_SOCKET_H
280#include <sys/socket.h>
281#endif
282
283#ifdef HAVE_NET_IF_H
284#include <net/if.h>
285#endif
286
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000287/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000289#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000290
291/* Addressing includes */
292
Guido van Rossum6f489d91996-06-28 20:15:15 +0000293#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000294
295/* Non-MS WINDOWS includes */
296# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000297# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000298
Guido van Rossum9376b741999-09-15 22:01:40 +0000299/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000301
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000302# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000303
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000304#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000305
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000306/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000307# ifdef HAVE_FCNTL_H
308# include <fcntl.h>
309# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000310
Steve Dower65e4cb12014-11-22 12:54:57 -0800311#if defined(_MSC_VER) && _MSC_VER >= 1800
312/* Provides the IsWindows7SP1OrGreater() function */
313#include <VersionHelpers.h>
314#endif
315
Jeremy Hylton22308652001-02-02 03:23:09 +0000316#endif
317
Skip Montanaro7befb992004-02-10 16:50:21 +0000318#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000319
Neal Norwitz39d22e52002-11-02 19:55:21 +0000320#ifndef O_NONBLOCK
321# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000322#endif
323
Trent Micka708d6e2004-09-07 17:48:26 +0000324/* include Python's addrinfo.h unless it causes trouble */
325#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
326 /* Do not include addinfo.h on some newer IRIX versions.
327 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
328 * for example, but not by 6.5.10.
329 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000330#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000331 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
332 * EAI_* constants are defined in (the already included) ws2tcpip.h.
333 */
334#else
335# include "addrinfo.h"
336#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000337
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000338#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000339#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000340int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000341const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000342#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000343#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000344
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000345#ifdef __APPLE__
346/* On OS X, getaddrinfo returns no error indication of lookup
347 failure, so we must use the emulation instead of the libinfo
348 implementation. Unfortunately, performing an autoconf test
349 for this bug would require DNS access for the machine performing
350 the configuration, which is not acceptable. Therefore, we
351 determine the bug just by checking for __APPLE__. If this bug
352 gets ever fixed, perhaps checking for sys/version.h would be
353 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000354#ifndef HAVE_GETNAMEINFO
355/* This bug seems to be fixed in Jaguar. Ths easiest way I could
356 Find to check for Jaguar is that it has getnameinfo(), which
357 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000358#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000359#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000360
361#ifdef HAVE_INET_ATON
362#define USE_INET_ATON_WEAKLINK
363#endif
364
Jack Jansen84262fb2002-07-02 14:40:42 +0000365#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000366
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000367/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000368#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000369/* avoid clashes with the C library definition of the symbol. */
370#define getaddrinfo fake_getaddrinfo
371#define gai_strerror fake_gai_strerror
372#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000373#include "getaddrinfo.c"
374#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000375#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000376#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000377#include "getnameinfo.c"
378#endif
379
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000380#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000381#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000382#endif
383
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000384#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000385#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000386#define EAFNOSUPPORT WSAEAFNOSUPPORT
387#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000388#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000389
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000390#ifndef SOCKETCLOSE
391#define SOCKETCLOSE close
392#endif
393
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000394#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#define USE_BLUETOOTH 1
396#if defined(__FreeBSD__)
397#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
398#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000399#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000400#define SOL_HCI SOL_HCI_RAW
401#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define sockaddr_l2 sockaddr_l2cap
403#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000404#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000405#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
406#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000407#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000408#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000409#define sockaddr_l2 sockaddr_bt
410#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000411#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000412#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000413#define SOL_HCI BTPROTO_HCI
414#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000415#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
416#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000417#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000418#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000419#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000420#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
421#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000422#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000423#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
424#endif
425#endif
426
Charles-François Natali8b759652011-12-23 16:44:51 +0100427/* Convert "sock_addr_t *" to "struct sockaddr *". */
428#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000429
Martin v. Löwise9416172003-05-03 10:12:45 +0000430/*
431 * Constants for getnameinfo()
432 */
433#if !defined(NI_MAXHOST)
434#define NI_MAXHOST 1025
435#endif
436#if !defined(NI_MAXSERV)
437#define NI_MAXSERV 32
438#endif
439
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000440#ifndef INVALID_SOCKET /* MS defines this */
441#define INVALID_SOCKET (-1)
442#endif
443
Charles-François Natali0cc86852013-09-13 19:53:08 +0200444#ifndef INADDR_NONE
445#define INADDR_NONE (-1)
446#endif
447
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000448/* XXX There's a problem here: *static* functions are not supposed to have
449 a Py prefix (or use CapitalizedWords). Later... */
450
Guido van Rossum30a685f1991-06-27 15:51:29 +0000451/* Global variable holding the exception type for errors detected
452 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000453static PyObject *socket_herror;
454static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000455static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000456
Tim Peters643a7fc2002-02-17 04:13:21 +0000457/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000458 The sock_type variable contains pointers to various functions,
459 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000460 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000461static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000462
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000463#if defined(HAVE_POLL_H)
464#include <poll.h>
465#elif defined(HAVE_SYS_POLL_H)
466#include <sys/poll.h>
467#endif
468
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000469/* Largest value to try to store in a socklen_t (used when handling
470 ancillary data). POSIX requires socklen_t to hold at least
471 (2**31)-1 and recommends against storing larger values, but
472 socklen_t was originally int in the BSD interface, so to be on the
473 safe side we use the smaller of (2**31)-1 and INT_MAX. */
474#if INT_MAX > 0x7fffffff
475#define SOCKLEN_T_LIMIT 0x7fffffff
476#else
477#define SOCKLEN_T_LIMIT INT_MAX
478#endif
479
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200480#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000481/* Instead of select(), we'll use poll() since poll() works on any fd. */
482#define IS_SELECTABLE(s) 1
483/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000484#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200485/* If there's no timeout left, we don't have to call select, so it's a safe,
486 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100487#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000488#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000489
490static PyObject*
491select_error(void)
492{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200493 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000495}
496
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000497#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000498#ifndef WSAEAGAIN
499#define WSAEAGAIN WSAEWOULDBLOCK
500#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000501#define CHECK_ERRNO(expected) \
502 (WSAGetLastError() == WSA ## expected)
503#else
504#define CHECK_ERRNO(expected) \
505 (errno == expected)
506#endif
507
Victor Stinnerdaf45552013-08-28 00:53:59 +0200508#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200509# define GET_SOCK_ERROR WSAGetLastError()
510# define SET_SOCK_ERROR(err) WSASetLastError(err)
511# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
512# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
513#else
514# define GET_SOCK_ERROR errno
515# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
516# define SOCK_TIMEOUT_ERR EWOULDBLOCK
517# define SOCK_INPROGRESS_ERR EINPROGRESS
518#endif
519
520
521#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200522/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
523static int support_wsa_no_inherit = -1;
524#endif
525
Guido van Rossum30a685f1991-06-27 15:51:29 +0000526/* Convenience function to raise an error according to errno
527 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000528
Guido van Rossum73624e91994-10-10 17:59:00 +0000529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000530set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000531{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000532#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 int err_no = WSAGetLastError();
534 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
535 recognizes the error codes used by both GetLastError() and
536 WSAGetLastError */
537 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200538 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000539#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000540
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200541 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000542}
543
Guido van Rossum30a685f1991-06-27 15:51:29 +0000544
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000546set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549
550#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 if (v != NULL) {
556 PyErr_SetObject(socket_herror, v);
557 Py_DECREF(v);
558 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000561}
562
563
564static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000565set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000568
Martin v. Löwis272cb402002-03-01 08:31:07 +0000569#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 /* EAI_SYSTEM is not available on Windows XP. */
571 if (error == EAI_SYSTEM)
572 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000573#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000574
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000575#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 if (v != NULL) {
581 PyErr_SetObject(socket_gaierror, v);
582 Py_DECREF(v);
583 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000586}
587
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000588/* Function to perform the setting of socket blocking mode
589 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000590static int
591internal_setblocking(PySocketSockObject *s, int block)
592{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200593#ifdef MS_WINDOWS
594 u_long arg;
595#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100596#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100597 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100598 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000600#ifdef SOCK_NONBLOCK
601 if (block)
602 s->sock_type &= (~SOCK_NONBLOCK);
603 else
604 s->sock_type |= SOCK_NONBLOCK;
605#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000607 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000608#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100609#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 block = !block;
611 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100612#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000613 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
614 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100615 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 else
Victor Stinner9a954832013-12-04 00:41:24 +0100617 new_delay_flag = delay_flag | O_NONBLOCK;
618 if (new_delay_flag != delay_flag)
619 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
620#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200622 arg = !block;
623 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* Since these don't return anything */
628 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000629}
630
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000631static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200632internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
633 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100636#ifdef HAVE_POLL
637 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200638 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100639#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200640 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200641 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100642#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000643
Victor Stinnerb7df3142015-03-27 22:59:32 +0100644#ifdef WITH_THREAD
645 /* must be called with the GIL held */
646 assert(PyGILState_Check());
647#endif
648
Victor Stinner416f2e62015-03-31 13:56:29 +0200649 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200650 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 /* Guard against closed socket */
Victor Stinner0cec8772016-07-22 17:26:53 +0200653 if (s->sock_fd == INVALID_SOCKET)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 /* Prefer poll, if available, since you can poll() any fd
657 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000658#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100659 pollfd.fd = s->sock_fd;
660 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200661 if (connect) {
662 /* On Windows, the socket becomes writable on connection success,
663 but a connection failure is notified as an error. On POSIX, the
664 socket becomes writable on connection success or on connection
665 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200666 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200667 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000668
Victor Stinner71694d52015-03-28 01:18:54 +0100669 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200670 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200671 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000672
Victor Stinner71694d52015-03-28 01:18:54 +0100673 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200674 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100675 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000676#else
Victor Stinnerced11742015-04-09 10:27:25 +0200677 if (interval >= 0) {
678 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
679 tvp = &tv;
680 }
681 else
682 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000683
Victor Stinner71694d52015-03-28 01:18:54 +0100684 FD_ZERO(&fds);
685 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200686 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200687 if (connect) {
688 /* On Windows, the socket becomes writable on connection success,
689 but a connection failure is notified as an error. On POSIX, the
690 socket becomes writable on connection success or on connection
691 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200692 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200693 }
Victor Stinner71694d52015-03-28 01:18:54 +0100694
695 /* See if the socket is ready */
696 Py_BEGIN_ALLOW_THREADS;
697 if (writing)
698 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200699 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100700 else
701 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200702 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100703 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000704#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 if (n < 0)
707 return -1;
708 if (n == 0)
709 return 1;
710 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711}
712
Victor Stinner31bf2d52015-04-01 21:57:09 +0200713/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000714
Victor Stinner81c41db2015-04-02 11:50:57 +0200715 On error, raise an exception and return -1 if err is set, or fill err and
716 return -1 otherwise. If a signal was received and the signal handler raised
717 an exception, return -1, and set err to -1 if err is set.
718
719 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100720
Victor Stinner31bf2d52015-04-01 21:57:09 +0200721 If the socket has a timeout, wait until the socket is ready before calling
722 the function: wait until the socket is writable if writing is nonzero, wait
723 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100724
Victor Stinner81c41db2015-04-02 11:50:57 +0200725 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200726 the function, except if the signal handler raised an exception (PEP 475).
727
728 When the function is retried, recompute the timeout using a monotonic clock.
729
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 sock_call_ex() must be called with the GIL held. The socket function is
731 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200732static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200733sock_call_ex(PySocketSockObject *s,
734 int writing,
735 int (*sock_func) (PySocketSockObject *s, void *data),
736 void *data,
737 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200738 int *err,
739 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200740{
Victor Stinner8912d142015-04-06 23:16:34 +0200741 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200742 _PyTime_t deadline = 0;
743 int deadline_initialized = 0;
744 int res;
745
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200746#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200747 /* sock_call() must be called with the GIL held. */
748 assert(PyGILState_Check());
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200749#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200750
751 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200752 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200753 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 /* For connect(), poll even for blocking socket. The connection
755 runs asynchronously. */
756 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200758 _PyTime_t interval;
759
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 if (deadline_initialized) {
761 /* recompute the timeout */
762 interval = deadline - _PyTime_GetMonotonicClock();
763 }
764 else {
765 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200766 deadline = _PyTime_GetMonotonicClock() + timeout;
767 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200768 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200769
Victor Stinner10550cd2015-04-03 13:22:27 +0200770 if (interval >= 0)
771 res = internal_select(s, writing, interval, connect);
772 else
773 res = 1;
774 }
775 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200776 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200777 }
778
Victor Stinner31bf2d52015-04-01 21:57:09 +0200779 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 if (err)
781 *err = GET_SOCK_ERROR;
782
Victor Stinner31bf2d52015-04-01 21:57:09 +0200783 if (CHECK_ERRNO(EINTR)) {
784 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 if (PyErr_CheckSignals()) {
786 if (err)
787 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200788 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200789 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200790
791 /* retry select() */
792 continue;
793 }
794
795 /* select() failed */
796 s->errorhandler();
797 return -1;
798 }
799
800 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 if (err)
802 *err = SOCK_TIMEOUT_ERR;
803 else
804 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805 return -1;
806 }
807
808 /* the socket is ready */
809 }
810
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 /* inner loop to retry sock_func() when sock_func() is interrupted
812 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813 while (1) {
814 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200815 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200816 Py_END_ALLOW_THREADS
817
818 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200819 /* sock_func() succeeded */
820 if (err)
821 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200822 return 0;
823 }
824
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 if (err)
826 *err = GET_SOCK_ERROR;
827
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828 if (!CHECK_ERRNO(EINTR))
829 break;
830
Victor Stinner81c41db2015-04-02 11:50:57 +0200831 /* sock_func() was interrupted by a signal */
832 if (PyErr_CheckSignals()) {
833 if (err)
834 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200835 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837
Victor Stinner81c41db2015-04-02 11:50:57 +0200838 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200839 }
840
841 if (s->sock_timeout > 0
842 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200843 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200844
845 For example, select() could indicate a socket is ready for
846 reading, but the data then discarded by the OS because of a
847 wrong checksum.
848
849 Loop on select() to recheck for socket readyness. */
850 continue;
851 }
852
Victor Stinner81c41db2015-04-02 11:50:57 +0200853 /* sock_func() failed */
854 if (!err)
855 s->errorhandler();
856 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000857 return -1;
858 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200859}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000860
Victor Stinner81c41db2015-04-02 11:50:57 +0200861static int
862sock_call(PySocketSockObject *s,
863 int writing,
864 int (*func) (PySocketSockObject *s, void *data),
865 void *data)
866{
Victor Stinner8912d142015-04-06 23:16:34 +0200867 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200868}
869
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000870
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000871/* Initialize a new socket object. */
872
Victor Stinner88ed6402015-04-09 10:23:12 +0200873/* Default timeout for new sockets */
874static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000875
Martin v. Löwis1a214512008-06-11 05:26:20 +0000876static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000877init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 s->sock_fd = fd;
881 s->sock_family = family;
882 s->sock_type = type;
883 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000886#ifdef SOCK_NONBLOCK
887 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100888 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000889 else
890#endif
891 {
892 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100893 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000894 internal_setblocking(s, 0);
895 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000896
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000897}
898
899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900/* Create a new socket object.
901 This just creates the object and initializes it.
902 If the creation fails, return NULL and set an exception (implicit
903 in NEWOBJ()). */
904
Guido van Rossum73624e91994-10-10 17:59:00 +0000905static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000906new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 PySocketSockObject *s;
909 s = (PySocketSockObject *)
910 PyType_GenericNew(&sock_type, NULL, NULL);
911 if (s != NULL)
912 init_sockobject(s, fd, family, type, proto);
913 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000914}
915
Guido van Rossum30a685f1991-06-27 15:51:29 +0000916
Guido van Rossum48a680c2001-03-02 06:34:14 +0000917/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000918 thread to be in gethostbyname or getaddrinfo */
919#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200920static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000921#endif
922
923
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924/* Convert a string specifying a host name or one of a few symbolic
925 names to a numeric IP address. This usually calls gethostbyname()
926 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928 an error occurred; then an exception is raised. */
929
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000931setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000932{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 struct addrinfo hints, *res;
934 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
937 if (name[0] == '\0') {
938 int siz;
939 memset(&hints, 0, sizeof(hints));
940 hints.ai_family = af;
941 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
942 hints.ai_flags = AI_PASSIVE;
943 Py_BEGIN_ALLOW_THREADS
944 ACQUIRE_GETADDRINFO_LOCK
945 error = getaddrinfo(NULL, "0", &hints, &res);
946 Py_END_ALLOW_THREADS
947 /* We assume that those thread-unsafe getaddrinfo() versions
948 *are* safe regarding their return value, ie. that a
949 subsequent call to getaddrinfo() does not destroy the
950 outcome of the first call. */
951 RELEASE_GETADDRINFO_LOCK
952 if (error) {
953 set_gaierror(error);
954 return -1;
955 }
956 switch (res->ai_family) {
957 case AF_INET:
958 siz = 4;
959 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000960#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 case AF_INET6:
962 siz = 16;
963 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 default:
966 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200967 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 "unsupported address family");
969 return -1;
970 }
971 if (res->ai_next) {
972 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200973 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 "wildcard resolved to multiple address");
975 return -1;
976 }
977 if (res->ai_addrlen < addr_ret_size)
978 addr_ret_size = res->ai_addrlen;
979 memcpy(addr_ret, res->ai_addr, addr_ret_size);
980 freeaddrinfo(res);
981 return siz;
982 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200983 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100984 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200985 if (strcmp(name, "255.255.255.255") == 0 ||
986 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 struct sockaddr_in *sin;
988 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200989 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 "address family mismatched");
991 return -1;
992 }
993 sin = (struct sockaddr_in *)addr_ret;
994 memset((void *) sin, '\0', sizeof(*sin));
995 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000996#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 sin->sin_addr.s_addr = INADDR_BROADCAST;
1000 return sizeof(sin->sin_addr);
1001 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001002
1003 /* avoid a name resolution in case of numeric address */
1004#ifdef HAVE_INET_PTON
1005 /* check for an IPv4 address */
1006 if (af == AF_UNSPEC || af == AF_INET) {
1007 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1008 memset(sin, 0, sizeof(*sin));
1009 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1010 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001011#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001013#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014 return 4;
1015 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001017#ifdef ENABLE_IPV6
1018 /* check for an IPv6 address - if the address contains a scope ID, we
1019 * fallback to getaddrinfo(), which can handle translation from interface
1020 * name to interface index */
1021 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1022 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1023 memset(sin, 0, sizeof(*sin));
1024 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1025 sin->sin6_family = AF_INET6;
1026#ifdef HAVE_SOCKADDR_SA_LEN
1027 sin->sin6_len = sizeof(*sin);
1028#endif
1029 return 16;
1030 }
1031 }
1032#endif /* ENABLE_IPV6 */
1033#else /* HAVE_INET_PTON */
1034 /* check for an IPv4 address */
1035 if (af == AF_INET || af == AF_UNSPEC) {
1036 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1037 memset(sin, 0, sizeof(*sin));
1038 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1039 sin->sin_family = AF_INET;
1040#ifdef HAVE_SOCKADDR_SA_LEN
1041 sin->sin_len = sizeof(*sin);
1042#endif
1043 return 4;
1044 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001045 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001046#endif /* HAVE_INET_PTON */
1047
1048 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 memset(&hints, 0, sizeof(hints));
1050 hints.ai_family = af;
1051 Py_BEGIN_ALLOW_THREADS
1052 ACQUIRE_GETADDRINFO_LOCK
1053 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001054#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 if (error == EAI_NONAME && af == AF_UNSPEC) {
1056 /* On Tru64 V5.1, numeric-to-addr conversion fails
1057 if no address family is given. Assume IPv4 for now.*/
1058 hints.ai_family = AF_INET;
1059 error = getaddrinfo(name, NULL, &hints, &res);
1060 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001061#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 Py_END_ALLOW_THREADS
1063 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1064 if (error) {
1065 set_gaierror(error);
1066 return -1;
1067 }
1068 if (res->ai_addrlen < addr_ret_size)
1069 addr_ret_size = res->ai_addrlen;
1070 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1071 freeaddrinfo(res);
1072 switch (addr_ret->sa_family) {
1073 case AF_INET:
1074 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001075#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 case AF_INET6:
1077 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001080 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 return -1;
1082 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001083}
1084
Guido van Rossum30a685f1991-06-27 15:51:29 +00001085
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086/* Create a string object representing an IP address.
1087 This is always a string of the form 'dd.dd.dd.dd' (with variable
1088 size numbers). */
1089
Guido van Rossum73624e91994-10-10 17:59:00 +00001090static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001091makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001093 char buf[NI_MAXHOST];
1094 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1097 NI_NUMERICHOST);
1098 if (error) {
1099 set_gaierror(error);
1100 return NULL;
1101 }
1102 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001103}
1104
1105
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001106#ifdef USE_BLUETOOTH
1107/* Convert a string representation of a Bluetooth address into a numeric
1108 address. Returns the length (6), or raises an exception and returns -1 if
1109 an error occurred. */
1110
1111static int
1112setbdaddr(char *name, bdaddr_t *bdaddr)
1113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 unsigned int b0, b1, b2, b3, b4, b5;
1115 char ch;
1116 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1119 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1120 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1121 bdaddr->b[0] = b0;
1122 bdaddr->b[1] = b1;
1123 bdaddr->b[2] = b2;
1124 bdaddr->b[3] = b3;
1125 bdaddr->b[4] = b4;
1126 bdaddr->b[5] = b5;
1127 return 6;
1128 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001129 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 return -1;
1131 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001132}
1133
1134/* Create a string representation of the Bluetooth address. This is always a
1135 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1136 value (zero padded if necessary). */
1137
1138static PyObject *
1139makebdaddr(bdaddr_t *bdaddr)
1140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001143 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1144 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1145 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1146 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001147}
1148#endif
1149
1150
Guido van Rossum30a685f1991-06-27 15:51:29 +00001151/* Create an object representing the given socket address,
1152 suitable for passing it back to bind(), connect() etc.
1153 The family field of the sockaddr structure is inspected
1154 to determine what kind of address it really is. */
1155
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001156/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001157static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001158makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (addrlen == 0) {
1161 /* No address -- may be recvfrom() from known socket */
1162 Py_INCREF(Py_None);
1163 return Py_None;
1164 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 case AF_INET:
1169 {
1170 struct sockaddr_in *a;
1171 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1172 PyObject *ret = NULL;
1173 if (addrobj) {
1174 a = (struct sockaddr_in *)addr;
1175 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1176 Py_DECREF(addrobj);
1177 }
1178 return ret;
1179 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001180
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001181#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 case AF_UNIX:
1183 {
1184 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001185#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1187 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001188 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 }
1190 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001191#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 {
1193 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001194 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 }
1196 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001197#endif /* AF_UNIX */
1198
Martin v. Löwis11017b12006-01-14 18:12:57 +00001199#if defined(AF_NETLINK)
1200 case AF_NETLINK:
1201 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001202 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1203 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001204 }
1205#endif /* AF_NETLINK */
1206
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001207#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 case AF_INET6:
1209 {
1210 struct sockaddr_in6 *a;
1211 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1212 PyObject *ret = NULL;
1213 if (addrobj) {
1214 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001215 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001216 addrobj,
1217 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001218 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 a->sin6_scope_id);
1220 Py_DECREF(addrobj);
1221 }
1222 return ret;
1223 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001224#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001225
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001226#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 case AF_BLUETOOTH:
1228 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 case BTPROTO_L2CAP:
1231 {
1232 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1233 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1234 PyObject *ret = NULL;
1235 if (addrobj) {
1236 ret = Py_BuildValue("Oi",
1237 addrobj,
1238 _BT_L2_MEMB(a, psm));
1239 Py_DECREF(addrobj);
1240 }
1241 return ret;
1242 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 case BTPROTO_RFCOMM:
1245 {
1246 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1247 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1248 PyObject *ret = NULL;
1249 if (addrobj) {
1250 ret = Py_BuildValue("Oi",
1251 addrobj,
1252 _BT_RC_MEMB(a, channel));
1253 Py_DECREF(addrobj);
1254 }
1255 return ret;
1256 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 case BTPROTO_HCI:
1259 {
1260 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001261#if defined(__NetBSD__) || defined(__DragonFly__)
1262 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1263#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 PyObject *ret = NULL;
1265 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1266 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001267#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001268 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001269
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001270#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 case BTPROTO_SCO:
1272 {
1273 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1274 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1275 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001276#endif
1277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001278 default:
1279 PyErr_SetString(PyExc_ValueError,
1280 "Unknown Bluetooth protocol");
1281 return NULL;
1282 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001283#endif
1284
Antoine Pitroub156a462010-10-27 20:13:57 +00001285#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001286 case AF_PACKET:
1287 {
1288 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1289 char *ifname = "";
1290 struct ifreq ifr;
1291 /* need to look up interface name give index */
1292 if (a->sll_ifindex) {
1293 ifr.ifr_ifindex = a->sll_ifindex;
1294 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1295 ifname = ifr.ifr_name;
1296 }
1297 return Py_BuildValue("shbhy#",
1298 ifname,
1299 ntohs(a->sll_protocol),
1300 a->sll_pkttype,
1301 a->sll_hatype,
1302 a->sll_addr,
1303 a->sll_halen);
1304 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001305#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001306
Christian Heimes043d6f62008-01-07 17:19:16 +00001307#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 case AF_TIPC:
1309 {
1310 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1311 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1312 return Py_BuildValue("IIIII",
1313 a->addrtype,
1314 a->addr.nameseq.type,
1315 a->addr.nameseq.lower,
1316 a->addr.nameseq.upper,
1317 a->scope);
1318 } else if (a->addrtype == TIPC_ADDR_NAME) {
1319 return Py_BuildValue("IIIII",
1320 a->addrtype,
1321 a->addr.name.name.type,
1322 a->addr.name.name.instance,
1323 a->addr.name.name.instance,
1324 a->scope);
1325 } else if (a->addrtype == TIPC_ADDR_ID) {
1326 return Py_BuildValue("IIIII",
1327 a->addrtype,
1328 a->addr.id.node,
1329 a->addr.id.ref,
1330 0,
1331 a->scope);
1332 } else {
1333 PyErr_SetString(PyExc_ValueError,
1334 "Invalid address type");
1335 return NULL;
1336 }
1337 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001338#endif
1339
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001340#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001341 case AF_CAN:
1342 {
1343 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1344 char *ifname = "";
1345 struct ifreq ifr;
1346 /* need to look up interface name given index */
1347 if (a->can_ifindex) {
1348 ifr.ifr_ifindex = a->can_ifindex;
1349 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1350 ifname = ifr.ifr_name;
1351 }
1352
1353 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1354 ifname,
1355 a->can_family);
1356 }
1357#endif
1358
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001359#ifdef PF_SYSTEM
1360 case PF_SYSTEM:
1361 switch(proto) {
1362#ifdef SYSPROTO_CONTROL
1363 case SYSPROTO_CONTROL:
1364 {
1365 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1366 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1367 }
1368#endif
1369 default:
1370 PyErr_SetString(PyExc_ValueError,
1371 "Invalid address type");
1372 return 0;
1373 }
1374#endif
1375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 default:
1379 /* If we don't know the address family, don't raise an
1380 exception -- return it as an (int, bytes) tuple. */
1381 return Py_BuildValue("iy#",
1382 addr->sa_family,
1383 addr->sa_data,
1384 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001387}
1388
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001389/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1390 (in particular, numeric IP addresses). */
1391struct maybe_idna {
1392 PyObject *obj;
1393 char *buf;
1394};
1395
1396static void
1397idna_cleanup(struct maybe_idna *data)
1398{
1399 Py_CLEAR(data->obj);
1400}
1401
1402static int
1403idna_converter(PyObject *obj, struct maybe_idna *data)
1404{
1405 size_t len;
1406 PyObject *obj2, *obj3;
1407 if (obj == NULL) {
1408 idna_cleanup(data);
1409 return 1;
1410 }
1411 data->obj = NULL;
1412 len = -1;
1413 if (PyBytes_Check(obj)) {
1414 data->buf = PyBytes_AsString(obj);
1415 len = PyBytes_Size(obj);
1416 }
1417 else if (PyByteArray_Check(obj)) {
1418 data->buf = PyByteArray_AsString(obj);
1419 len = PyByteArray_Size(obj);
1420 }
1421 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1422 data->buf = PyUnicode_DATA(obj);
1423 len = PyUnicode_GET_LENGTH(obj);
1424 }
1425 else {
1426 obj2 = PyUnicode_FromObject(obj);
1427 if (!obj2) {
1428 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1429 obj->ob_type->tp_name);
1430 return 0;
1431 }
1432 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1433 Py_DECREF(obj2);
1434 if (!obj3) {
1435 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1436 return 0;
1437 }
1438 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001439 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001440 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1441 return 0;
1442 }
1443 data->obj = obj3;
1444 data->buf = PyBytes_AS_STRING(obj3);
1445 len = PyBytes_GET_SIZE(obj3);
1446 }
1447 if (strlen(data->buf) != len) {
1448 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001449 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001450 return 0;
1451 }
1452 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001453}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001454
1455/* Parse a socket address argument according to the socket object's
1456 address family. Return 1 if the address was in the proper format,
1457 0 of not. The address is returned through addr_ret, its length
1458 through len_ret. */
1459
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001460static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001461getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001465
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001466#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 case AF_UNIX:
1468 {
1469 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001470 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001471 int retval = 0;
1472
1473 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1474 allow embedded nulls on Linux. */
1475 if (PyUnicode_Check(args)) {
1476 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1477 return 0;
1478 }
1479 else
1480 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001481 if (!PyArg_Parse(args, "y*", &path)) {
1482 Py_DECREF(args);
1483 return retval;
1484 }
1485 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001488#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001489 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001491 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001492 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001494 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 }
1496 }
1497 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001498#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 {
1500 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001501 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001502 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001504 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001506 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 }
1508 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001509 memcpy(addr->sun_path, path.buf, path.len);
1510 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001511 retval = 1;
1512 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001513 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001514 Py_DECREF(args);
1515 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001517#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001518
Martin v. Löwis11017b12006-01-14 18:12:57 +00001519#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 case AF_NETLINK:
1521 {
1522 struct sockaddr_nl* addr;
1523 int pid, groups;
1524 addr = (struct sockaddr_nl *)addr_ret;
1525 if (!PyTuple_Check(args)) {
1526 PyErr_Format(
1527 PyExc_TypeError,
1528 "getsockaddrarg: "
1529 "AF_NETLINK address must be tuple, not %.500s",
1530 Py_TYPE(args)->tp_name);
1531 return 0;
1532 }
1533 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1534 return 0;
1535 addr->nl_family = AF_NETLINK;
1536 addr->nl_pid = pid;
1537 addr->nl_groups = groups;
1538 *len_ret = sizeof(*addr);
1539 return 1;
1540 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001541#endif
1542
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001543#ifdef AF_RDS
1544 case AF_RDS:
1545 /* RDS sockets use sockaddr_in: fall-through */
1546#endif
1547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 case AF_INET:
1549 {
1550 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001551 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001552 int port, result;
1553 if (!PyTuple_Check(args)) {
1554 PyErr_Format(
1555 PyExc_TypeError,
1556 "getsockaddrarg: "
1557 "AF_INET address must be tuple, not %.500s",
1558 Py_TYPE(args)->tp_name);
1559 return 0;
1560 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001561 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1562 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 return 0;
1564 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001565 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001567 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 if (result < 0)
1569 return 0;
1570 if (port < 0 || port > 0xffff) {
1571 PyErr_SetString(
1572 PyExc_OverflowError,
1573 "getsockaddrarg: port must be 0-65535.");
1574 return 0;
1575 }
1576 addr->sin_family = AF_INET;
1577 addr->sin_port = htons((short)port);
1578 *len_ret = sizeof *addr;
1579 return 1;
1580 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001581
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001582#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 case AF_INET6:
1584 {
1585 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001586 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001587 int port, result;
1588 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 flowinfo = scope_id = 0;
1590 if (!PyTuple_Check(args)) {
1591 PyErr_Format(
1592 PyExc_TypeError,
1593 "getsockaddrarg: "
1594 "AF_INET6 address must be tuple, not %.500s",
1595 Py_TYPE(args)->tp_name);
1596 return 0;
1597 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001598 if (!PyArg_ParseTuple(args, "O&i|II",
1599 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 &scope_id)) {
1601 return 0;
1602 }
1603 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001604 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001606 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 if (result < 0)
1608 return 0;
1609 if (port < 0 || port > 0xffff) {
1610 PyErr_SetString(
1611 PyExc_OverflowError,
1612 "getsockaddrarg: port must be 0-65535.");
1613 return 0;
1614 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001615 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001616 PyErr_SetString(
1617 PyExc_OverflowError,
1618 "getsockaddrarg: flowinfo must be 0-1048575.");
1619 return 0;
1620 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 addr->sin6_family = s->sock_family;
1622 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001623 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 addr->sin6_scope_id = scope_id;
1625 *len_ret = sizeof *addr;
1626 return 1;
1627 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001628#endif
1629
Hye-Shik Chang81268602004-02-02 06:05:24 +00001630#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 case AF_BLUETOOTH:
1632 {
1633 switch (s->sock_proto) {
1634 case BTPROTO_L2CAP:
1635 {
1636 struct sockaddr_l2 *addr;
1637 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001639 addr = (struct sockaddr_l2 *)addr_ret;
1640 memset(addr, 0, sizeof(struct sockaddr_l2));
1641 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1642 if (!PyArg_ParseTuple(args, "si", &straddr,
1643 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001644 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 "wrong format");
1646 return 0;
1647 }
1648 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1649 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 *len_ret = sizeof *addr;
1652 return 1;
1653 }
1654 case BTPROTO_RFCOMM:
1655 {
1656 struct sockaddr_rc *addr;
1657 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 addr = (struct sockaddr_rc *)addr_ret;
1660 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1661 if (!PyArg_ParseTuple(args, "si", &straddr,
1662 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001663 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 "wrong format");
1665 return 0;
1666 }
1667 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1668 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 *len_ret = sizeof *addr;
1671 return 1;
1672 }
1673 case BTPROTO_HCI:
1674 {
1675 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001676#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001677 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001678
Alexander Belopolskye239d232010-12-08 23:31:48 +00001679 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001680 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001681 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001682 "wrong format");
1683 return 0;
1684 }
1685 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1686 return 0;
1687#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1689 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001690 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 "wrong format");
1692 return 0;
1693 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 *len_ret = sizeof *addr;
1696 return 1;
1697 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001698#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001699 case BTPROTO_SCO:
1700 {
1701 struct sockaddr_sco *addr;
1702 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 addr = (struct sockaddr_sco *)addr_ret;
1705 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1706 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001707 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 "wrong format");
1709 return 0;
1710 }
1711 straddr = PyBytes_AS_STRING(args);
1712 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1713 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 *len_ret = sizeof *addr;
1716 return 1;
1717 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001720 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 return 0;
1722 }
1723 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001724#endif
1725
Antoine Pitroub156a462010-10-27 20:13:57 +00001726#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 case AF_PACKET:
1728 {
1729 struct sockaddr_ll* addr;
1730 struct ifreq ifr;
1731 char *interfaceName;
1732 int protoNumber;
1733 int hatype = 0;
1734 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001735 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 if (!PyTuple_Check(args)) {
1738 PyErr_Format(
1739 PyExc_TypeError,
1740 "getsockaddrarg: "
1741 "AF_PACKET address must be tuple, not %.500s",
1742 Py_TYPE(args)->tp_name);
1743 return 0;
1744 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001745 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001747 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 return 0;
1749 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1750 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1751 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1752 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001753 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 return 0;
1755 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001756 if (haddr.buf && haddr.len > 8) {
1757 PyErr_SetString(PyExc_ValueError,
1758 "Hardware address must be 8 bytes or less");
1759 PyBuffer_Release(&haddr);
1760 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 }
1762 if (protoNumber < 0 || protoNumber > 0xffff) {
1763 PyErr_SetString(
1764 PyExc_OverflowError,
1765 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001766 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 return 0;
1768 }
1769 addr = (struct sockaddr_ll*)addr_ret;
1770 addr->sll_family = AF_PACKET;
1771 addr->sll_protocol = htons((short)protoNumber);
1772 addr->sll_ifindex = ifr.ifr_ifindex;
1773 addr->sll_pkttype = pkttype;
1774 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001775 if (haddr.buf) {
1776 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1777 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001779 else
1780 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001782 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 return 1;
1784 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001785#endif
1786
Christian Heimes043d6f62008-01-07 17:19:16 +00001787#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 case AF_TIPC:
1789 {
1790 unsigned int atype, v1, v2, v3;
1791 unsigned int scope = TIPC_CLUSTER_SCOPE;
1792 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 if (!PyTuple_Check(args)) {
1795 PyErr_Format(
1796 PyExc_TypeError,
1797 "getsockaddrarg: "
1798 "AF_TIPC address must be tuple, not %.500s",
1799 Py_TYPE(args)->tp_name);
1800 return 0;
1801 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 if (!PyArg_ParseTuple(args,
1804 "IIII|I;Invalid TIPC address format",
1805 &atype, &v1, &v2, &v3, &scope))
1806 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001807
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001808 addr = (struct sockaddr_tipc *) addr_ret;
1809 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001810
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 addr->family = AF_TIPC;
1812 addr->scope = scope;
1813 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 if (atype == TIPC_ADDR_NAMESEQ) {
1816 addr->addr.nameseq.type = v1;
1817 addr->addr.nameseq.lower = v2;
1818 addr->addr.nameseq.upper = v3;
1819 } else if (atype == TIPC_ADDR_NAME) {
1820 addr->addr.name.name.type = v1;
1821 addr->addr.name.name.instance = v2;
1822 } else if (atype == TIPC_ADDR_ID) {
1823 addr->addr.id.node = v1;
1824 addr->addr.id.ref = v2;
1825 } else {
1826 /* Shouldn't happen */
1827 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1828 return 0;
1829 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001833 return 1;
1834 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001835#endif
1836
Vinay Sajiped6783f2014-03-21 11:44:32 +00001837#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001838 case AF_CAN:
1839 switch (s->sock_proto) {
1840 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001841 /* fall-through */
1842 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001843 {
1844 struct sockaddr_can *addr;
1845 PyObject *interfaceName;
1846 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001847 Py_ssize_t len;
1848
Benjamin Peterson18b71912013-05-16 15:29:44 -05001849 addr = (struct sockaddr_can *)addr_ret;
1850
Charles-François Natali47413c12011-10-06 19:47:44 +02001851 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1852 &interfaceName))
1853 return 0;
1854
1855 len = PyBytes_GET_SIZE(interfaceName);
1856
1857 if (len == 0) {
1858 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001859 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001860 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1861 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001862 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1863 s->errorhandler();
1864 Py_DECREF(interfaceName);
1865 return 0;
1866 }
1867 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001868 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001869 "AF_CAN interface name too long");
1870 Py_DECREF(interfaceName);
1871 return 0;
1872 }
1873
1874 addr->can_family = AF_CAN;
1875 addr->can_ifindex = ifr.ifr_ifindex;
1876
1877 *len_ret = sizeof(*addr);
1878 Py_DECREF(interfaceName);
1879 return 1;
1880 }
1881 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001882 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001883 "getsockaddrarg: unsupported CAN protocol");
1884 return 0;
1885 }
1886#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001887
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001888#ifdef PF_SYSTEM
1889 case PF_SYSTEM:
1890 switch (s->sock_proto) {
1891#ifdef SYSPROTO_CONTROL
1892 case SYSPROTO_CONTROL:
1893 {
1894 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001895
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001896 addr = (struct sockaddr_ctl *)addr_ret;
1897 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001898 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001899
1900 if (PyUnicode_Check(args)) {
1901 struct ctl_info info;
1902 PyObject *ctl_name;
1903
1904 if (!PyArg_Parse(args, "O&",
1905 PyUnicode_FSConverter, &ctl_name)) {
1906 return 0;
1907 }
1908
Victor Stinnerf50e1872015-03-20 11:32:24 +01001909 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001910 PyErr_SetString(PyExc_ValueError,
1911 "provided string is too long");
1912 Py_DECREF(ctl_name);
1913 return 0;
1914 }
1915 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1916 sizeof(info.ctl_name));
1917 Py_DECREF(ctl_name);
1918
1919 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1920 PyErr_SetString(PyExc_OSError,
1921 "cannot find kernel control with provided name");
1922 return 0;
1923 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001924
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001925 addr->sc_id = info.ctl_id;
1926 addr->sc_unit = 0;
1927 } else if (!PyArg_ParseTuple(args, "II",
1928 &(addr->sc_id), &(addr->sc_unit))) {
1929 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1930 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001931
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001932 return 0;
1933 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001934
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001935 *len_ret = sizeof(*addr);
1936 return 1;
1937 }
1938#endif
1939 default:
1940 PyErr_SetString(PyExc_OSError,
1941 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1942 return 0;
1943 }
1944#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001949 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001953}
1954
Guido van Rossum30a685f1991-06-27 15:51:29 +00001955
Guido van Rossum48a680c2001-03-02 06:34:14 +00001956/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001957 Return 1 if the family is known, 0 otherwise. The length is returned
1958 through len_ret. */
1959
1960static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001961getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001964
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001965#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 case AF_UNIX:
1967 {
1968 *len_ret = sizeof (struct sockaddr_un);
1969 return 1;
1970 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001971#endif /* AF_UNIX */
Martin Panter6d57fe12016-09-17 03:26:16 +00001972
Martin v. Löwis11017b12006-01-14 18:12:57 +00001973#if defined(AF_NETLINK)
Martin Panter6d57fe12016-09-17 03:26:16 +00001974 case AF_NETLINK:
1975 {
1976 *len_ret = sizeof (struct sockaddr_nl);
1977 return 1;
1978 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001979#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001980
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001981#ifdef AF_RDS
1982 case AF_RDS:
1983 /* RDS sockets use sockaddr_in: fall-through */
1984#endif
1985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 case AF_INET:
1987 {
1988 *len_ret = sizeof (struct sockaddr_in);
1989 return 1;
1990 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001991
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001992#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 case AF_INET6:
1994 {
1995 *len_ret = sizeof (struct sockaddr_in6);
1996 return 1;
1997 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001998#endif
1999
Hye-Shik Chang81268602004-02-02 06:05:24 +00002000#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 case AF_BLUETOOTH:
2002 {
2003 switch(s->sock_proto)
2004 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002005
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002006 case BTPROTO_L2CAP:
2007 *len_ret = sizeof (struct sockaddr_l2);
2008 return 1;
2009 case BTPROTO_RFCOMM:
2010 *len_ret = sizeof (struct sockaddr_rc);
2011 return 1;
2012 case BTPROTO_HCI:
2013 *len_ret = sizeof (struct sockaddr_hci);
2014 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002015#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 case BTPROTO_SCO:
2017 *len_ret = sizeof (struct sockaddr_sco);
2018 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002020 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002021 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 "unknown BT protocol");
2023 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002025 }
2026 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002027#endif
2028
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002029#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002030 case AF_PACKET:
2031 {
2032 *len_ret = sizeof (struct sockaddr_ll);
2033 return 1;
2034 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002035#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002036
Christian Heimes043d6f62008-01-07 17:19:16 +00002037#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 case AF_TIPC:
2039 {
2040 *len_ret = sizeof (struct sockaddr_tipc);
2041 return 1;
2042 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002043#endif
2044
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002045#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002046 case AF_CAN:
2047 {
2048 *len_ret = sizeof (struct sockaddr_can);
2049 return 1;
2050 }
2051#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002052
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002053#ifdef PF_SYSTEM
2054 case PF_SYSTEM:
2055 switch(s->sock_proto) {
2056#ifdef SYSPROTO_CONTROL
2057 case SYSPROTO_CONTROL:
2058 *len_ret = sizeof (struct sockaddr_ctl);
2059 return 1;
2060#endif
2061 default:
2062 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2063 "unknown PF_SYSTEM protocol");
2064 return 0;
2065 }
2066#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002070 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002071 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002075}
2076
2077
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002078/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2079 Currently, these methods are only compiled if the RFC 2292/3542
2080 CMSG_LEN() macro is available. Older systems seem to have used
2081 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2082 it may be possible to define CMSG_LEN() that way if it's not
2083 provided. Some architectures might need extra padding after the
2084 cmsghdr, however, and CMSG_LEN() would have to take account of
2085 this. */
2086#ifdef CMSG_LEN
2087/* If length is in range, set *result to CMSG_LEN(length) and return
2088 true; otherwise, return false. */
2089static int
2090get_CMSG_LEN(size_t length, size_t *result)
2091{
2092 size_t tmp;
2093
2094 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2095 return 0;
2096 tmp = CMSG_LEN(length);
2097 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2098 return 0;
2099 *result = tmp;
2100 return 1;
2101}
2102
2103#ifdef CMSG_SPACE
2104/* If length is in range, set *result to CMSG_SPACE(length) and return
2105 true; otherwise, return false. */
2106static int
2107get_CMSG_SPACE(size_t length, size_t *result)
2108{
2109 size_t tmp;
2110
2111 /* Use CMSG_SPACE(1) here in order to take account of the padding
2112 necessary before *and* after the data. */
2113 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2114 return 0;
2115 tmp = CMSG_SPACE(length);
2116 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2117 return 0;
2118 *result = tmp;
2119 return 1;
2120}
2121#endif
2122
2123/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2124 pointer in msg->msg_control with at least "space" bytes after it,
2125 and its cmsg_len member inside the buffer. */
2126static int
2127cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2128{
2129 size_t cmsg_offset;
2130 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2131 sizeof(cmsgh->cmsg_len));
2132
Charles-François Natali466517d2011-08-28 18:23:43 +02002133 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002134 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002135 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002136 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2137 annoying under OS X as it's unsigned there and so it triggers a
2138 tautological comparison warning under Clang when compared against 0.
2139 Since the check is valid on other platforms, silence the warning under
2140 Clang. */
2141 #ifdef __clang__
2142 #pragma clang diagnostic push
2143 #pragma clang diagnostic ignored "-Wtautological-compare"
2144 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002145 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002146 #pragma GCC diagnostic push
2147 #pragma GCC diagnostic ignored "-Wtype-limits"
2148 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002149 if (msg->msg_controllen < 0)
2150 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002151 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002152 #pragma GCC diagnostic pop
2153 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002154 #ifdef __clang__
2155 #pragma clang diagnostic pop
2156 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002157 if (space < cmsg_len_end)
2158 space = cmsg_len_end;
2159 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2160 return (cmsg_offset <= (size_t)-1 - space &&
2161 cmsg_offset + space <= msg->msg_controllen);
2162}
2163
2164/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2165 *space to number of bytes following it in the buffer and return
2166 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2167 msg->msg_controllen are valid. */
2168static int
2169get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2170{
2171 size_t data_offset;
2172 char *data_ptr;
2173
2174 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2175 return 0;
2176 data_offset = data_ptr - (char *)msg->msg_control;
2177 if (data_offset > msg->msg_controllen)
2178 return 0;
2179 *space = msg->msg_controllen - data_offset;
2180 return 1;
2181}
2182
2183/* If cmsgh is invalid or not contained in the buffer pointed to by
2184 msg->msg_control, return -1. If cmsgh is valid and its associated
2185 data is entirely contained in the buffer, set *data_len to the
2186 length of the associated data and return 0. If only part of the
2187 associated data is contained in the buffer but cmsgh is otherwise
2188 valid, set *data_len to the length contained in the buffer and
2189 return 1. */
2190static int
2191get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2192{
2193 size_t space, cmsg_data_len;
2194
2195 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2196 cmsgh->cmsg_len < CMSG_LEN(0))
2197 return -1;
2198 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2199 if (!get_cmsg_data_space(msg, cmsgh, &space))
2200 return -1;
2201 if (space >= cmsg_data_len) {
2202 *data_len = cmsg_data_len;
2203 return 0;
2204 }
2205 *data_len = space;
2206 return 1;
2207}
2208#endif /* CMSG_LEN */
2209
2210
Victor Stinner31bf2d52015-04-01 21:57:09 +02002211struct sock_accept {
2212 socklen_t *addrlen;
2213 sock_addr_t *addrbuf;
2214 SOCKET_T result;
2215};
2216
2217#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2218/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2219static int accept4_works = -1;
2220#endif
2221
2222static int
2223sock_accept_impl(PySocketSockObject *s, void *data)
2224{
2225 struct sock_accept *ctx = data;
2226
2227#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2228 if (accept4_works != 0) {
2229 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2230 SOCK_CLOEXEC);
2231 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2232 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2233 accept4_works = (errno != ENOSYS);
2234 }
2235 }
2236 if (accept4_works == 0)
2237 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2238#else
2239 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2240#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002241
2242#ifdef MS_WINDOWS
2243 return (ctx->result != INVALID_SOCKET);
2244#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002245 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002246#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002247}
2248
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002249/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002250
Guido van Rossum73624e91994-10-10 17:59:00 +00002251static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002252sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002255 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 socklen_t addrlen;
2257 PyObject *sock = NULL;
2258 PyObject *addr = NULL;
2259 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002260 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 if (!getsockaddrlen(s, &addrlen))
2263 return NULL;
2264 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 if (!IS_SELECTABLE(s))
2267 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002268
Victor Stinner31bf2d52015-04-01 21:57:09 +02002269 ctx.addrlen = &addrlen;
2270 ctx.addrbuf = &addrbuf;
2271 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002273 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002274
Victor Stinnerdaf45552013-08-28 00:53:59 +02002275#ifdef MS_WINDOWS
2276 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2277 PyErr_SetFromWindowsErr(0);
2278 SOCKETCLOSE(newfd);
2279 goto finally;
2280 }
2281#else
2282
2283#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2284 if (!accept4_works)
2285#endif
2286 {
2287 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2288 SOCKETCLOSE(newfd);
2289 goto finally;
2290 }
2291 }
2292#endif
2293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 sock = PyLong_FromSocket_t(newfd);
2295 if (sock == NULL) {
2296 SOCKETCLOSE(newfd);
2297 goto finally;
2298 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2301 addrlen, s->sock_proto);
2302 if (addr == NULL)
2303 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002306
Guido van Rossum67f7a382002-06-06 21:08:16 +00002307finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 Py_XDECREF(sock);
2309 Py_XDECREF(addr);
2310 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002311}
2312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002313PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002314"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002315\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002316Wait for an incoming connection. Return a new socket file descriptor\n\
2317representing the connection, and the address of the client.\n\
2318For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319
Guido van Rossum11ba0942002-06-13 15:07:44 +00002320/* s.setblocking(flag) method. Argument:
2321 False -- non-blocking mode; same as settimeout(0)
2322 True -- blocking mode; same as settimeout(None)
2323*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002324
Guido van Rossum73624e91994-10-10 17:59:00 +00002325static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002326sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002327{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002328 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 block = PyLong_AsLong(arg);
2331 if (block == -1 && PyErr_Occurred())
2332 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002333
Victor Stinner9001d802015-04-06 23:06:01 +02002334 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 Py_INCREF(Py_None);
2338 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002339}
Guido van Rossume4485b01994-09-07 14:32:49 +00002340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002341PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002342"setblocking(flag)\n\
2343\n\
2344Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002345setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347
Victor Stinner71694d52015-03-28 01:18:54 +01002348static int
2349socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2350{
2351#ifdef MS_WINDOWS
2352 struct timeval tv;
2353#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002354#ifndef HAVE_POLL
2355 _PyTime_t ms;
2356#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002357 int overflow = 0;
2358
2359 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002360 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002361 return 0;
2362 }
2363
Victor Stinner869e1772015-03-30 03:49:14 +02002364 if (_PyTime_FromSecondsObject(timeout,
2365 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002366 return -1;
2367
2368 if (*timeout < 0) {
2369 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2370 return -1;
2371 }
2372
2373#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002374 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002375#endif
2376#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002377 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2378 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002379#endif
2380 if (overflow) {
2381 PyErr_SetString(PyExc_OverflowError,
2382 "timeout doesn't fit into C timeval");
2383 return -1;
2384 }
2385
2386 return 0;
2387}
2388
Guido van Rossum11ba0942002-06-13 15:07:44 +00002389/* s.settimeout(timeout) method. Argument:
2390 None -- no timeout, blocking mode; same as setblocking(True)
2391 0.0 -- non-blocking mode; same as setblocking(False)
2392 > 0 -- timeout mode; operations time out after timeout seconds
2393 < 0 -- illegal; raises an exception
2394*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002397{
Victor Stinner71694d52015-03-28 01:18:54 +01002398 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399
Victor Stinner71694d52015-03-28 01:18:54 +01002400 if (socket_parse_timeout(&timeout, arg) < 0)
2401 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002404 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 Py_INCREF(Py_None);
2407 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002408}
2409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002410PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002411"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002412\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002413Set a timeout on socket operations. 'timeout' can be a float,\n\
2414giving in seconds, or None. Setting a timeout of None disables\n\
2415the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002416Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002417
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002418/* s.gettimeout() method.
2419 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002422{
Victor Stinner71694d52015-03-28 01:18:54 +01002423 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 Py_INCREF(Py_None);
2425 return Py_None;
2426 }
Victor Stinner71694d52015-03-28 01:18:54 +01002427 else {
2428 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2429 return PyFloat_FromDouble(seconds);
2430 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002431}
2432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002433PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002434"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002435\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002436Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002437operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002438operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002439
Guido van Rossumaee08791992-09-08 09:05:33 +00002440/* s.setsockopt() method.
2441 With an integer third argument, sets an integer option.
2442 With a string third argument, sets an option from a buffer;
2443 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002444
Guido van Rossum73624e91994-10-10 17:59:00 +00002445static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002446sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002447{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 int level;
2449 int optname;
2450 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002451 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 if (PyArg_ParseTuple(args, "iii:setsockopt",
2455 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002456 res = setsockopt(s->sock_fd, level, optname,
2457 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 }
2459 else {
2460 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002461 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2462 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002464 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2465 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 if (res < 0)
2468 return s->errorhandler();
2469 Py_INCREF(Py_None);
2470 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002471}
2472
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002473PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002474"setsockopt(level, option, value)\n\
2475\n\
2476Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002477The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002478
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002479
Guido van Rossumaee08791992-09-08 09:05:33 +00002480/* s.getsockopt() method.
2481 With two arguments, retrieves an integer option.
2482 With a third integer argument, retrieves a string buffer of that size;
2483 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002484
Guido van Rossum73624e91994-10-10 17:59:00 +00002485static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002486sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002488 int level;
2489 int optname;
2490 int res;
2491 PyObject *buf;
2492 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2495 &level, &optname, &buflen))
2496 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 if (buflen == 0) {
2499 int flag = 0;
2500 socklen_t flagsize = sizeof flag;
2501 res = getsockopt(s->sock_fd, level, optname,
2502 (void *)&flag, &flagsize);
2503 if (res < 0)
2504 return s->errorhandler();
2505 return PyLong_FromLong(flag);
2506 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002508 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 "getsockopt buflen out of range");
2510 return NULL;
2511 }
2512 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2513 if (buf == NULL)
2514 return NULL;
2515 res = getsockopt(s->sock_fd, level, optname,
2516 (void *)PyBytes_AS_STRING(buf), &buflen);
2517 if (res < 0) {
2518 Py_DECREF(buf);
2519 return s->errorhandler();
2520 }
2521 _PyBytes_Resize(&buf, buflen);
2522 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002523}
2524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526"getsockopt(level, option[, buffersize]) -> value\n\
2527\n\
2528Get a socket option. See the Unix manual for level and option.\n\
2529If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002530string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002531
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002532
Fred Drake728819a2000-07-01 03:40:12 +00002533/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002534
Guido van Rossum73624e91994-10-10 17:59:00 +00002535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002536sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 sock_addr_t addrbuf;
2539 int addrlen;
2540 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2543 return NULL;
2544 Py_BEGIN_ALLOW_THREADS
2545 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2546 Py_END_ALLOW_THREADS
2547 if (res < 0)
2548 return s->errorhandler();
2549 Py_INCREF(Py_None);
2550 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002551}
2552
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002553PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002554"bind(address)\n\
2555\n\
2556Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002557pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002558sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002559
Guido van Rossum30a685f1991-06-27 15:51:29 +00002560
2561/* s.close() method.
2562 Set the file descriptor to -1 so operations tried subsequently
2563 will surely fail. */
2564
Guido van Rossum73624e91994-10-10 17:59:00 +00002565static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002566sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002569
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002570 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2571 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2572 * for more details.
2573 */
Victor Stinner524714e2016-07-22 17:43:59 +02002574 fd = s->sock_fd;
2575 if (fd != INVALID_SOCKET) {
2576 s->sock_fd = INVALID_SOCKET;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 Py_BEGIN_ALLOW_THREADS
2578 (void) SOCKETCLOSE(fd);
2579 Py_END_ALLOW_THREADS
2580 }
2581 Py_INCREF(Py_None);
2582 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002583}
2584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002585PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002586"close()\n\
2587\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002588Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002589
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002590static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002591sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002592{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002593 SOCKET_T fd = s->sock_fd;
Victor Stinner524714e2016-07-22 17:43:59 +02002594 s->sock_fd = INVALID_SOCKET;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002595 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002596}
2597
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002598PyDoc_STRVAR(detach_doc,
2599"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002600\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002601Close the socket object without closing the underlying file descriptor.\n\
2602The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002603can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002604
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002605static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002606sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002607{
Victor Stinner81c41db2015-04-02 11:50:57 +02002608 int err;
2609 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002610
Victor Stinner81c41db2015-04-02 11:50:57 +02002611 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2612 /* getsockopt() failed */
2613 return 0;
2614 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002615
Victor Stinner81c41db2015-04-02 11:50:57 +02002616 if (err == EISCONN)
2617 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002618 if (err != 0) {
2619 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2620 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002621 return 0;
2622 }
2623 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002624}
2625
2626static int
2627internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2628 int raise)
2629{
2630 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002631
2632 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002634 Py_END_ALLOW_THREADS
2635
Victor Stinner70a46f62015-03-31 22:03:59 +02002636 if (!res) {
2637 /* connect() succeeded, the socket is connected */
2638 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002640
Victor Stinner81c41db2015-04-02 11:50:57 +02002641 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002642
Victor Stinner81c41db2015-04-02 11:50:57 +02002643 /* save error, PyErr_CheckSignals() can replace it */
2644 err = GET_SOCK_ERROR;
2645 if (CHECK_ERRNO(EINTR)) {
2646 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002647 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002648
2649 /* Issue #23618: when connect() fails with EINTR, the connection is
2650 running asynchronously.
2651
2652 If the socket is blocking or has a timeout, wait until the
2653 connection completes, fails or timed out using select(), and then
2654 get the connection status using getsockopt(SO_ERROR).
2655
2656 If the socket is non-blocking, raise InterruptedError. The caller is
2657 responsible to wait until the connection completes, fails or timed
2658 out (it's the case in asyncio for example). */
2659 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2660 }
2661 else {
2662 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2663 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002664 }
2665
Victor Stinner81c41db2015-04-02 11:50:57 +02002666 if (!wait_connect) {
2667 if (raise) {
2668 /* restore error, maybe replaced by PyErr_CheckSignals() */
2669 SET_SOCK_ERROR(err);
2670 s->errorhandler();
2671 return -1;
2672 }
2673 else
2674 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002675 }
2676
Victor Stinner81c41db2015-04-02 11:50:57 +02002677 if (raise) {
2678 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002679 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2680 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002681 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002682 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002683 else {
2684 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002685 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2686 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002687 return err;
2688 }
2689 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002690}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002691
Fred Drake728819a2000-07-01 03:40:12 +00002692/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002693
Guido van Rossum73624e91994-10-10 17:59:00 +00002694static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002695sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 sock_addr_t addrbuf;
2698 int addrlen;
2699 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2702 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Victor Stinner81c41db2015-04-02 11:50:57 +02002704 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002705 if (res < 0)
2706 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002707
Victor Stinneree699e92015-03-31 21:28:42 +02002708 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002709}
2710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002712"connect(address)\n\
2713\n\
2714Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002715is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002716
Guido van Rossum30a685f1991-06-27 15:51:29 +00002717
Fred Drake728819a2000-07-01 03:40:12 +00002718/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002719
2720static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002721sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 sock_addr_t addrbuf;
2724 int addrlen;
2725 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2728 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729
Victor Stinner81c41db2015-04-02 11:50:57 +02002730 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002731 if (res < 0)
2732 return NULL;
2733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002735}
2736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002737PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002738"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739\n\
2740This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002743
Guido van Rossumed233a51992-06-23 09:07:03 +00002744/* s.fileno() method */
2745
Guido van Rossum73624e91994-10-10 17:59:00 +00002746static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002747sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002750}
2751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753"fileno() -> integer\n\
2754\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002755Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002756
Guido van Rossumed233a51992-06-23 09:07:03 +00002757
Guido van Rossumc89705d1992-11-26 08:54:07 +00002758/* s.getsockname() method */
2759
Guido van Rossum73624e91994-10-10 17:59:00 +00002760static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002761sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002762{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 sock_addr_t addrbuf;
2764 int res;
2765 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 if (!getsockaddrlen(s, &addrlen))
2768 return NULL;
2769 memset(&addrbuf, 0, addrlen);
2770 Py_BEGIN_ALLOW_THREADS
2771 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2772 Py_END_ALLOW_THREADS
2773 if (res < 0)
2774 return s->errorhandler();
2775 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2776 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002777}
2778
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002779PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002780"getsockname() -> address info\n\
2781\n\
2782Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002783info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002784
Guido van Rossumc89705d1992-11-26 08:54:07 +00002785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002787/* s.getpeername() method */
2788
Guido van Rossum73624e91994-10-10 17:59:00 +00002789static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002790sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 sock_addr_t addrbuf;
2793 int res;
2794 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 if (!getsockaddrlen(s, &addrlen))
2797 return NULL;
2798 memset(&addrbuf, 0, addrlen);
2799 Py_BEGIN_ALLOW_THREADS
2800 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2801 Py_END_ALLOW_THREADS
2802 if (res < 0)
2803 return s->errorhandler();
2804 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2805 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002806}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002808PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002809"getpeername() -> address info\n\
2810\n\
2811Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002812info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002813
Guido van Rossumb6775db1994-08-01 11:34:53 +00002814#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002815
2816
Guido van Rossum30a685f1991-06-27 15:51:29 +00002817/* s.listen(n) method */
2818
Guido van Rossum73624e91994-10-10 17:59:00 +00002819static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002820sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002821{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002822 /* We try to choose a default backlog high enough to avoid connection drops
2823 * for common workloads, yet not too high to limit resource usage. */
2824 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002826
Charles-François Natali644b8f52014-05-22 19:45:39 +01002827 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002831 /* To avoid problems on systems that don't allow a negative backlog
2832 * (which doesn't make sense anyway) we force a minimum value of 0. */
2833 if (backlog < 0)
2834 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 res = listen(s->sock_fd, backlog);
2836 Py_END_ALLOW_THREADS
2837 if (res < 0)
2838 return s->errorhandler();
2839 Py_INCREF(Py_None);
2840 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002841}
2842
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002843PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002844"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002845\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002846Enable a server to accept connections. If backlog is specified, it must be\n\
2847at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002848unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002849connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002850
Victor Stinner31bf2d52015-04-01 21:57:09 +02002851struct sock_recv {
2852 char *cbuf;
2853 Py_ssize_t len;
2854 int flags;
2855 Py_ssize_t result;
2856};
2857
2858static int
2859sock_recv_impl(PySocketSockObject *s, void *data)
2860{
2861 struct sock_recv *ctx = data;
2862
2863#ifdef MS_WINDOWS
2864 if (ctx->len > INT_MAX)
2865 ctx->len = INT_MAX;
2866 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2867#else
2868 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2869#endif
2870 return (ctx->result >= 0);
2871}
2872
Guido van Rossum82a5c661998-07-07 20:45:43 +00002873
Thomas Wouters477c8d52006-05-27 19:21:47 +00002874/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002875 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002876 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002878 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002879 * also possible that we return a number of bytes smaller than the request
2880 * bytes.
2881 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002882
Antoine Pitrou19467d22010-08-17 19:33:30 +00002883static Py_ssize_t
2884sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002885{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002886 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 if (!IS_SELECTABLE(s)) {
2889 select_error();
2890 return -1;
2891 }
2892 if (len == 0) {
2893 /* If 0 bytes were requested, do nothing. */
2894 return 0;
2895 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896
Victor Stinner31bf2d52015-04-01 21:57:09 +02002897 ctx.cbuf = cbuf;
2898 ctx.len = len;
2899 ctx.flags = flags;
2900 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002901 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002902
2903 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002904}
2905
Guido van Rossum48a680c2001-03-02 06:34:14 +00002906
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002907/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002908
Guido van Rossum73624e91994-10-10 17:59:00 +00002909static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002910sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002911{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002912 Py_ssize_t recvlen, outlen;
2913 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002915
Antoine Pitrou19467d22010-08-17 19:33:30 +00002916 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 if (recvlen < 0) {
2920 PyErr_SetString(PyExc_ValueError,
2921 "negative buffersize in recv");
2922 return NULL;
2923 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 /* Allocate a new string. */
2926 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2927 if (buf == NULL)
2928 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 /* Call the guts */
2931 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2932 if (outlen < 0) {
2933 /* An error occurred, release the string and return an
2934 error. */
2935 Py_DECREF(buf);
2936 return NULL;
2937 }
2938 if (outlen != recvlen) {
2939 /* We did not read as many bytes as we anticipated, resize the
2940 string if possible and be successful. */
2941 _PyBytes_Resize(&buf, outlen);
2942 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002945}
2946
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002947PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002948"recv(buffersize[, flags]) -> data\n\
2949\n\
2950Receive up to buffersize bytes from the socket. For the optional flags\n\
2951argument, see the Unix manual. When no data is available, block until\n\
2952at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002953the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002954
Guido van Rossum30a685f1991-06-27 15:51:29 +00002955
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002956/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002957
Thomas Wouters477c8d52006-05-27 19:21:47 +00002958static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002959sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002962
Antoine Pitrou19467d22010-08-17 19:33:30 +00002963 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 Py_buffer pbuf;
2965 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002966 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002969 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 &pbuf, &recvlen, &flags))
2971 return NULL;
2972 buf = pbuf.buf;
2973 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 if (recvlen < 0) {
2976 PyBuffer_Release(&pbuf);
2977 PyErr_SetString(PyExc_ValueError,
2978 "negative buffersize in recv_into");
2979 return NULL;
2980 }
2981 if (recvlen == 0) {
2982 /* If nbytes was not specified, use the buffer's length */
2983 recvlen = buflen;
2984 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 /* Check if the buffer is large enough */
2987 if (buflen < recvlen) {
2988 PyBuffer_Release(&pbuf);
2989 PyErr_SetString(PyExc_ValueError,
2990 "buffer too small for requested bytes");
2991 return NULL;
2992 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 /* Call the guts */
2995 readlen = sock_recv_guts(s, buf, recvlen, flags);
2996 if (readlen < 0) {
2997 /* Return an error. */
2998 PyBuffer_Release(&pbuf);
2999 return NULL;
3000 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 PyBuffer_Release(&pbuf);
3003 /* Return the number of bytes read. Note that we do not do anything
3004 special here in the case that readlen < recvlen. */
3005 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003006}
3007
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003008PyDoc_STRVAR(recv_into_doc,
3009"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003010\n\
3011A version of recv() that stores its data into a buffer rather than creating \n\
3012a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3013is not specified (or 0), receive up to the size available in the given buffer.\n\
3014\n\
3015See recv() for documentation about the flags.");
3016
Victor Stinner31bf2d52015-04-01 21:57:09 +02003017struct sock_recvfrom {
3018 char* cbuf;
3019 Py_ssize_t len;
3020 int flags;
3021 socklen_t *addrlen;
3022 sock_addr_t *addrbuf;
3023 Py_ssize_t result;
3024};
3025
3026static int
3027sock_recvfrom_impl(PySocketSockObject *s, void *data)
3028{
3029 struct sock_recvfrom *ctx = data;
3030
3031 memset(ctx->addrbuf, 0, *ctx->addrlen);
3032
3033#ifdef MS_WINDOWS
3034 if (ctx->len > INT_MAX)
3035 ctx->len = INT_MAX;
3036 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3037 SAS2SA(ctx->addrbuf), ctx->addrlen);
3038#else
3039 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3040 SAS2SA(ctx->addrbuf), ctx->addrlen);
3041#endif
3042 return (ctx->result >= 0);
3043}
3044
Thomas Wouters477c8d52006-05-27 19:21:47 +00003045
3046/*
Christian Heimes99170a52007-12-19 02:07:34 +00003047 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3048 * into a char buffer. If you have any inc/def ref to do to the objects that
3049 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003050 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003051 * that it is also possible that we return a number of bytes smaller than the
3052 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003053 *
3054 * 'addr' is a return value for the address object. Note that you must decref
3055 * it yourself.
3056 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003057static Py_ssize_t
3058sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003059 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003062 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003063 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003065 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 if (!getsockaddrlen(s, &addrlen))
3068 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 if (!IS_SELECTABLE(s)) {
3071 select_error();
3072 return -1;
3073 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003074
Victor Stinner31bf2d52015-04-01 21:57:09 +02003075 ctx.cbuf = cbuf;
3076 ctx.len = len;
3077 ctx.flags = flags;
3078 ctx.addrbuf = &addrbuf;
3079 ctx.addrlen = &addrlen;
3080 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003082
Victor Stinner31bf2d52015-04-01 21:57:09 +02003083 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3084 s->sock_proto);
3085 if (*addr == NULL)
3086 return -1;
3087
3088 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003089}
3090
3091/* s.recvfrom(nbytes [,flags]) method */
3092
3093static PyObject *
3094sock_recvfrom(PySocketSockObject *s, PyObject *args)
3095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 PyObject *buf = NULL;
3097 PyObject *addr = NULL;
3098 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003099 int flags = 0;
3100 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003101
Antoine Pitrou19467d22010-08-17 19:33:30 +00003102 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 if (recvlen < 0) {
3106 PyErr_SetString(PyExc_ValueError,
3107 "negative buffersize in recvfrom");
3108 return NULL;
3109 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003111 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3112 if (buf == NULL)
3113 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3116 recvlen, flags, &addr);
3117 if (outlen < 0) {
3118 goto finally;
3119 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 if (outlen != recvlen) {
3122 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003123 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003125 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 goto finally;
3127 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003130
3131finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 Py_XDECREF(buf);
3133 Py_XDECREF(addr);
3134 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003135}
3136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003137PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003138"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3139\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003140Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003141
Thomas Wouters477c8d52006-05-27 19:21:47 +00003142
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003143/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003144
3145static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003146sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003148 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003149
Antoine Pitrou19467d22010-08-17 19:33:30 +00003150 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 Py_buffer pbuf;
3152 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003153 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003156
Antoine Pitrou19467d22010-08-17 19:33:30 +00003157 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003158 kwlist, &pbuf,
3159 &recvlen, &flags))
3160 return NULL;
3161 buf = pbuf.buf;
3162 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 if (recvlen < 0) {
3165 PyBuffer_Release(&pbuf);
3166 PyErr_SetString(PyExc_ValueError,
3167 "negative buffersize in recvfrom_into");
3168 return NULL;
3169 }
3170 if (recvlen == 0) {
3171 /* If nbytes was not specified, use the buffer's length */
3172 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003173 } else if (recvlen > buflen) {
3174 PyBuffer_Release(&pbuf);
3175 PyErr_SetString(PyExc_ValueError,
3176 "nbytes is greater than the length of the buffer");
3177 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003178 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003180 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3181 if (readlen < 0) {
3182 PyBuffer_Release(&pbuf);
3183 /* Return an error */
3184 Py_XDECREF(addr);
3185 return NULL;
3186 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003187
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003188 PyBuffer_Release(&pbuf);
3189 /* Return the number of bytes read and the address. Note that we do
3190 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003191 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003192}
3193
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003194PyDoc_STRVAR(recvfrom_into_doc,
3195"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003196\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003197Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003198
Victor Stinner35bee932015-04-02 12:28:07 +02003199/* The sendmsg() and recvmsg[_into]() methods require a working
3200 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3201#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003202struct sock_recvmsg {
3203 struct msghdr *msg;
3204 int flags;
3205 ssize_t result;
3206};
3207
3208static int
3209sock_recvmsg_impl(PySocketSockObject *s, void *data)
3210{
3211 struct sock_recvmsg *ctx = data;
3212
3213 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3214 return (ctx->result >= 0);
3215}
3216
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003217/*
3218 * Call recvmsg() with the supplied iovec structures, flags, and
3219 * ancillary data buffer size (controllen). Returns the tuple return
3220 * value for recvmsg() or recvmsg_into(), with the first item provided
3221 * by the supplied makeval() function. makeval() will be called with
3222 * the length read and makeval_data as arguments, and must return a
3223 * new reference (which will be decrefed if there is a subsequent
3224 * error). On error, closes any file descriptors received via
3225 * SCM_RIGHTS.
3226 */
3227static PyObject *
3228sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3229 int flags, Py_ssize_t controllen,
3230 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3231{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003232 sock_addr_t addrbuf;
3233 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003234 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003235 PyObject *cmsg_list = NULL, *retval = NULL;
3236 void *controlbuf = NULL;
3237 struct cmsghdr *cmsgh;
3238 size_t cmsgdatalen = 0;
3239 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003240 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003241
3242 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3243 ignored" when the socket is connected (Linux fills them in
3244 anyway for AF_UNIX sockets at least). Normally msg_namelen
3245 seems to be set to 0 if there's no address, but try to
3246 initialize msg_name to something that won't be mistaken for a
3247 real address if that doesn't happen. */
3248 if (!getsockaddrlen(s, &addrbuflen))
3249 return NULL;
3250 memset(&addrbuf, 0, addrbuflen);
3251 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3252
3253 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3254 PyErr_SetString(PyExc_ValueError,
3255 "invalid ancillary data buffer length");
3256 return NULL;
3257 }
3258 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3259 return PyErr_NoMemory();
3260
3261 /* Make the system call. */
3262 if (!IS_SELECTABLE(s)) {
3263 select_error();
3264 goto finally;
3265 }
3266
Victor Stinner31bf2d52015-04-01 21:57:09 +02003267 msg.msg_name = SAS2SA(&addrbuf);
3268 msg.msg_namelen = addrbuflen;
3269 msg.msg_iov = iov;
3270 msg.msg_iovlen = iovlen;
3271 msg.msg_control = controlbuf;
3272 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003273
Victor Stinner31bf2d52015-04-01 21:57:09 +02003274 ctx.msg = &msg;
3275 ctx.flags = flags;
3276 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003277 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003278
3279 /* Make list of (level, type, data) tuples from control messages. */
3280 if ((cmsg_list = PyList_New(0)) == NULL)
3281 goto err_closefds;
3282 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3283 implementations didn't do so. */
3284 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3285 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3286 PyObject *bytes, *tuple;
3287 int tmp;
3288
3289 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3290 if (cmsg_status != 0) {
3291 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3292 "received malformed or improperly-truncated "
3293 "ancillary data", 1) == -1)
3294 goto err_closefds;
3295 }
3296 if (cmsg_status < 0)
3297 break;
3298 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003299 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003300 goto err_closefds;
3301 }
3302
3303 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3304 cmsgdatalen);
3305 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3306 (int)cmsgh->cmsg_type, bytes);
3307 if (tuple == NULL)
3308 goto err_closefds;
3309 tmp = PyList_Append(cmsg_list, tuple);
3310 Py_DECREF(tuple);
3311 if (tmp != 0)
3312 goto err_closefds;
3313
3314 if (cmsg_status != 0)
3315 break;
3316 }
3317
3318 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003319 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003320 cmsg_list,
3321 (int)msg.msg_flags,
3322 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3323 ((msg.msg_namelen > addrbuflen) ?
3324 addrbuflen : msg.msg_namelen),
3325 s->sock_proto));
3326 if (retval == NULL)
3327 goto err_closefds;
3328
3329finally:
3330 Py_XDECREF(cmsg_list);
3331 PyMem_Free(controlbuf);
3332 return retval;
3333
3334err_closefds:
3335#ifdef SCM_RIGHTS
3336 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3337 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3338 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3339 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3340 if (cmsg_status < 0)
3341 break;
3342 if (cmsgh->cmsg_level == SOL_SOCKET &&
3343 cmsgh->cmsg_type == SCM_RIGHTS) {
3344 size_t numfds;
3345 int *fdp;
3346
3347 numfds = cmsgdatalen / sizeof(int);
3348 fdp = (int *)CMSG_DATA(cmsgh);
3349 while (numfds-- > 0)
3350 close(*fdp++);
3351 }
3352 if (cmsg_status != 0)
3353 break;
3354 }
3355#endif /* SCM_RIGHTS */
3356 goto finally;
3357}
3358
3359
3360static PyObject *
3361makeval_recvmsg(ssize_t received, void *data)
3362{
3363 PyObject **buf = data;
3364
3365 if (received < PyBytes_GET_SIZE(*buf))
3366 _PyBytes_Resize(buf, received);
3367 Py_XINCREF(*buf);
3368 return *buf;
3369}
3370
3371/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3372
3373static PyObject *
3374sock_recvmsg(PySocketSockObject *s, PyObject *args)
3375{
3376 Py_ssize_t bufsize, ancbufsize = 0;
3377 int flags = 0;
3378 struct iovec iov;
3379 PyObject *buf = NULL, *retval = NULL;
3380
3381 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3382 return NULL;
3383
3384 if (bufsize < 0) {
3385 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3386 return NULL;
3387 }
3388 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3389 return NULL;
3390 iov.iov_base = PyBytes_AS_STRING(buf);
3391 iov.iov_len = bufsize;
3392
3393 /* Note that we're passing a pointer to *our pointer* to the bytes
3394 object here (&buf); makeval_recvmsg() may incref the object, or
3395 deallocate it and set our pointer to NULL. */
3396 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3397 &makeval_recvmsg, &buf);
3398 Py_XDECREF(buf);
3399 return retval;
3400}
3401
3402PyDoc_STRVAR(recvmsg_doc,
3403"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3404\n\
3405Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3406socket. The ancbufsize argument sets the size in bytes of the\n\
3407internal buffer used to receive the ancillary data; it defaults to 0,\n\
3408meaning that no ancillary data will be received. Appropriate buffer\n\
3409sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3410CMSG_LEN(), and items which do not fit into the buffer might be\n\
3411truncated or discarded. The flags argument defaults to 0 and has the\n\
3412same meaning as for recv().\n\
3413\n\
3414The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3415The data item is a bytes object holding the non-ancillary data\n\
3416received. The ancdata item is a list of zero or more tuples\n\
3417(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3418(control messages) received: cmsg_level and cmsg_type are integers\n\
3419specifying the protocol level and protocol-specific type respectively,\n\
3420and cmsg_data is a bytes object holding the associated data. The\n\
3421msg_flags item is the bitwise OR of various flags indicating\n\
3422conditions on the received message; see your system documentation for\n\
3423details. If the receiving socket is unconnected, address is the\n\
3424address of the sending socket, if available; otherwise, its value is\n\
3425unspecified.\n\
3426\n\
3427If recvmsg() raises an exception after the system call returns, it\n\
3428will first attempt to close any file descriptors received via the\n\
3429SCM_RIGHTS mechanism.");
3430
3431
3432static PyObject *
3433makeval_recvmsg_into(ssize_t received, void *data)
3434{
3435 return PyLong_FromSsize_t(received);
3436}
3437
3438/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3439
3440static PyObject *
3441sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3442{
3443 Py_ssize_t ancbufsize = 0;
3444 int flags = 0;
3445 struct iovec *iovs = NULL;
3446 Py_ssize_t i, nitems, nbufs = 0;
3447 Py_buffer *bufs = NULL;
3448 PyObject *buffers_arg, *fast, *retval = NULL;
3449
3450 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3451 &buffers_arg, &ancbufsize, &flags))
3452 return NULL;
3453
3454 if ((fast = PySequence_Fast(buffers_arg,
3455 "recvmsg_into() argument 1 must be an "
3456 "iterable")) == NULL)
3457 return NULL;
3458 nitems = PySequence_Fast_GET_SIZE(fast);
3459 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003460 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003461 goto finally;
3462 }
3463
3464 /* Fill in an iovec for each item, and save the Py_buffer
3465 structs to release afterwards. */
3466 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3467 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3468 PyErr_NoMemory();
3469 goto finally;
3470 }
3471 for (; nbufs < nitems; nbufs++) {
3472 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3473 "w*;recvmsg_into() argument 1 must be an iterable "
3474 "of single-segment read-write buffers",
3475 &bufs[nbufs]))
3476 goto finally;
3477 iovs[nbufs].iov_base = bufs[nbufs].buf;
3478 iovs[nbufs].iov_len = bufs[nbufs].len;
3479 }
3480
3481 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3482 &makeval_recvmsg_into, NULL);
3483finally:
3484 for (i = 0; i < nbufs; i++)
3485 PyBuffer_Release(&bufs[i]);
3486 PyMem_Free(bufs);
3487 PyMem_Free(iovs);
3488 Py_DECREF(fast);
3489 return retval;
3490}
3491
3492PyDoc_STRVAR(recvmsg_into_doc,
3493"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3494\n\
3495Receive normal data and ancillary data from the socket, scattering the\n\
3496non-ancillary data into a series of buffers. The buffers argument\n\
3497must be an iterable of objects that export writable buffers\n\
3498(e.g. bytearray objects); these will be filled with successive chunks\n\
3499of the non-ancillary data until it has all been written or there are\n\
3500no more buffers. The ancbufsize argument sets the size in bytes of\n\
3501the internal buffer used to receive the ancillary data; it defaults to\n\
35020, meaning that no ancillary data will be received. Appropriate\n\
3503buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3504or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3505truncated or discarded. The flags argument defaults to 0 and has the\n\
3506same meaning as for recv().\n\
3507\n\
3508The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3509The nbytes item is the total number of bytes of non-ancillary data\n\
3510written into the buffers. The ancdata item is a list of zero or more\n\
3511tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3512data (control messages) received: cmsg_level and cmsg_type are\n\
3513integers specifying the protocol level and protocol-specific type\n\
3514respectively, and cmsg_data is a bytes object holding the associated\n\
3515data. The msg_flags item is the bitwise OR of various flags\n\
3516indicating conditions on the received message; see your system\n\
3517documentation for details. If the receiving socket is unconnected,\n\
3518address is the address of the sending socket, if available; otherwise,\n\
3519its value is unspecified.\n\
3520\n\
3521If recvmsg_into() raises an exception after the system call returns,\n\
3522it will first attempt to close any file descriptors received via the\n\
3523SCM_RIGHTS mechanism.");
3524#endif /* CMSG_LEN */
3525
3526
Victor Stinner31bf2d52015-04-01 21:57:09 +02003527struct sock_send {
3528 char *buf;
3529 Py_ssize_t len;
3530 int flags;
3531 Py_ssize_t result;
3532};
3533
3534static int
3535sock_send_impl(PySocketSockObject *s, void *data)
3536{
3537 struct sock_send *ctx = data;
3538
3539#ifdef MS_WINDOWS
3540 if (ctx->len > INT_MAX)
3541 ctx->len = INT_MAX;
3542 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3543#else
3544 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3545#endif
3546 return (ctx->result >= 0);
3547}
3548
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003549/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003550
Guido van Rossum73624e91994-10-10 17:59:00 +00003551static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003552sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003553{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003554 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003556 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3559 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 if (!IS_SELECTABLE(s)) {
3562 PyBuffer_Release(&pbuf);
3563 return select_error();
3564 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003565 ctx.buf = pbuf.buf;
3566 ctx.len = pbuf.len;
3567 ctx.flags = flags;
3568 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003569 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003570 return NULL;
3571 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003572 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003573
3574 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003575}
3576
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003577PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003578"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003579\n\
3580Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003581argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003582sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003583
3584
3585/* s.sendall(data [,flags]) method */
3586
3587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003588sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003591 Py_ssize_t len, n;
3592 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003593 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003594 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003595 int has_timeout = (s->sock_timeout > 0);
3596 _PyTime_t interval = s->sock_timeout;
3597 _PyTime_t deadline = 0;
3598 int deadline_initialized = 0;
3599 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3602 return NULL;
3603 buf = pbuf.buf;
3604 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 if (!IS_SELECTABLE(s)) {
3607 PyBuffer_Release(&pbuf);
3608 return select_error();
3609 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003611 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003612 if (has_timeout) {
3613 if (deadline_initialized) {
3614 /* recompute the timeout */
3615 interval = deadline - _PyTime_GetMonotonicClock();
3616 }
3617 else {
3618 deadline_initialized = 1;
3619 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3620 }
3621
3622 if (interval <= 0) {
3623 PyErr_SetString(socket_timeout, "timed out");
3624 goto done;
3625 }
3626 }
3627
Victor Stinner02f32ab2015-04-01 22:53:26 +02003628 ctx.buf = buf;
3629 ctx.len = len;
3630 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003631 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3632 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003633 n = ctx.result;
3634 assert(n >= 0);
3635
3636 buf += n;
3637 len -= n;
3638
3639 /* We must run our signal handlers before looping again.
3640 send() can return a successful partial write when it is
3641 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003642 if (PyErr_CheckSignals())
3643 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003644 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003645 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003646
Victor Stinner8912d142015-04-06 23:16:34 +02003647 Py_INCREF(Py_None);
3648 res = Py_None;
3649
3650done:
3651 PyBuffer_Release(&pbuf);
3652 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003653}
3654
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003655PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003656"sendall(data[, flags])\n\
3657\n\
3658Send a data string to the socket. For the optional flags\n\
3659argument, see the Unix manual. This calls send() repeatedly\n\
3660until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003661to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003662
Guido van Rossum30a685f1991-06-27 15:51:29 +00003663
Victor Stinner31bf2d52015-04-01 21:57:09 +02003664struct sock_sendto {
3665 char *buf;
3666 Py_ssize_t len;
3667 int flags;
3668 int addrlen;
3669 sock_addr_t *addrbuf;
3670 Py_ssize_t result;
3671};
3672
3673static int
3674sock_sendto_impl(PySocketSockObject *s, void *data)
3675{
3676 struct sock_sendto *ctx = data;
3677
3678#ifdef MS_WINDOWS
3679 if (ctx->len > INT_MAX)
3680 ctx->len = INT_MAX;
3681 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3682 SAS2SA(ctx->addrbuf), ctx->addrlen);
3683#else
3684 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3685 SAS2SA(ctx->addrbuf), ctx->addrlen);
3686#endif
3687 return (ctx->result >= 0);
3688}
3689
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003690/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003691
Guido van Rossum73624e91994-10-10 17:59:00 +00003692static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003693sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 Py_buffer pbuf;
3696 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003697 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003698 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003699 int addrlen, flags;
3700 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003702 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003703 arglen = PyTuple_Size(args);
3704 switch (arglen) {
3705 case 2:
3706 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3707 break;
3708 case 3:
3709 PyArg_ParseTuple(args, "y*iO:sendto",
3710 &pbuf, &flags, &addro);
3711 break;
3712 default:
3713 PyErr_Format(PyExc_TypeError,
3714 "sendto() takes 2 or 3 arguments (%d given)",
3715 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003716 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003717 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003718 if (PyErr_Occurred())
3719 return NULL;
3720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003721 if (!IS_SELECTABLE(s)) {
3722 PyBuffer_Release(&pbuf);
3723 return select_error();
3724 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003726 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3727 PyBuffer_Release(&pbuf);
3728 return NULL;
3729 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003730
Victor Stinner31bf2d52015-04-01 21:57:09 +02003731 ctx.buf = pbuf.buf;
3732 ctx.len = pbuf.len;
3733 ctx.flags = flags;
3734 ctx.addrlen = addrlen;
3735 ctx.addrbuf = &addrbuf;
3736 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003737 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003738 return NULL;
3739 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003740 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003741
3742 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003743}
3744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003745PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003746"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003747\n\
3748Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003749For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003750
Guido van Rossum30a685f1991-06-27 15:51:29 +00003751
Victor Stinner35bee932015-04-02 12:28:07 +02003752/* The sendmsg() and recvmsg[_into]() methods require a working
3753 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3754#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003755struct sock_sendmsg {
3756 struct msghdr *msg;
3757 int flags;
3758 ssize_t result;
3759};
3760
3761static int
3762sock_sendmsg_impl(PySocketSockObject *s, void *data)
3763{
3764 struct sock_sendmsg *ctx = data;
3765
3766 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3767 return (ctx->result >= 0);
3768}
3769
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003770/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3771
3772static PyObject *
3773sock_sendmsg(PySocketSockObject *s, PyObject *args)
3774{
3775 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3776 Py_buffer *databufs = NULL;
3777 struct iovec *iovs = NULL;
3778 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003779 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003780 struct cmsginfo {
3781 int level;
3782 int type;
3783 Py_buffer data;
3784 } *cmsgs = NULL;
3785 void *controlbuf = NULL;
3786 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003787 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003788 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3789 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003790 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003791
3792 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3793 &data_arg, &cmsg_arg, &flags, &addr_arg))
3794 return NULL;
3795
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003796 /* Parse destination address. */
3797 if (addr_arg != NULL && addr_arg != Py_None) {
3798 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3799 goto finally;
3800 msg.msg_name = &addrbuf;
3801 msg.msg_namelen = addrlen;
3802 }
3803
3804 /* Fill in an iovec for each message part, and save the Py_buffer
3805 structs to release afterwards. */
3806 if ((data_fast = PySequence_Fast(data_arg,
3807 "sendmsg() argument 1 must be an "
3808 "iterable")) == NULL)
3809 goto finally;
3810 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3811 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003812 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003813 goto finally;
3814 }
3815 msg.msg_iovlen = ndataparts;
3816 if (ndataparts > 0 &&
3817 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3818 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3819 PyErr_NoMemory();
3820 goto finally;
3821 }
3822 for (; ndatabufs < ndataparts; ndatabufs++) {
3823 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3824 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003825 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003826 &databufs[ndatabufs]))
3827 goto finally;
3828 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3829 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3830 }
3831
3832 if (cmsg_arg == NULL)
3833 ncmsgs = 0;
3834 else {
3835 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3836 "sendmsg() argument 2 must be an "
3837 "iterable")) == NULL)
3838 goto finally;
3839 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3840 }
3841
3842#ifndef CMSG_SPACE
3843 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003844 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003845 "sending multiple control messages is not supported "
3846 "on this system");
3847 goto finally;
3848 }
3849#endif
3850 /* Save level, type and Py_buffer for each control message,
3851 and calculate total size. */
3852 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3853 PyErr_NoMemory();
3854 goto finally;
3855 }
3856 controllen = controllen_last = 0;
3857 while (ncmsgbufs < ncmsgs) {
3858 size_t bufsize, space;
3859
3860 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3861 "(iiy*):[sendmsg() ancillary data items]",
3862 &cmsgs[ncmsgbufs].level,
3863 &cmsgs[ncmsgbufs].type,
3864 &cmsgs[ncmsgbufs].data))
3865 goto finally;
3866 bufsize = cmsgs[ncmsgbufs++].data.len;
3867
3868#ifdef CMSG_SPACE
3869 if (!get_CMSG_SPACE(bufsize, &space)) {
3870#else
3871 if (!get_CMSG_LEN(bufsize, &space)) {
3872#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003873 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003874 goto finally;
3875 }
3876 controllen += space;
3877 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003878 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003879 goto finally;
3880 }
3881 controllen_last = controllen;
3882 }
3883
3884 /* Construct ancillary data block from control message info. */
3885 if (ncmsgbufs > 0) {
3886 struct cmsghdr *cmsgh = NULL;
3887
3888 if ((msg.msg_control = controlbuf =
3889 PyMem_Malloc(controllen)) == NULL) {
3890 PyErr_NoMemory();
3891 goto finally;
3892 }
3893 msg.msg_controllen = controllen;
3894
3895 /* Need to zero out the buffer as a workaround for glibc's
3896 CMSG_NXTHDR() implementation. After getting the pointer to
3897 the next header, it checks its (uninitialized) cmsg_len
3898 member to see if the "message" fits in the buffer, and
3899 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003900 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003901 memset(controlbuf, 0, controllen);
3902
3903 for (i = 0; i < ncmsgbufs; i++) {
3904 size_t msg_len, data_len = cmsgs[i].data.len;
3905 int enough_space = 0;
3906
3907 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3908 if (cmsgh == NULL) {
3909 PyErr_Format(PyExc_RuntimeError,
3910 "unexpected NULL result from %s()",
3911 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3912 goto finally;
3913 }
3914 if (!get_CMSG_LEN(data_len, &msg_len)) {
3915 PyErr_SetString(PyExc_RuntimeError,
3916 "item size out of range for CMSG_LEN()");
3917 goto finally;
3918 }
3919 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3920 size_t space;
3921
3922 cmsgh->cmsg_len = msg_len;
3923 if (get_cmsg_data_space(&msg, cmsgh, &space))
3924 enough_space = (space >= data_len);
3925 }
3926 if (!enough_space) {
3927 PyErr_SetString(PyExc_RuntimeError,
3928 "ancillary data does not fit in calculated "
3929 "space");
3930 goto finally;
3931 }
3932 cmsgh->cmsg_level = cmsgs[i].level;
3933 cmsgh->cmsg_type = cmsgs[i].type;
3934 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3935 }
3936 }
3937
3938 /* Make the system call. */
3939 if (!IS_SELECTABLE(s)) {
3940 select_error();
3941 goto finally;
3942 }
3943
Victor Stinner31bf2d52015-04-01 21:57:09 +02003944 ctx.msg = &msg;
3945 ctx.flags = flags;
3946 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003947 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003948
3949 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003950
3951finally:
3952 PyMem_Free(controlbuf);
3953 for (i = 0; i < ncmsgbufs; i++)
3954 PyBuffer_Release(&cmsgs[i].data);
3955 PyMem_Free(cmsgs);
3956 Py_XDECREF(cmsg_fast);
3957 for (i = 0; i < ndatabufs; i++)
3958 PyBuffer_Release(&databufs[i]);
3959 PyMem_Free(databufs);
3960 PyMem_Free(iovs);
3961 Py_XDECREF(data_fast);
3962 return retval;
3963}
3964
3965PyDoc_STRVAR(sendmsg_doc,
3966"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3967\n\
3968Send normal and ancillary data to the socket, gathering the\n\
3969non-ancillary data from a series of buffers and concatenating it into\n\
3970a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003971data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003972The ancdata argument specifies the ancillary data (control messages)\n\
3973as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3974cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3975protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003976is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003977argument defaults to 0 and has the same meaning as for send(). If\n\
3978address is supplied and not None, it sets a destination address for\n\
3979the message. The return value is the number of bytes of non-ancillary\n\
3980data sent.");
3981#endif /* CMSG_LEN */
3982
3983
Guido van Rossum30a685f1991-06-27 15:51:29 +00003984/* s.shutdown(how) method */
3985
Guido van Rossum73624e91994-10-10 17:59:00 +00003986static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003987sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 int how;
3990 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003991
Serhiy Storchaka78980432013-01-15 01:12:17 +02003992 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003993 if (how == -1 && PyErr_Occurred())
3994 return NULL;
3995 Py_BEGIN_ALLOW_THREADS
3996 res = shutdown(s->sock_fd, how);
3997 Py_END_ALLOW_THREADS
3998 if (res < 0)
3999 return s->errorhandler();
4000 Py_INCREF(Py_None);
4001 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004002}
4003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004004PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004005"shutdown(flag)\n\
4006\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004007Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4008of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004009
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004010#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004011static PyObject*
4012sock_ioctl(PySocketSockObject *s, PyObject *arg)
4013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004014 unsigned long cmd = SIO_RCVALL;
4015 PyObject *argO;
4016 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004018 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4019 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004021 switch (cmd) {
4022 case SIO_RCVALL: {
4023 unsigned int option = RCVALL_ON;
4024 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4025 return NULL;
4026 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4027 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4028 return set_error();
4029 }
4030 return PyLong_FromUnsignedLong(recv); }
4031 case SIO_KEEPALIVE_VALS: {
4032 struct tcp_keepalive ka;
4033 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4034 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4035 return NULL;
4036 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4037 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4038 return set_error();
4039 }
4040 return PyLong_FromUnsignedLong(recv); }
4041 default:
4042 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4043 return NULL;
4044 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004045}
4046PyDoc_STRVAR(sock_ioctl_doc,
4047"ioctl(cmd, option) -> long\n\
4048\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004049Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4050SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4051SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004052#endif
4053
4054#if defined(MS_WINDOWS)
4055static PyObject*
4056sock_share(PySocketSockObject *s, PyObject *arg)
4057{
4058 WSAPROTOCOL_INFO info;
4059 DWORD processId;
4060 int result;
4061
4062 if (!PyArg_ParseTuple(arg, "I", &processId))
4063 return NULL;
4064
4065 Py_BEGIN_ALLOW_THREADS
4066 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4067 Py_END_ALLOW_THREADS
4068 if (result == SOCKET_ERROR)
4069 return set_error();
4070 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4071}
4072PyDoc_STRVAR(sock_share_doc,
4073"share(process_id) -> bytes\n\
4074\n\
4075Share the socket with another process. The target process id\n\
4076must be provided and the resulting bytes object passed to the target\n\
4077process. There the shared socket can be instantiated by calling\n\
4078socket.fromshare().");
4079
Christian Heimesfaf2f632008-01-06 16:59:19 +00004080
4081#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004082
4083/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004084
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004085static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4087 accept_doc},
4088 {"bind", (PyCFunction)sock_bind, METH_O,
4089 bind_doc},
4090 {"close", (PyCFunction)sock_close, METH_NOARGS,
4091 close_doc},
4092 {"connect", (PyCFunction)sock_connect, METH_O,
4093 connect_doc},
4094 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4095 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004096 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4097 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004098 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4099 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004100#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 {"getpeername", (PyCFunction)sock_getpeername,
4102 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004103#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 {"getsockname", (PyCFunction)sock_getsockname,
4105 METH_NOARGS, getsockname_doc},
4106 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4107 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004108#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4110 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004111#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004112#if defined(MS_WINDOWS)
4113 {"share", (PyCFunction)sock_share, METH_VARARGS,
4114 sock_share_doc},
4115#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004116 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004117 listen_doc},
4118 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4119 recv_doc},
4120 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4121 recv_into_doc},
4122 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4123 recvfrom_doc},
4124 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4125 recvfrom_into_doc},
4126 {"send", (PyCFunction)sock_send, METH_VARARGS,
4127 send_doc},
4128 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4129 sendall_doc},
4130 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4131 sendto_doc},
4132 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4133 setblocking_doc},
4134 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4135 settimeout_doc},
4136 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4137 gettimeout_doc},
4138 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4139 setsockopt_doc},
4140 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4141 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004142#ifdef CMSG_LEN
4143 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4144 recvmsg_doc},
4145 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4146 recvmsg_into_doc,},
4147 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4148 sendmsg_doc},
4149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004151};
4152
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004153/* SockObject members */
4154static PyMemberDef sock_memberlist[] = {
4155 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4156 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4157 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004158 {0},
4159};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004160
Victor Stinner71694d52015-03-28 01:18:54 +01004161static PyGetSetDef sock_getsetlist[] = {
4162 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4163 {NULL} /* sentinel */
4164};
4165
Guido van Rossum73624e91994-10-10 17:59:00 +00004166/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004167 First close the file description. */
4168
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004169static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004170sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004171{
Victor Stinner524714e2016-07-22 17:43:59 +02004172 if (s->sock_fd != INVALID_SOCKET) {
Antoine Pitroue033e062010-10-29 10:38:18 +00004173 PyObject *exc, *val, *tb;
4174 Py_ssize_t old_refcount = Py_REFCNT(s);
4175 ++Py_REFCNT(s);
4176 PyErr_Fetch(&exc, &val, &tb);
4177 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4178 "unclosed %R", s))
4179 /* Spurious errors can appear at shutdown */
4180 if (PyErr_ExceptionMatches(PyExc_Warning))
4181 PyErr_WriteUnraisable((PyObject *) s);
4182 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004183 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004184 Py_REFCNT(s) = old_refcount;
4185 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004186 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004187}
4188
Guido van Rossum30a685f1991-06-27 15:51:29 +00004189
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004190static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004191sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004192{
Victor Stinnere254e532014-07-26 14:36:55 +02004193 long sock_fd;
4194 /* On Windows, this test is needed because SOCKET_T is unsigned */
4195 if (s->sock_fd == INVALID_SOCKET) {
4196 sock_fd = -1;
4197 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004198#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004199 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 /* this can occur on Win64, and actually there is a special
4201 ugly printf formatter for decimal pointer length integer
4202 printing, only bother if necessary*/
4203 PyErr_SetString(PyExc_OverflowError,
4204 "no printf formatter to display "
4205 "the socket descriptor in decimal");
4206 return NULL;
4207 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004208#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004209 else
4210 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004211 return PyUnicode_FromFormat(
4212 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004213 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 s->sock_type,
4215 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004216}
4217
4218
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004219/* Create a new, uninitialized socket object. */
4220
4221static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004222sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004224 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 new = type->tp_alloc(type, 0);
4227 if (new != NULL) {
Victor Stinner524714e2016-07-22 17:43:59 +02004228 ((PySocketSockObject *)new)->sock_fd = INVALID_SOCKET;
Victor Stinner9001d802015-04-06 23:06:01 +02004229 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 ((PySocketSockObject *)new)->errorhandler = &set_error;
4231 }
4232 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004233}
4234
4235
4236/* Initialize a new socket object. */
4237
Victor Stinnerdaf45552013-08-28 00:53:59 +02004238#ifdef SOCK_CLOEXEC
4239/* socket() and socketpair() fail with EINVAL on Linux kernel older
4240 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4241static int sock_cloexec_works = -1;
4242#endif
4243
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004244/*ARGSUSED*/
4245static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004246sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 PySocketSockObject *s = (PySocketSockObject *)self;
4249 PyObject *fdobj = NULL;
4250 SOCKET_T fd = INVALID_SOCKET;
4251 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4252 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004253#ifndef MS_WINDOWS
4254#ifdef SOCK_CLOEXEC
4255 int *atomic_flag_works = &sock_cloexec_works;
4256#else
4257 int *atomic_flag_works = NULL;
4258#endif
4259#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4262 "|iiiO:socket", keywords,
4263 &family, &type, &proto, &fdobj))
4264 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004267#ifdef MS_WINDOWS
4268 /* recreate a socket that was duplicated */
4269 if (PyBytes_Check(fdobj)) {
4270 WSAPROTOCOL_INFO info;
4271 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4272 PyErr_Format(PyExc_ValueError,
4273 "socket descriptor string has wrong size, "
4274 "should be %zu bytes.", sizeof(info));
4275 return -1;
4276 }
4277 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4278 Py_BEGIN_ALLOW_THREADS
4279 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4280 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4281 Py_END_ALLOW_THREADS
4282 if (fd == INVALID_SOCKET) {
4283 set_error();
4284 return -1;
4285 }
4286 family = info.iAddressFamily;
4287 type = info.iSocketType;
4288 proto = info.iProtocol;
4289 }
4290 else
4291#endif
4292 {
4293 fd = PyLong_AsSocket_t(fdobj);
4294 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4295 return -1;
4296 if (fd == INVALID_SOCKET) {
4297 PyErr_SetString(PyExc_ValueError,
4298 "can't use invalid socket value");
4299 return -1;
4300 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 }
4302 }
4303 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004304#ifdef MS_WINDOWS
4305 /* Windows implementation */
4306#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4307#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4308#endif
4309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004310 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004311 if (support_wsa_no_inherit) {
4312 fd = WSASocket(family, type, proto,
4313 NULL, 0,
4314 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4315 if (fd == INVALID_SOCKET) {
4316 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4317 support_wsa_no_inherit = 0;
4318 fd = socket(family, type, proto);
4319 }
4320 }
4321 else {
4322 fd = socket(family, type, proto);
4323 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004324 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 if (fd == INVALID_SOCKET) {
4327 set_error();
4328 return -1;
4329 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004330
4331 if (!support_wsa_no_inherit) {
4332 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4333 closesocket(fd);
4334 PyErr_SetFromWindowsErr(0);
4335 return -1;
4336 }
4337 }
4338#else
4339 /* UNIX */
4340 Py_BEGIN_ALLOW_THREADS
4341#ifdef SOCK_CLOEXEC
4342 if (sock_cloexec_works != 0) {
4343 fd = socket(family, type | SOCK_CLOEXEC, proto);
4344 if (sock_cloexec_works == -1) {
4345 if (fd >= 0) {
4346 sock_cloexec_works = 1;
4347 }
4348 else if (errno == EINVAL) {
4349 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4350 sock_cloexec_works = 0;
4351 fd = socket(family, type, proto);
4352 }
4353 }
4354 }
4355 else
4356#endif
4357 {
4358 fd = socket(family, type, proto);
4359 }
4360 Py_END_ALLOW_THREADS
4361
4362 if (fd == INVALID_SOCKET) {
4363 set_error();
4364 return -1;
4365 }
4366
4367 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4368 SOCKETCLOSE(fd);
4369 return -1;
4370 }
4371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 }
4373 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004375 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004376
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004377}
4378
4379
Guido van Rossumb6775db1994-08-01 11:34:53 +00004380/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004381
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004382static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4384 "_socket.socket", /* tp_name */
4385 sizeof(PySocketSockObject), /* tp_basicsize */
4386 0, /* tp_itemsize */
4387 (destructor)sock_dealloc, /* tp_dealloc */
4388 0, /* tp_print */
4389 0, /* tp_getattr */
4390 0, /* tp_setattr */
4391 0, /* tp_reserved */
4392 (reprfunc)sock_repr, /* tp_repr */
4393 0, /* tp_as_number */
4394 0, /* tp_as_sequence */
4395 0, /* tp_as_mapping */
4396 0, /* tp_hash */
4397 0, /* tp_call */
4398 0, /* tp_str */
4399 PyObject_GenericGetAttr, /* tp_getattro */
4400 0, /* tp_setattro */
4401 0, /* tp_as_buffer */
4402 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4403 sock_doc, /* tp_doc */
4404 0, /* tp_traverse */
4405 0, /* tp_clear */
4406 0, /* tp_richcompare */
4407 0, /* tp_weaklistoffset */
4408 0, /* tp_iter */
4409 0, /* tp_iternext */
4410 sock_methods, /* tp_methods */
4411 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004412 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 0, /* tp_base */
4414 0, /* tp_dict */
4415 0, /* tp_descr_get */
4416 0, /* tp_descr_set */
4417 0, /* tp_dictoffset */
4418 sock_initobj, /* tp_init */
4419 PyType_GenericAlloc, /* tp_alloc */
4420 sock_new, /* tp_new */
4421 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004422};
4423
Guido van Rossum30a685f1991-06-27 15:51:29 +00004424
Guido van Rossum81194471991-07-27 21:42:02 +00004425/* Python interface to gethostname(). */
4426
4427/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004428static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004429socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004430{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004431#ifdef MS_WINDOWS
4432 /* Don't use winsock's gethostname, as this returns the ANSI
4433 version of the hostname, whereas we need a Unicode string.
4434 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004435 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004436 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004437 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004438 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004439
4440 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004441 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004442
4443 if (GetLastError() != ERROR_MORE_DATA)
4444 return PyErr_SetFromWindowsErr(0);
4445
4446 if (size == 0)
4447 return PyUnicode_New(0, 0);
4448
4449 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4450 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004451 name = PyMem_New(wchar_t, size);
4452 if (!name) {
4453 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004454 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004455 }
Victor Stinner74168972011-11-17 01:11:36 +01004456 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4457 name,
4458 &size))
4459 {
4460 PyMem_Free(name);
4461 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004462 }
Victor Stinner74168972011-11-17 01:11:36 +01004463
4464 result = PyUnicode_FromWideChar(name, size);
4465 PyMem_Free(name);
4466 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004467#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 char buf[1024];
4469 int res;
4470 Py_BEGIN_ALLOW_THREADS
4471 res = gethostname(buf, (int) sizeof buf - 1);
4472 Py_END_ALLOW_THREADS
4473 if (res < 0)
4474 return set_error();
4475 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004476 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004477#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004478}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004480PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004481"gethostname() -> string\n\
4482\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004483Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004484
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004485#ifdef HAVE_SETHOSTNAME
4486PyDoc_STRVAR(sethostname_doc,
4487"sethostname(name)\n\n\
4488Sets the hostname to name.");
4489
4490static PyObject *
4491socket_sethostname(PyObject *self, PyObject *args)
4492{
4493 PyObject *hnobj;
4494 Py_buffer buf;
4495 int res, flag = 0;
4496
Christian Heimesd2774c72013-06-19 02:06:29 +02004497#ifdef _AIX
4498/* issue #18259, not declared in any useful header file */
4499extern int sethostname(const char *, size_t);
4500#endif
4501
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004502 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4503 PyErr_Clear();
4504 if (!PyArg_ParseTuple(args, "O&:sethostname",
4505 PyUnicode_FSConverter, &hnobj))
4506 return NULL;
4507 flag = 1;
4508 }
4509 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4510 if (!res) {
4511 res = sethostname(buf.buf, buf.len);
4512 PyBuffer_Release(&buf);
4513 }
4514 if (flag)
4515 Py_DECREF(hnobj);
4516 if (res)
4517 return set_error();
4518 Py_RETURN_NONE;
4519}
4520#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004521
Guido van Rossum30a685f1991-06-27 15:51:29 +00004522/* Python interface to gethostbyname(name). */
4523
4524/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004526socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004528 char *name;
4529 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004530 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004531
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004532 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 return NULL;
4534 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004535 goto finally;
4536 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4537finally:
4538 PyMem_Free(name);
4539 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004540}
4541
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004542PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004543"gethostbyname(host) -> address\n\
4544\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004545Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004546
4547
Victor Stinner72400302016-01-28 15:41:01 +01004548static PyObject*
4549sock_decode_hostname(const char *name)
4550{
4551#ifdef MS_WINDOWS
4552 /* Issue #26227: gethostbyaddr() returns a string encoded
4553 * to the ANSI code page */
4554 return PyUnicode_DecodeFSDefault(name);
4555#else
4556 /* Decode from UTF-8 */
4557 return PyUnicode_FromString(name);
4558#endif
4559}
4560
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004561/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4562
4563static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004564gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 char **pch;
4567 PyObject *rtn_tuple = (PyObject *)NULL;
4568 PyObject *name_list = (PyObject *)NULL;
4569 PyObject *addr_list = (PyObject *)NULL;
4570 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004571 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 if (h == NULL) {
4574 /* Let's get real error message to return */
4575 set_herror(h_errno);
4576 return NULL;
4577 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 if (h->h_addrtype != af) {
4580 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004581 errno = EAFNOSUPPORT;
4582 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 return NULL;
4584 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 case AF_INET:
4589 if (alen < sizeof(struct sockaddr_in))
4590 return NULL;
4591 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004592
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004593#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 case AF_INET6:
4595 if (alen < sizeof(struct sockaddr_in6))
4596 return NULL;
4597 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004598#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 if ((name_list = PyList_New(0)) == NULL)
4603 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 if ((addr_list = PyList_New(0)) == NULL)
4606 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004608 /* SF #1511317: h_aliases can be NULL */
4609 if (h->h_aliases) {
4610 for (pch = h->h_aliases; *pch != NULL; pch++) {
4611 int status;
4612 tmp = PyUnicode_FromString(*pch);
4613 if (tmp == NULL)
4614 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 status = PyList_Append(name_list, tmp);
4617 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 if (status)
4620 goto err;
4621 }
4622 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004623
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004624 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4625 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 case AF_INET:
4630 {
4631 struct sockaddr_in sin;
4632 memset(&sin, 0, sizeof(sin));
4633 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004634#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4638 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 if (pch == h->h_addr_list && alen >= sizeof(sin))
4641 memcpy((char *) addr, &sin, sizeof(sin));
4642 break;
4643 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004644
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004645#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 case AF_INET6:
4647 {
4648 struct sockaddr_in6 sin6;
4649 memset(&sin6, 0, sizeof(sin6));
4650 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004651#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4655 tmp = makeipaddr((struct sockaddr *)&sin6,
4656 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4659 memcpy((char *) addr, &sin6, sizeof(sin6));
4660 break;
4661 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004662#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004664 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004665 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 "unsupported address family");
4667 return NULL;
4668 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004670 if (tmp == NULL)
4671 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 status = PyList_Append(addr_list, tmp);
4674 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 if (status)
4677 goto err;
4678 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004679
Victor Stinner72400302016-01-28 15:41:01 +01004680 name = sock_decode_hostname(h->h_name);
4681 if (name == NULL)
4682 goto err;
4683 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004684
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004685 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 Py_XDECREF(name_list);
4687 Py_XDECREF(addr_list);
4688 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004689}
4690
4691
4692/* Python interface to gethostbyname_ex(name). */
4693
4694/*ARGSUSED*/
4695static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004696socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 char *name;
4699 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004700 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004702 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004703#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004705#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004707#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 char buf[16384];
4709 int buf_len = (sizeof buf) - 1;
4710 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004711#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004712#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004714#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004715#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004716
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004717 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004719 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004720 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004722#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004723#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004724 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004725 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004726#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004728#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 memset((void *) &data, '\0', sizeof(data));
4730 result = gethostbyname_r(name, &hp_allocated, &data);
4731 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004732#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004733#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004734#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004738#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 Py_END_ALLOW_THREADS
4740 /* Some C libraries would require addr.__ss_family instead of
4741 addr.ss_family.
4742 Therefore, we cast the sockaddr_storage into sockaddr to
4743 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004744 sa = SAS2SA(&addr);
4745 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004747#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004749#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004750finally:
4751 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004753}
4754
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004755PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004756"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4757\n\
4758Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004759for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004760
4761
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004762/* Python interface to gethostbyaddr(IP). */
4763
4764/*ARGSUSED*/
4765static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004766socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004767{
Charles-François Natali8b759652011-12-23 16:44:51 +01004768 sock_addr_t addr;
4769 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004770 char *ip_num;
4771 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004772 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004773#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004775#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004777#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 /* glibcs up to 2.10 assume that the buf argument to
4779 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4780 does not ensure. The attribute below instructs the compiler
4781 to maintain this alignment. */
4782 char buf[16384] Py_ALIGNED(8);
4783 int buf_len = (sizeof buf) - 1;
4784 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004785#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004786#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004788#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004789#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 char *ap;
4791 int al;
4792 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004793
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004794 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 return NULL;
4796 af = AF_UNSPEC;
4797 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004798 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004799 af = sa->sa_family;
4800 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004801 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 switch (af) {
4803 case AF_INET:
4804 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4805 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4806 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004807#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004808 case AF_INET6:
4809 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4810 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4811 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004814 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004815 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 }
4817 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004818#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004819#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004820 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 &hp_allocated, buf, buf_len,
4822 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004823#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004824 h = gethostbyaddr_r(ap, al, af,
4825 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004826#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 memset((void *) &data, '\0', sizeof(data));
4828 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4829 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004830#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004831#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004832#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004833 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004835 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004836#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004837 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004838 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004839#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004841#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004842finally:
4843 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004845}
4846
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004847PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004848"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4849\n\
4850Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004851for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004852
Guido van Rossum30a685f1991-06-27 15:51:29 +00004853
4854/* Python interface to getservbyname(name).
4855 This only returns the port number, since the other info is already
4856 known or not useful (like the list of aliases). */
4857
4858/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004859static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004860socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 char *name, *proto=NULL;
4863 struct servent *sp;
4864 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4865 return NULL;
4866 Py_BEGIN_ALLOW_THREADS
4867 sp = getservbyname(name, proto);
4868 Py_END_ALLOW_THREADS
4869 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004870 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 return NULL;
4872 }
4873 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004874}
4875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004876PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004877"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004878\n\
4879Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004880The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4881otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004882
Guido van Rossum30a685f1991-06-27 15:51:29 +00004883
Barry Warsaw11b91a02004-06-28 00:50:43 +00004884/* Python interface to getservbyport(port).
4885 This only returns the service name, since the other info is already
4886 known or not useful (like the list of aliases). */
4887
4888/*ARGSUSED*/
4889static PyObject *
4890socket_getservbyport(PyObject *self, PyObject *args)
4891{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 int port;
4893 char *proto=NULL;
4894 struct servent *sp;
4895 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4896 return NULL;
4897 if (port < 0 || port > 0xffff) {
4898 PyErr_SetString(
4899 PyExc_OverflowError,
4900 "getservbyport: port must be 0-65535.");
4901 return NULL;
4902 }
4903 Py_BEGIN_ALLOW_THREADS
4904 sp = getservbyport(htons((short)port), proto);
4905 Py_END_ALLOW_THREADS
4906 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004907 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 return NULL;
4909 }
4910 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004911}
4912
4913PyDoc_STRVAR(getservbyport_doc,
4914"getservbyport(port[, protocolname]) -> string\n\
4915\n\
4916Return the service name from a port number and protocol name.\n\
4917The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4918otherwise any protocol will match.");
4919
Guido van Rossum3901d851996-12-19 16:35:04 +00004920/* Python interface to getprotobyname(name).
4921 This only returns the protocol number, since the other info is
4922 already known or not useful (like the list of aliases). */
4923
4924/*ARGSUSED*/
4925static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004926socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 char *name;
4929 struct protoent *sp;
4930 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4931 return NULL;
4932 Py_BEGIN_ALLOW_THREADS
4933 sp = getprotobyname(name);
4934 Py_END_ALLOW_THREADS
4935 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004936 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 return NULL;
4938 }
4939 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004940}
4941
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004942PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004943"getprotobyname(name) -> integer\n\
4944\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004945Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004946
Guido van Rossum3901d851996-12-19 16:35:04 +00004947
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004948#ifndef NO_DUP
4949/* dup() function for socket fds */
4950
4951static PyObject *
4952socket_dup(PyObject *self, PyObject *fdobj)
4953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 SOCKET_T fd, newfd;
4955 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004956#ifdef MS_WINDOWS
4957 WSAPROTOCOL_INFO info;
4958#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 fd = PyLong_AsSocket_t(fdobj);
4961 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4962 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004963
Victor Stinnerdaf45552013-08-28 00:53:59 +02004964#ifdef MS_WINDOWS
4965 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4966 return set_error();
4967
4968 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4969 FROM_PROTOCOL_INFO,
4970 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 if (newfd == INVALID_SOCKET)
4972 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004973
Victor Stinnerdaf45552013-08-28 00:53:59 +02004974 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4975 closesocket(newfd);
4976 PyErr_SetFromWindowsErr(0);
4977 return NULL;
4978 }
4979#else
4980 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4981 newfd = _Py_dup(fd);
4982 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004983 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004984#endif
4985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 newfdobj = PyLong_FromSocket_t(newfd);
4987 if (newfdobj == NULL)
4988 SOCKETCLOSE(newfd);
4989 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004990}
4991
4992PyDoc_STRVAR(dup_doc,
4993"dup(integer) -> integer\n\
4994\n\
4995Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4996sockets; on some platforms os.dup() won't work for socket file descriptors.");
4997#endif
4998
4999
Dave Cole331708b2004-08-09 04:51:41 +00005000#ifdef HAVE_SOCKETPAIR
5001/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005002 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005003 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005004
5005/*ARGSUSED*/
5006static PyObject *
5007socket_socketpair(PyObject *self, PyObject *args)
5008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 PySocketSockObject *s0 = NULL, *s1 = NULL;
5010 SOCKET_T sv[2];
5011 int family, type = SOCK_STREAM, proto = 0;
5012 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005013#ifdef SOCK_CLOEXEC
5014 int *atomic_flag_works = &sock_cloexec_works;
5015#else
5016 int *atomic_flag_works = NULL;
5017#endif
5018 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005019
5020#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005022#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005024#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5026 &family, &type, &proto))
5027 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005030 Py_BEGIN_ALLOW_THREADS
5031#ifdef SOCK_CLOEXEC
5032 if (sock_cloexec_works != 0) {
5033 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5034 if (sock_cloexec_works == -1) {
5035 if (ret >= 0) {
5036 sock_cloexec_works = 1;
5037 }
5038 else if (errno == EINVAL) {
5039 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5040 sock_cloexec_works = 0;
5041 ret = socketpair(family, type, proto, sv);
5042 }
5043 }
5044 }
5045 else
5046#endif
5047 {
5048 ret = socketpair(family, type, proto, sv);
5049 }
5050 Py_END_ALLOW_THREADS
5051
5052 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005054
5055 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5056 goto finally;
5057 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5058 goto finally;
5059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 s0 = new_sockobject(sv[0], family, type, proto);
5061 if (s0 == NULL)
5062 goto finally;
5063 s1 = new_sockobject(sv[1], family, type, proto);
5064 if (s1 == NULL)
5065 goto finally;
5066 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005067
5068finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 if (res == NULL) {
5070 if (s0 == NULL)
5071 SOCKETCLOSE(sv[0]);
5072 if (s1 == NULL)
5073 SOCKETCLOSE(sv[1]);
5074 }
5075 Py_XDECREF(s0);
5076 Py_XDECREF(s1);
5077 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005078}
5079
5080PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005081"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005082\n\
5083Create a pair of socket objects from the sockets returned by the platform\n\
5084socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005085The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005086AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005087
5088#endif /* HAVE_SOCKETPAIR */
5089
5090
Guido van Rossum006bf911996-06-12 04:04:55 +00005091static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005092socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5097 return NULL;
5098 }
5099 if (x1 < 0) {
5100 PyErr_SetString(PyExc_OverflowError,
5101 "can't convert negative number to unsigned long");
5102 return NULL;
5103 }
5104 x2 = (unsigned int)ntohs((unsigned short)x1);
5105 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005106}
5107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005108PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005109"ntohs(integer) -> integer\n\
5110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005111Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005112
5113
Guido van Rossum006bf911996-06-12 04:04:55 +00005114static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005115socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 if (PyLong_Check(arg)) {
5120 x = PyLong_AsUnsignedLong(arg);
5121 if (x == (unsigned long) -1 && PyErr_Occurred())
5122 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005123#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 {
5125 unsigned long y;
5126 /* only want the trailing 32 bits */
5127 y = x & 0xFFFFFFFFUL;
5128 if (y ^ x)
5129 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005130 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 x = y;
5132 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005133#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 }
5135 else
5136 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005137 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005140}
5141
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005142PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005143"ntohl(integer) -> integer\n\
5144\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005145Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005146
5147
Guido van Rossum006bf911996-06-12 04:04:55 +00005148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005149socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5154 return NULL;
5155 }
5156 if (x1 < 0) {
5157 PyErr_SetString(PyExc_OverflowError,
5158 "can't convert negative number to unsigned long");
5159 return NULL;
5160 }
5161 x2 = (unsigned int)htons((unsigned short)x1);
5162 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005163}
5164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005165PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005166"htons(integer) -> integer\n\
5167\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005168Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005169
5170
Guido van Rossum006bf911996-06-12 04:04:55 +00005171static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005172socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 if (PyLong_Check(arg)) {
5177 x = PyLong_AsUnsignedLong(arg);
5178 if (x == (unsigned long) -1 && PyErr_Occurred())
5179 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005180#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 {
5182 unsigned long y;
5183 /* only want the trailing 32 bits */
5184 y = x & 0xFFFFFFFFUL;
5185 if (y ^ x)
5186 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005187 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005188 x = y;
5189 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005190#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 }
5192 else
5193 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005194 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 Py_TYPE(arg)->tp_name);
5196 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005197}
5198
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005199PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005200"htonl(integer) -> integer\n\
5201\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005202Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005203
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005204/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005205
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005206PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005207"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005208\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005209Convert 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 +00005210binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005211
5212static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005213socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005214{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005215#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005217#endif
5218
5219#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005220#if (SIZEOF_INT != 4)
5221#error "Not sure if in_addr_t exists and int is not 32-bits."
5222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 /* Have to use inet_addr() instead */
5224 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005226 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5229 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005230
Tim Peters1df9fdd2003-02-13 03:13:40 +00005231
5232#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005233
5234#ifdef USE_INET_ATON_WEAKLINK
5235 if (inet_aton != NULL) {
5236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 if (inet_aton(ip_addr, &buf))
5238 return PyBytes_FromStringAndSize((char *)(&buf),
5239 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005240
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005241 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005242 "illegal IP address string passed to inet_aton");
5243 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005244
Thomas Wouters477c8d52006-05-27 19:21:47 +00005245#ifdef USE_INET_ATON_WEAKLINK
5246 } else {
5247#endif
5248
5249#endif
5250
5251#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 /* special-case this address as inet_addr might return INADDR_NONE
5254 * for this */
5255 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005256 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005261 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005262 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 "illegal IP address string passed to inet_aton");
5264 return NULL;
5265 }
5266 }
5267 return PyBytes_FromStringAndSize((char *) &packed_addr,
5268 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005269
5270#ifdef USE_INET_ATON_WEAKLINK
5271 }
5272#endif
5273
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005274#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005275}
5276
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005277PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005278"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005279\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005280Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005281
5282static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005283socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005284{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005285 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005287
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005288 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 return NULL;
5290 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005291
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005292 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005293 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005295 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 return NULL;
5297 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005298
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005299 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5300 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005303}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005304
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005305#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005306
5307PyDoc_STRVAR(inet_pton_doc,
5308"inet_pton(af, ip) -> packed IP address string\n\
5309\n\
5310Convert an IP address from string format to a packed string suitable\n\
5311for use with low-level network functions.");
5312
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005313#endif
5314
5315#ifdef HAVE_INET_PTON
5316
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005317static PyObject *
5318socket_inet_pton(PyObject *self, PyObject *args)
5319{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 int af;
5321 char* ip;
5322 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005323#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005324 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5329 return NULL;
5330 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005331
Martin v. Löwis04697e82004-06-02 12:35:29 +00005332#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005334 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 "can't use AF_INET6, IPv6 is disabled");
5336 return NULL;
5337 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005338#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 retval = inet_pton(af, ip, packed);
5341 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005342 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005343 return NULL;
5344 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005345 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 "illegal IP address string passed to inet_pton");
5347 return NULL;
5348 } else if (af == AF_INET) {
5349 return PyBytes_FromStringAndSize(packed,
5350 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005351#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 } else if (af == AF_INET6) {
5353 return PyBytes_FromStringAndSize(packed,
5354 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005357 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 return NULL;
5359 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005360}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005361#elif defined(MS_WINDOWS)
5362
5363static PyObject *
5364socket_inet_pton(PyObject *self, PyObject *args)
5365{
5366 int af;
5367 char* ip;
5368 struct sockaddr_in6 addr;
5369 INT ret, size;
5370
5371 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5372 return NULL;
5373 }
5374
Victor Stinnere990c6e2013-11-16 00:18:58 +01005375 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005376 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5377
5378 if (ret) {
5379 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5380 return NULL;
5381 } else if(af == AF_INET) {
5382 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005383 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005384 sizeof(addr4->sin_addr));
5385 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005386 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005387 sizeof(addr.sin6_addr));
5388 } else {
5389 PyErr_SetString(PyExc_OSError, "unknown address family");
5390 return NULL;
5391 }
5392}
5393
5394#endif
5395
5396#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005397
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005398PyDoc_STRVAR(inet_ntop_doc,
5399"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5400\n\
5401Convert a packed IP address of the given family to string format.");
5402
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005403#endif
5404
5405
5406#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005407static PyObject *
5408socket_inet_ntop(PyObject *self, PyObject *args)
5409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005411 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005412 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005413#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005414 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005415#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005417#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005419 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5420 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005421
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005422 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005423 return NULL;
5424 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005427 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 PyErr_SetString(PyExc_ValueError,
5429 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005430 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 return NULL;
5432 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005433#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005435 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005436 PyErr_SetString(PyExc_ValueError,
5437 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005438 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 return NULL;
5440 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005442 } else {
5443 PyErr_Format(PyExc_ValueError,
5444 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005445 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 return NULL;
5447 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005448
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005449 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5450 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005452 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 return NULL;
5454 } else {
5455 return PyUnicode_FromString(retval);
5456 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 /* NOTREACHED */
5459 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5460 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005461}
5462
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005463#elif defined(MS_WINDOWS)
5464
5465static PyObject *
5466socket_inet_ntop(PyObject *self, PyObject *args)
5467{
5468 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005469 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005470 struct sockaddr_in6 addr;
5471 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005472#ifdef ENABLE_IPV6
5473 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5474#else
5475 char ip[INET_ADDRSTRLEN + 1];
5476#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005477
5478 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5479 memset((void *) &ip[0], '\0', sizeof(ip));
5480
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005481 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005482 return NULL;
5483 }
5484
5485 if (af == AF_INET) {
5486 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5487
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005488 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005489 PyErr_SetString(PyExc_ValueError,
5490 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005491 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005492 return NULL;
5493 }
5494 memset(addr4, 0, sizeof(struct sockaddr_in));
5495 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005496 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005497 addrlen = sizeof(struct sockaddr_in);
5498 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005499 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005500 PyErr_SetString(PyExc_ValueError,
5501 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005502 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005503 return NULL;
5504 }
5505
5506 memset(&addr, 0, sizeof(addr));
5507 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005508 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005509 addrlen = sizeof(addr);
5510 } else {
5511 PyErr_Format(PyExc_ValueError,
5512 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005513 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005514 return NULL;
5515 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005516 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005517
5518 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005519 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005520 ip, &retlen);
5521
5522 if (ret) {
5523 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5524 return NULL;
5525 } else {
5526 return PyUnicode_FromString(ip);
5527 }
5528}
5529
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005530#endif /* HAVE_INET_PTON */
5531
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005532/* Python interface to getaddrinfo(host, port). */
5533
5534/*ARGSUSED*/
5535static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005536socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005537{
Victor Stinner77af1722011-05-26 14:05:59 +02005538 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005539 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005540 struct addrinfo hints, *res;
5541 struct addrinfo *res0 = NULL;
5542 PyObject *hobj = NULL;
5543 PyObject *pobj = (PyObject *)NULL;
5544 char pbuf[30];
5545 char *hptr, *pptr;
5546 int family, socktype, protocol, flags;
5547 int error;
5548 PyObject *all = (PyObject *)NULL;
5549 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005550
Georg Brandl6083a4b2013-10-14 06:51:46 +02005551 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005553 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005554 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 &protocol, &flags)) {
5556 return NULL;
5557 }
5558 if (hobj == Py_None) {
5559 hptr = NULL;
5560 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005561 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 if (!idna)
5563 return NULL;
5564 assert(PyBytes_Check(idna));
5565 hptr = PyBytes_AS_STRING(idna);
5566 } else if (PyBytes_Check(hobj)) {
5567 hptr = PyBytes_AsString(hobj);
5568 } else {
5569 PyErr_SetString(PyExc_TypeError,
5570 "getaddrinfo() argument 1 must be string or None");
5571 return NULL;
5572 }
5573 if (PyLong_CheckExact(pobj)) {
5574 long value = PyLong_AsLong(pobj);
5575 if (value == -1 && PyErr_Occurred())
5576 goto err;
5577 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5578 pptr = pbuf;
5579 } else if (PyUnicode_Check(pobj)) {
5580 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005581 if (pptr == NULL)
5582 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005583 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005584 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005585 } else if (pobj == Py_None) {
5586 pptr = (char *)NULL;
5587 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005588 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005589 goto err;
5590 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005591#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005592 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5593 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005594 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5595 * This workaround avoids a segfault in libsystem.
5596 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005597 pptr = "00";
5598 }
5599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 memset(&hints, 0, sizeof(hints));
5601 hints.ai_family = family;
5602 hints.ai_socktype = socktype;
5603 hints.ai_protocol = protocol;
5604 hints.ai_flags = flags;
5605 Py_BEGIN_ALLOW_THREADS
5606 ACQUIRE_GETADDRINFO_LOCK
5607 error = getaddrinfo(hptr, pptr, &hints, &res0);
5608 Py_END_ALLOW_THREADS
5609 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5610 if (error) {
5611 set_gaierror(error);
5612 goto err;
5613 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005614
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005615 all = PyList_New(0);
5616 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 goto err;
5618 for (res = res0; res; res = res->ai_next) {
5619 PyObject *single;
5620 PyObject *addr =
5621 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5622 if (addr == NULL)
5623 goto err;
5624 single = Py_BuildValue("iiisO", res->ai_family,
5625 res->ai_socktype, res->ai_protocol,
5626 res->ai_canonname ? res->ai_canonname : "",
5627 addr);
5628 Py_DECREF(addr);
5629 if (single == NULL)
5630 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 if (PyList_Append(all, single))
5633 goto err;
5634 Py_XDECREF(single);
5635 }
5636 Py_XDECREF(idna);
5637 if (res0)
5638 freeaddrinfo(res0);
5639 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005640 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005641 Py_XDECREF(all);
5642 Py_XDECREF(idna);
5643 if (res0)
5644 freeaddrinfo(res0);
5645 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005646}
5647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005648PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005649"getaddrinfo(host, port [, family, type, proto, flags])\n\
5650 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005651\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005652Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005653
5654/* Python interface to getnameinfo(sa, flags). */
5655
5656/*ARGSUSED*/
5657static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005658socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 PyObject *sa = (PyObject *)NULL;
5661 int flags;
5662 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005663 int port;
5664 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005665 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5666 struct addrinfo hints, *res = NULL;
5667 int error;
5668 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005669 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 flags = flowinfo = scope_id = 0;
5672 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5673 return NULL;
5674 if (!PyTuple_Check(sa)) {
5675 PyErr_SetString(PyExc_TypeError,
5676 "getnameinfo() argument 1 must be a tuple");
5677 return NULL;
5678 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005679 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 &hostp, &port, &flowinfo, &scope_id))
5681 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005682 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005683 PyErr_SetString(PyExc_OverflowError,
5684 "getsockaddrarg: flowinfo must be 0-1048575.");
5685 return NULL;
5686 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5688 memset(&hints, 0, sizeof(hints));
5689 hints.ai_family = AF_UNSPEC;
5690 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005691 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 Py_BEGIN_ALLOW_THREADS
5693 ACQUIRE_GETADDRINFO_LOCK
5694 error = getaddrinfo(hostp, pbuf, &hints, &res);
5695 Py_END_ALLOW_THREADS
5696 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5697 if (error) {
5698 set_gaierror(error);
5699 goto fail;
5700 }
5701 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005702 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 "sockaddr resolved to multiple addresses");
5704 goto fail;
5705 }
5706 switch (res->ai_family) {
5707 case AF_INET:
5708 {
5709 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005710 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 "IPv4 sockaddr must be 2 tuple");
5712 goto fail;
5713 }
5714 break;
5715 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005716#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005717 case AF_INET6:
5718 {
5719 struct sockaddr_in6 *sin6;
5720 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005721 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 sin6->sin6_scope_id = scope_id;
5723 break;
5724 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005726 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005727 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5729 if (error) {
5730 set_gaierror(error);
5731 goto fail;
5732 }
Victor Stinner72400302016-01-28 15:41:01 +01005733
5734 name = sock_decode_hostname(hbuf);
5735 if (name == NULL)
5736 goto fail;
5737 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005738
5739fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 if (res)
5741 freeaddrinfo(res);
5742 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005743}
5744
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005745PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005746"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005747\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005748Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005749
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005750
5751/* Python API to getting and setting the default timeout value. */
5752
5753static PyObject *
5754socket_getdefaulttimeout(PyObject *self)
5755{
Victor Stinner71694d52015-03-28 01:18:54 +01005756 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 Py_INCREF(Py_None);
5758 return Py_None;
5759 }
Victor Stinner71694d52015-03-28 01:18:54 +01005760 else {
5761 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5762 return PyFloat_FromDouble(seconds);
5763 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005764}
5765
5766PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005767"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005768\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005769Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005770A value of None indicates that new socket objects have no timeout.\n\
5771When the socket module is first imported, the default is None.");
5772
5773static PyObject *
5774socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5775{
Victor Stinner71694d52015-03-28 01:18:54 +01005776 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005777
Victor Stinner71694d52015-03-28 01:18:54 +01005778 if (socket_parse_timeout(&timeout, arg) < 0)
5779 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005781 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005783 Py_INCREF(Py_None);
5784 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005785}
5786
5787PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005788"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005789\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005790Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005791A value of None indicates that new socket objects have no timeout.\n\
5792When the socket module is first imported, the default is None.");
5793
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005794#ifdef HAVE_IF_NAMEINDEX
5795/* Python API for getting interface indices and names */
5796
5797static PyObject *
5798socket_if_nameindex(PyObject *self, PyObject *arg)
5799{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005800 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005801 int i;
5802 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005803
Charles-François Natali60713592011-05-20 16:55:06 +02005804 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005805 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005806 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005807 return NULL;
5808 }
5809
5810 list = PyList_New(0);
5811 if (list == NULL) {
5812 if_freenameindex(ni);
5813 return NULL;
5814 }
5815
Charles-François Natali60713592011-05-20 16:55:06 +02005816 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5817 PyObject *ni_tuple = Py_BuildValue("IO&",
5818 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005819
5820 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5821 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005822 Py_DECREF(list);
5823 if_freenameindex(ni);
5824 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005825 }
5826 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005827 }
5828
5829 if_freenameindex(ni);
5830 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005831}
5832
5833PyDoc_STRVAR(if_nameindex_doc,
5834"if_nameindex()\n\
5835\n\
5836Returns a list of network interface information (index, name) tuples.");
5837
Charles-François Natali60713592011-05-20 16:55:06 +02005838static PyObject *
5839socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005840{
Charles-François Natali60713592011-05-20 16:55:06 +02005841 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005842 unsigned long index;
5843
Charles-François Natali60713592011-05-20 16:55:06 +02005844 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5845 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005846 return NULL;
5847
Charles-François Natali60713592011-05-20 16:55:06 +02005848 index = if_nametoindex(PyBytes_AS_STRING(oname));
5849 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005850 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005851 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005852 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005853 return NULL;
5854 }
5855
5856 return PyLong_FromUnsignedLong(index);
5857}
5858
5859PyDoc_STRVAR(if_nametoindex_doc,
5860"if_nametoindex(if_name)\n\
5861\n\
5862Returns the interface index corresponding to the interface name if_name.");
5863
Charles-François Natali60713592011-05-20 16:55:06 +02005864static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005865socket_if_indextoname(PyObject *self, PyObject *arg)
5866{
Charles-François Natali60713592011-05-20 16:55:06 +02005867 unsigned long index;
5868 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005869
Charles-François Natali60713592011-05-20 16:55:06 +02005870 index = PyLong_AsUnsignedLong(arg);
5871 if (index == (unsigned long) -1)
5872 return NULL;
5873
5874 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005875 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005876 return NULL;
5877 }
5878
Charles-François Natali60713592011-05-20 16:55:06 +02005879 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005880}
5881
5882PyDoc_STRVAR(if_indextoname_doc,
5883"if_indextoname(if_index)\n\
5884\n\
5885Returns the interface name corresponding to the interface index if_index.");
5886
5887#endif /* HAVE_IF_NAMEINDEX */
5888
5889
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005890#ifdef CMSG_LEN
5891/* Python interface to CMSG_LEN(length). */
5892
5893static PyObject *
5894socket_CMSG_LEN(PyObject *self, PyObject *args)
5895{
5896 Py_ssize_t length;
5897 size_t result;
5898
5899 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5900 return NULL;
5901 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5902 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5903 return NULL;
5904 }
5905 return PyLong_FromSize_t(result);
5906}
5907
5908PyDoc_STRVAR(CMSG_LEN_doc,
5909"CMSG_LEN(length) -> control message length\n\
5910\n\
5911Return the total length, without trailing padding, of an ancillary\n\
5912data item with associated data of the given length. This value can\n\
5913often be used as the buffer size for recvmsg() to receive a single\n\
5914item of ancillary data, but RFC 3542 requires portable applications to\n\
5915use CMSG_SPACE() and thus include space for padding, even when the\n\
5916item will be the last in the buffer. Raises OverflowError if length\n\
5917is outside the permissible range of values.");
5918
5919
5920#ifdef CMSG_SPACE
5921/* Python interface to CMSG_SPACE(length). */
5922
5923static PyObject *
5924socket_CMSG_SPACE(PyObject *self, PyObject *args)
5925{
5926 Py_ssize_t length;
5927 size_t result;
5928
5929 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5930 return NULL;
5931 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5932 PyErr_SetString(PyExc_OverflowError,
5933 "CMSG_SPACE() argument out of range");
5934 return NULL;
5935 }
5936 return PyLong_FromSize_t(result);
5937}
5938
5939PyDoc_STRVAR(CMSG_SPACE_doc,
5940"CMSG_SPACE(length) -> buffer size\n\
5941\n\
5942Return the buffer size needed for recvmsg() to receive an ancillary\n\
5943data item with associated data of the given length, along with any\n\
5944trailing padding. The buffer space needed to receive multiple items\n\
5945is the sum of the CMSG_SPACE() values for their associated data\n\
5946lengths. Raises OverflowError if length is outside the permissible\n\
5947range of values.");
5948#endif /* CMSG_SPACE */
5949#endif /* CMSG_LEN */
5950
5951
Guido van Rossum30a685f1991-06-27 15:51:29 +00005952/* List of functions exported by this module. */
5953
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005954static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 {"gethostbyname", socket_gethostbyname,
5956 METH_VARARGS, gethostbyname_doc},
5957 {"gethostbyname_ex", socket_gethostbyname_ex,
5958 METH_VARARGS, ghbn_ex_doc},
5959 {"gethostbyaddr", socket_gethostbyaddr,
5960 METH_VARARGS, gethostbyaddr_doc},
5961 {"gethostname", socket_gethostname,
5962 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005963#ifdef HAVE_SETHOSTNAME
5964 {"sethostname", socket_sethostname,
5965 METH_VARARGS, sethostname_doc},
5966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 {"getservbyname", socket_getservbyname,
5968 METH_VARARGS, getservbyname_doc},
5969 {"getservbyport", socket_getservbyport,
5970 METH_VARARGS, getservbyport_doc},
5971 {"getprotobyname", socket_getprotobyname,
5972 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005973#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 {"dup", socket_dup,
5975 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005976#endif
Dave Cole331708b2004-08-09 04:51:41 +00005977#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 {"socketpair", socket_socketpair,
5979 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 {"ntohs", socket_ntohs,
5982 METH_VARARGS, ntohs_doc},
5983 {"ntohl", socket_ntohl,
5984 METH_O, ntohl_doc},
5985 {"htons", socket_htons,
5986 METH_VARARGS, htons_doc},
5987 {"htonl", socket_htonl,
5988 METH_O, htonl_doc},
5989 {"inet_aton", socket_inet_aton,
5990 METH_VARARGS, inet_aton_doc},
5991 {"inet_ntoa", socket_inet_ntoa,
5992 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005993#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 {"inet_pton", socket_inet_pton,
5995 METH_VARARGS, inet_pton_doc},
5996 {"inet_ntop", socket_inet_ntop,
5997 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005998#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005999 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6000 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 {"getnameinfo", socket_getnameinfo,
6002 METH_VARARGS, getnameinfo_doc},
6003 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6004 METH_NOARGS, getdefaulttimeout_doc},
6005 {"setdefaulttimeout", socket_setdefaulttimeout,
6006 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006007#ifdef HAVE_IF_NAMEINDEX
6008 {"if_nameindex", socket_if_nameindex,
6009 METH_NOARGS, if_nameindex_doc},
6010 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006011 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006012 {"if_indextoname", socket_if_indextoname,
6013 METH_O, if_indextoname_doc},
6014#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006015#ifdef CMSG_LEN
6016 {"CMSG_LEN", socket_CMSG_LEN,
6017 METH_VARARGS, CMSG_LEN_doc},
6018#ifdef CMSG_SPACE
6019 {"CMSG_SPACE", socket_CMSG_SPACE,
6020 METH_VARARGS, CMSG_SPACE_doc},
6021#endif
6022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006024};
6025
Guido van Rossum30a685f1991-06-27 15:51:29 +00006026
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006027#ifdef MS_WINDOWS
6028#define OS_INIT_DEFINED
6029
6030/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006031
6032static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006033os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006036}
6037
6038static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006039os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 WSADATA WSAData;
6042 int ret;
6043 ret = WSAStartup(0x0101, &WSAData);
6044 switch (ret) {
6045 case 0: /* No error */
6046 Py_AtExit(os_cleanup);
6047 return 1; /* Success */
6048 case WSASYSNOTREADY:
6049 PyErr_SetString(PyExc_ImportError,
6050 "WSAStartup failed: network not ready");
6051 break;
6052 case WSAVERNOTSUPPORTED:
6053 case WSAEINVAL:
6054 PyErr_SetString(
6055 PyExc_ImportError,
6056 "WSAStartup failed: requested version not supported");
6057 break;
6058 default:
6059 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6060 break;
6061 }
6062 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006063}
6064
Guido van Rossum8d665e61996-06-26 18:22:49 +00006065#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006066
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006067
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006068
6069#ifndef OS_INIT_DEFINED
6070static int
6071os_init(void)
6072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006074}
6075#endif
6076
6077
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006078/* C API table - always add new things to the end for binary
6079 compatibility. */
6080static
6081PySocketModule_APIObject PySocketModuleAPI =
6082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006084 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006086};
6087
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006088
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006089/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006090
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006091 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006092 "socket.py" which implements some additional functionality.
6093 The import of "_socket" may fail with an ImportError exception if
6094 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006095 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006096 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006097*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006099PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006100"Implementation module for socket operations.\n\
6101\n\
6102See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006103
Martin v. Löwis1a214512008-06-11 05:26:20 +00006104static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 PyModuleDef_HEAD_INIT,
6106 PySocket_MODULE_NAME,
6107 socket_doc,
6108 -1,
6109 socket_methods,
6110 NULL,
6111 NULL,
6112 NULL,
6113 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006114};
6115
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006116PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006117PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006118{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 if (!os_init())
6122 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006123
Victor Stinnerdaf45552013-08-28 00:53:59 +02006124#ifdef MS_WINDOWS
6125 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006126#if defined(_MSC_VER) && _MSC_VER >= 1800
6127 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6128#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006129 DWORD version = GetVersion();
6130 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6131 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6132 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006133 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6134#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006135 }
6136#endif
6137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 Py_TYPE(&sock_type) = &PyType_Type;
6139 m = PyModule_Create(&socketmodule);
6140 if (m == NULL)
6141 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006142
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006143 Py_INCREF(PyExc_OSError);
6144 PySocketModuleAPI.error = PyExc_OSError;
6145 Py_INCREF(PyExc_OSError);
6146 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006148 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149 if (socket_herror == NULL)
6150 return NULL;
6151 Py_INCREF(socket_herror);
6152 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006153 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 NULL);
6155 if (socket_gaierror == NULL)
6156 return NULL;
6157 Py_INCREF(socket_gaierror);
6158 PyModule_AddObject(m, "gaierror", socket_gaierror);
6159 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006160 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 if (socket_timeout == NULL)
6162 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006163 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006164 Py_INCREF(socket_timeout);
6165 PyModule_AddObject(m, "timeout", socket_timeout);
6166 Py_INCREF((PyObject *)&sock_type);
6167 if (PyModule_AddObject(m, "SocketType",
6168 (PyObject *)&sock_type) != 0)
6169 return NULL;
6170 Py_INCREF((PyObject *)&sock_type);
6171 if (PyModule_AddObject(m, "socket",
6172 (PyObject *)&sock_type) != 0)
6173 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006174
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006175#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006177#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 Py_INCREF(has_ipv6);
6181 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006183 /* Export C API */
6184 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6185 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6186 ) != 0)
6187 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006188
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006190#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006192#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006193 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006194#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006196#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006197#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006199#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006200#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006202 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006203#endif
6204#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006205 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006206#endif
6207#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006210#endif
6211#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006213 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006214#endif
6215#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006218#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006219#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006221 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006222#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006223#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006225 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006226#endif
6227#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006229 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006230#endif
6231#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006232 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006233#endif
6234#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006236 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006237#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006238#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006240 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006241#endif
6242#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006244 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006245#endif
6246#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006247 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006248 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006249#endif
6250#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006253#endif
6254#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006256 PyModule_AddIntMacro(m, AF_NETLINK);
6257 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006258#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006259 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006260#endif
6261#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006263#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006264 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6265 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006266#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006267 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006268#endif
6269#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006271#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006272#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006274#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006275#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006277#endif
6278#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006279 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006280#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006281 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006282#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006284#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006285#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006287#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006288#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006289#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006292#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006293#ifdef AF_LINK
6294 PyModule_AddIntMacro(m, AF_LINK);
6295#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006296#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006299#endif
6300#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006303#endif
6304#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006306 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006307#endif
6308#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006311#endif
6312#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006314 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006315#endif
6316#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006317 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006319#endif
6320#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006322 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006323#endif
6324#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006327#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006328
Hye-Shik Chang81268602004-02-02 06:05:24 +00006329#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006330 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6331 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6332 PyModule_AddIntMacro(m, BTPROTO_HCI);
6333 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006334#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006336#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006337#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006338#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006339 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006340#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6342 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006343#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6346 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006347#endif
6348
Charles-François Natali47413c12011-10-06 19:47:44 +02006349#ifdef AF_CAN
6350 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006351 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006352#endif
6353#ifdef PF_CAN
6354 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006355 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006356#endif
6357
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006358/* Reliable Datagram Sockets */
6359#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006361#endif
6362#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006363 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006364#endif
6365
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006366/* Kernel event messages */
6367#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006369#endif
6370#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006371 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006372#endif
6373
Antoine Pitroub156a462010-10-27 20:13:57 +00006374#ifdef AF_PACKET
6375 PyModule_AddIntMacro(m, AF_PACKET);
6376#endif
6377#ifdef PF_PACKET
6378 PyModule_AddIntMacro(m, PF_PACKET);
6379#endif
6380#ifdef PACKET_HOST
6381 PyModule_AddIntMacro(m, PACKET_HOST);
6382#endif
6383#ifdef PACKET_BROADCAST
6384 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6385#endif
6386#ifdef PACKET_MULTICAST
6387 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6388#endif
6389#ifdef PACKET_OTHERHOST
6390 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6391#endif
6392#ifdef PACKET_OUTGOING
6393 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6394#endif
6395#ifdef PACKET_LOOPBACK
6396 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6397#endif
6398#ifdef PACKET_FASTROUTE
6399 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006400#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006401
Christian Heimes043d6f62008-01-07 17:19:16 +00006402#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6407 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6408 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006409
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006410 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6411 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6412 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, SOL_TIPC);
6416 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6417 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6418 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6419 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006420
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6422 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6423 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6424 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6428 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006429#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006432#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6434 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6435 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6436 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6437 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6438 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006439#endif
6440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, SOCK_STREAM);
6443 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006444/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, SOCK_RAW);
6446 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006447#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006449#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006450#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006452#endif
6453#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006455#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006458 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006461 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006464 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006465#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006466#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006468#endif
6469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006477 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006483 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006492 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006517#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006518#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006520#endif
6521#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006523#endif
6524#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006526#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006527#ifdef SO_BINDTODEVICE
6528 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6529#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006530#ifdef SO_PRIORITY
6531 PyModule_AddIntMacro(m, SO_PRIORITY);
6532#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006533#ifdef SO_MARK
6534 PyModule_AddIntMacro(m, SO_MARK);
6535#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 /* Maximum number of connections for "listen" */
6538#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006542#endif
6543
Martin Panter0be894b2016-09-07 12:03:06 +00006544 /* Ancillary message types */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006545#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006547#endif
6548#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006550#endif
6551#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006553#endif
6554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 /* Flags for send, recv */
6556#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006557 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006569 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006581 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006584 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006585#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006586#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006588#endif
6589#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006591#endif
6592#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006594#endif
6595#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006597#endif
6598#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006600#endif
6601#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006603#endif
6604#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006606#endif
6607#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006609#endif
6610#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006612#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006613#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006615#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617 /* Protocol level and numbers, usable for [gs]etsockopt */
6618#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006623#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006643#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006646#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006647 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006648#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006650#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006651#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006653#endif
6654#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6656 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006657#endif
6658#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6660 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6661 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006662
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6664 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6665 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006666#endif
6667#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6669 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6670 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6671 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006672#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04006673#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
6674 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
6675#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006676#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006678 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6679 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6680 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6681 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6682 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6683 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6684 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6685 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6686 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6687 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6688 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6689 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6690#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006691#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006693#endif
6694#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006696#endif
6697#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006699#endif
6700#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006702#endif
6703#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006705#endif
6706#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006708#endif
6709#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006714#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006722#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006727#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006730#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006731#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006733#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006735 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006736#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006737#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006738 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006740#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006741 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006742#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006743 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006753#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006758#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006759#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006761#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006768#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006771#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006801#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006804#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006815#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006816#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006821#endif
6822/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006825#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006830#endif
6831
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006832#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006834#endif
6835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006836 /* Some port configuration */
6837#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006839#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006844#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006845 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006846#endif
6847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848 /* Some reserved IP v.4 addresses */
6849#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006851#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006856#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006861#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006866#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869#ifdef INADDR_ALLHOSTS_GROUP
6870 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6871 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006872#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006877#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006878 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006882#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006884#endif
6885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886 /* IPv4 [gs]etsockopt options */
6887#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006905#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006908#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006911#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006914#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006934#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006935#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006937#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6940#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006942#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006948#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006949#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006955#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006957#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006959#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006963#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006965#endif
6966#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006968#endif
6969#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006971#endif
6972#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006974#endif
6975#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006977#endif
6978#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006980#endif
6981#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006983#endif
6984#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006986#endif
6987#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006989#endif
6990#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006992#endif
6993#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006995#endif
6996#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006998#endif
6999#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007001#endif
7002#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007004#endif
7005#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007007#endif
7008#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007010#endif
7011#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007013#endif
7014#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007016#endif
7017#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007019#endif
7020#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007022#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007024 /* TCP options */
7025#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007027#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007028#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007029 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007030#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007031#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007033#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007036#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007037#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007055#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007060#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007061#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007063#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007065 /* IPX options */
7066#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007068#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007069
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007070/* Reliable Datagram Sockets */
7071#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007073#endif
7074#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007076#endif
7077#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007079#endif
7080#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007082#endif
7083#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007085#endif
7086#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007088#endif
7089#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007091#endif
7092#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007094#endif
7095#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007097#endif
7098#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007100#endif
7101#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007103#endif
7104#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007106#endif
7107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007109#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007111#endif
7112#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007114#endif
7115#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007117#endif
7118#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007120#endif
7121#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007123#endif
7124#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007126#endif
7127#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007129#endif
7130#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007132#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007133#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007134 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007135#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007136#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007137 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007138#endif
7139#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007140 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007141#endif
7142#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007144#endif
7145#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007147#endif
7148#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007149 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007150#endif
7151#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007153#endif
7154#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007156#endif
7157#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007158 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007159#endif
7160#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007161 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007162#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007163#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007164 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007165#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007166#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007167 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007168#endif
7169#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007171#endif
7172#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007173 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007174#endif
7175#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007176 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007177#endif
7178#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007179 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007180#endif
7181#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007183#endif
7184#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007185 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007186#endif
7187#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007188 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007189#endif
7190#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007191 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007192#endif
7193#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007194 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007195#endif
7196#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007197 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007198#endif
7199#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007200 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007201#endif
7202#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007203 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007204#endif
7205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007206 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007207#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007208 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007209#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007210 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007211#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007213#endif
7214#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007215 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007216#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007217 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007218#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007219 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007220#endif
7221#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007223#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007224 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007225#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007227#endif
7228
Christian Heimesfaf2f632008-01-06 16:59:19 +00007229#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007230 {
7231 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7232 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7233 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007234 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007235 PyObject *tmp;
7236 tmp = PyLong_FromUnsignedLong(codes[i]);
7237 if (tmp == NULL)
7238 return NULL;
7239 PyModule_AddObject(m, names[i], tmp);
7240 }
7241 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007242 PyModule_AddIntMacro(m, RCVALL_OFF);
7243 PyModule_AddIntMacro(m, RCVALL_ON);
7244 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007245#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007246 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007247#endif
7248#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007249 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007250#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007251#endif /* _MSTCPIP_ */
7252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007253 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007254#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007255 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007256#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007258}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007259
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007260
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007261#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007262#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007263
7264/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007265/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007266
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007267int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007268inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007271#if (SIZEOF_INT != 4)
7272#error "Not sure if in_addr_t exists and int is not 32-bits."
7273#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007274 unsigned int packed_addr;
7275 packed_addr = inet_addr(src);
7276 if (packed_addr == INADDR_NONE)
7277 return 0;
7278 memcpy(dst, &packed_addr, 4);
7279 return 1;
7280 }
7281 /* Should set errno to EAFNOSUPPORT */
7282 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007283}
7284
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007285const char *
7286inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007288 if (af == AF_INET) {
7289 struct in_addr packed_addr;
7290 if (size < 16)
7291 /* Should set errno to ENOSPC. */
7292 return NULL;
7293 memcpy(&packed_addr, src, sizeof(packed_addr));
7294 return strncpy(dst, inet_ntoa(packed_addr), size);
7295 }
7296 /* Should set errno to EAFNOSUPPORT */
7297 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007298}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007299
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007300#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007301#endif