blob: 8df735d2044a12f97bfc852de760eb99fbe718cd [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
Jesus Cea736e7fc2011-03-14 17:36:54 +0100171# if defined(_AIX)
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 */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000177# else
178# undef HAVE_GETHOSTBYNAME_R
179# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000180#endif
181
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000182#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
183 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000184# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000185#endif
186
Ned Deilye1d4e582016-02-23 22:05:29 +1100187/* To use __FreeBSD_version, __OpenBSD__, and __NetBSD_Version__ */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#ifdef HAVE_SYS_PARAM_H
189#include <sys/param.h>
190#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000191/* On systems on which getaddrinfo() is believed to not be thread-safe,
Ned Deily47299fd2016-02-15 16:54:08 +1100192 (this includes the getaddrinfo emulation) protect access with a lock.
193
194 getaddrinfo is thread-safe on Mac OS X 10.5 and later. Originally it was
195 a mix of code including an unsafe implementation from an old BSD's
196 libresolv. In 10.5 Apple reimplemented it as a safe IPC call to the
197 mDNSResponder process. 10.5 is the first be UNIX '03 certified, which
Ned Deilye1d4e582016-02-23 22:05:29 +1100198 includes the requirement that getaddrinfo be thread-safe. See issue #25924.
Ned Deily47299fd2016-02-15 16:54:08 +1100199
Ned Deilye1d4e582016-02-23 22:05:29 +1100200 It's thread-safe in OpenBSD starting with 5.4, released Nov 2013:
201 http://www.openbsd.org/plus54.html
202
203 It's thread-safe in NetBSD starting with 4.0, released Dec 2007:
204
205http://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 +1100206 */
207#if defined(WITH_THREAD) && ( \
208 (defined(__APPLE__) && \
209 MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) || \
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000210 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Ned Deilye1d4e582016-02-23 22:05:29 +1100211 (defined(__OpenBSD__) && OpenBSD+0 < 201311) || \
212 (defined(__NetBSD__) && __NetBSD_Version__+0 < 400000000) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100213 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000214#define USE_GETADDRINFO_LOCK
215#endif
216
217#ifdef USE_GETADDRINFO_LOCK
218#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
219#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
220#else
221#define ACQUIRE_GETADDRINFO_LOCK
222#define RELEASE_GETADDRINFO_LOCK
223#endif
224
225#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000226# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000227#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000228
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000229#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000230# include <types.h>
231# include <io.h>
232# include <sys/ioctl.h>
233# include <utils.h>
234# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000235#endif
236
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100237#ifdef __APPLE__
238# include <sys/ioctl.h>
239#endif
240
241
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000242#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000243/* make sure that the reentrant (gethostbyaddr_r etc)
244 functions are declared correctly if compiling with
245 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000248 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000249#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000250#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000251
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000252#undef _XOPEN_SOURCE
253#include <sys/socket.h>
254#include <sys/types.h>
255#include <netinet/in.h>
256#ifdef _SS_ALIGNSIZE
257#define HAVE_GETADDRINFO 1
258#define HAVE_GETNAMEINFO 1
259#endif
260
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000261#define HAVE_INET_PTON
262#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000263#endif
264
Thomas Wouters477c8d52006-05-27 19:21:47 +0000265/* Irix 6.5 fails to define this variable at all. This is needed
266 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000267 are just busted. Same thing for Solaris. */
268#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000269#define INET_ADDRSTRLEN 16
270#endif
271
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000272/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000273#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000274#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000275#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700277#ifdef HAVE_SYS_SOCKET_H
278#include <sys/socket.h>
279#endif
280
281#ifdef HAVE_NET_IF_H
282#include <net/if.h>
283#endif
284
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000285/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000287#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000288
289/* Addressing includes */
290
Guido van Rossum6f489d91996-06-28 20:15:15 +0000291#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000292
293/* Non-MS WINDOWS includes */
294# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000295# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000296
Guido van Rossum9376b741999-09-15 22:01:40 +0000297/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000298# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000299
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000300# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000301
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000302#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000303
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000304/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000305# ifdef HAVE_FCNTL_H
306# include <fcntl.h>
307# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000308
Steve Dower65e4cb12014-11-22 12:54:57 -0800309#if defined(_MSC_VER) && _MSC_VER >= 1800
310/* Provides the IsWindows7SP1OrGreater() function */
311#include <VersionHelpers.h>
312#endif
313
Jeremy Hylton22308652001-02-02 03:23:09 +0000314#endif
315
Skip Montanaro7befb992004-02-10 16:50:21 +0000316#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000317
Neal Norwitz39d22e52002-11-02 19:55:21 +0000318#ifndef O_NONBLOCK
319# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000320#endif
321
Trent Micka708d6e2004-09-07 17:48:26 +0000322/* include Python's addrinfo.h unless it causes trouble */
323#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
324 /* Do not include addinfo.h on some newer IRIX versions.
325 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
326 * for example, but not by 6.5.10.
327 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000328#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000329 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
330 * EAI_* constants are defined in (the already included) ws2tcpip.h.
331 */
332#else
333# include "addrinfo.h"
334#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000335
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000336#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000337#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000338int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000339const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000340#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000341#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000342
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000343#ifdef __APPLE__
344/* On OS X, getaddrinfo returns no error indication of lookup
345 failure, so we must use the emulation instead of the libinfo
346 implementation. Unfortunately, performing an autoconf test
347 for this bug would require DNS access for the machine performing
348 the configuration, which is not acceptable. Therefore, we
349 determine the bug just by checking for __APPLE__. If this bug
350 gets ever fixed, perhaps checking for sys/version.h would be
351 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000352#ifndef HAVE_GETNAMEINFO
353/* This bug seems to be fixed in Jaguar. Ths easiest way I could
354 Find to check for Jaguar is that it has getnameinfo(), which
355 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000356#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000357#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000358
359#ifdef HAVE_INET_ATON
360#define USE_INET_ATON_WEAKLINK
361#endif
362
Jack Jansen84262fb2002-07-02 14:40:42 +0000363#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000364
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000365/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000366#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000367/* avoid clashes with the C library definition of the symbol. */
368#define getaddrinfo fake_getaddrinfo
369#define gai_strerror fake_gai_strerror
370#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000371#include "getaddrinfo.c"
372#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000373#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000374#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000375#include "getnameinfo.c"
376#endif
377
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000378#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000379#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000380#endif
381
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000382#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000383#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000384#define EAFNOSUPPORT WSAEAFNOSUPPORT
385#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000386#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000387
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000388#ifndef SOCKETCLOSE
389#define SOCKETCLOSE close
390#endif
391
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000392#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000393#define USE_BLUETOOTH 1
394#if defined(__FreeBSD__)
395#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
396#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000397#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000398#define SOL_HCI SOL_HCI_RAW
399#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000400#define sockaddr_l2 sockaddr_l2cap
401#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000402#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000403#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
404#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000405#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000406#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000407#define sockaddr_l2 sockaddr_bt
408#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000409#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000410#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000411#define SOL_HCI BTPROTO_HCI
412#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000413#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
414#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000415#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000416#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000417#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000418#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
419#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000420#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000421#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
422#endif
423#endif
424
Charles-François Natali8b759652011-12-23 16:44:51 +0100425/* Convert "sock_addr_t *" to "struct sockaddr *". */
426#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000427
Martin v. Löwise9416172003-05-03 10:12:45 +0000428/*
429 * Constants for getnameinfo()
430 */
431#if !defined(NI_MAXHOST)
432#define NI_MAXHOST 1025
433#endif
434#if !defined(NI_MAXSERV)
435#define NI_MAXSERV 32
436#endif
437
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000438#ifndef INVALID_SOCKET /* MS defines this */
439#define INVALID_SOCKET (-1)
440#endif
441
Charles-François Natali0cc86852013-09-13 19:53:08 +0200442#ifndef INADDR_NONE
443#define INADDR_NONE (-1)
444#endif
445
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000446/* XXX There's a problem here: *static* functions are not supposed to have
447 a Py prefix (or use CapitalizedWords). Later... */
448
Guido van Rossum30a685f1991-06-27 15:51:29 +0000449/* Global variable holding the exception type for errors detected
450 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000451static PyObject *socket_herror;
452static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000453static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000454
Tim Peters643a7fc2002-02-17 04:13:21 +0000455/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000456 The sock_type variable contains pointers to various functions,
457 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000458 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000459static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000460
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000461#if defined(HAVE_POLL_H)
462#include <poll.h>
463#elif defined(HAVE_SYS_POLL_H)
464#include <sys/poll.h>
465#endif
466
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000467/* Largest value to try to store in a socklen_t (used when handling
468 ancillary data). POSIX requires socklen_t to hold at least
469 (2**31)-1 and recommends against storing larger values, but
470 socklen_t was originally int in the BSD interface, so to be on the
471 safe side we use the smaller of (2**31)-1 and INT_MAX. */
472#if INT_MAX > 0x7fffffff
473#define SOCKLEN_T_LIMIT 0x7fffffff
474#else
475#define SOCKLEN_T_LIMIT INT_MAX
476#endif
477
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200478#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000479/* Instead of select(), we'll use poll() since poll() works on any fd. */
480#define IS_SELECTABLE(s) 1
481/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000482#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200483/* If there's no timeout left, we don't have to call select, so it's a safe,
484 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100485#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000486#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000487
488static PyObject*
489select_error(void)
490{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200491 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000493}
494
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000495#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000496#ifndef WSAEAGAIN
497#define WSAEAGAIN WSAEWOULDBLOCK
498#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000499#define CHECK_ERRNO(expected) \
500 (WSAGetLastError() == WSA ## expected)
501#else
502#define CHECK_ERRNO(expected) \
503 (errno == expected)
504#endif
505
Victor Stinnerdaf45552013-08-28 00:53:59 +0200506#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200507# define GET_SOCK_ERROR WSAGetLastError()
508# define SET_SOCK_ERROR(err) WSASetLastError(err)
509# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
510# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
511#else
512# define GET_SOCK_ERROR errno
513# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
514# define SOCK_TIMEOUT_ERR EWOULDBLOCK
515# define SOCK_INPROGRESS_ERR EINPROGRESS
516#endif
517
518
519#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200520/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
521static int support_wsa_no_inherit = -1;
522#endif
523
Guido van Rossum30a685f1991-06-27 15:51:29 +0000524/* Convenience function to raise an error according to errno
525 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000526
Guido van Rossum73624e91994-10-10 17:59:00 +0000527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000529{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000530#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 int err_no = WSAGetLastError();
532 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
533 recognizes the error codes used by both GetLastError() and
534 WSAGetLastError */
535 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200536 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000537#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000538
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200539 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000540}
541
Guido van Rossum30a685f1991-06-27 15:51:29 +0000542
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000543static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000544set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
548#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 if (v != NULL) {
554 PyErr_SetObject(socket_herror, v);
555 Py_DECREF(v);
556 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000559}
560
561
562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000563set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000564{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000566
Martin v. Löwis272cb402002-03-01 08:31:07 +0000567#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 /* EAI_SYSTEM is not available on Windows XP. */
569 if (error == EAI_SYSTEM)
570 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000571#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000572
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000573#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 if (v != NULL) {
579 PyErr_SetObject(socket_gaierror, v);
580 Py_DECREF(v);
581 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000584}
585
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000586/* Function to perform the setting of socket blocking mode
587 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588static int
589internal_setblocking(PySocketSockObject *s, int block)
590{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200591#ifdef MS_WINDOWS
592 u_long arg;
593#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100594#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100595 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100596 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000598#ifdef SOCK_NONBLOCK
599 if (block)
600 s->sock_type &= (~SOCK_NONBLOCK);
601 else
602 s->sock_type |= SOCK_NONBLOCK;
603#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000606#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100607#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 block = !block;
609 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100610#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
612 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100613 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 else
Victor Stinner9a954832013-12-04 00:41:24 +0100615 new_delay_flag = delay_flag | O_NONBLOCK;
616 if (new_delay_flag != delay_flag)
617 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
618#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000619#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200620 arg = !block;
621 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 /* Since these don't return anything */
626 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627}
628
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000629static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200630internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
631 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000632{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100634#ifdef HAVE_POLL
635 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200636 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100637#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200638 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200639 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100640#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000641
Victor Stinnerb7df3142015-03-27 22:59:32 +0100642#ifdef WITH_THREAD
643 /* must be called with the GIL held */
644 assert(PyGILState_Check());
645#endif
646
Victor Stinner416f2e62015-03-31 13:56:29 +0200647 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200648 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 /* Guard against closed socket */
651 if (s->sock_fd < 0)
652 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 /* Prefer poll, if available, since you can poll() any fd
655 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000656#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100657 pollfd.fd = s->sock_fd;
658 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200659 if (connect) {
660 /* On Windows, the socket becomes writable on connection success,
661 but a connection failure is notified as an error. On POSIX, the
662 socket becomes writable on connection success or on connection
663 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200664 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200665 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000666
Victor Stinner71694d52015-03-28 01:18:54 +0100667 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200668 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200669 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000670
Victor Stinner71694d52015-03-28 01:18:54 +0100671 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200672 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100673 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000674#else
Victor Stinnerced11742015-04-09 10:27:25 +0200675 if (interval >= 0) {
676 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
677 tvp = &tv;
678 }
679 else
680 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000681
Victor Stinner71694d52015-03-28 01:18:54 +0100682 FD_ZERO(&fds);
683 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200684 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200685 if (connect) {
686 /* On Windows, the socket becomes writable on connection success,
687 but a connection failure is notified as an error. On POSIX, the
688 socket becomes writable on connection success or on connection
689 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200690 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200691 }
Victor Stinner71694d52015-03-28 01:18:54 +0100692
693 /* See if the socket is ready */
694 Py_BEGIN_ALLOW_THREADS;
695 if (writing)
696 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200697 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100698 else
699 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200700 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100701 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000702#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 if (n < 0)
705 return -1;
706 if (n == 0)
707 return 1;
708 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000709}
710
Victor Stinner31bf2d52015-04-01 21:57:09 +0200711/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000712
Victor Stinner81c41db2015-04-02 11:50:57 +0200713 On error, raise an exception and return -1 if err is set, or fill err and
714 return -1 otherwise. If a signal was received and the signal handler raised
715 an exception, return -1, and set err to -1 if err is set.
716
717 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100718
Victor Stinner31bf2d52015-04-01 21:57:09 +0200719 If the socket has a timeout, wait until the socket is ready before calling
720 the function: wait until the socket is writable if writing is nonzero, wait
721 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100722
Victor Stinner81c41db2015-04-02 11:50:57 +0200723 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200724 the function, except if the signal handler raised an exception (PEP 475).
725
726 When the function is retried, recompute the timeout using a monotonic clock.
727
Victor Stinner81c41db2015-04-02 11:50:57 +0200728 sock_call_ex() must be called with the GIL held. The socket function is
729 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200730static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200731sock_call_ex(PySocketSockObject *s,
732 int writing,
733 int (*sock_func) (PySocketSockObject *s, void *data),
734 void *data,
735 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200736 int *err,
737 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200738{
Victor Stinner8912d142015-04-06 23:16:34 +0200739 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200740 _PyTime_t deadline = 0;
741 int deadline_initialized = 0;
742 int res;
743
Victor Stinner92f01132015-10-11 09:54:42 +0200744#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200745 /* sock_call() must be called with the GIL held. */
746 assert(PyGILState_Check());
Victor Stinner92f01132015-10-11 09:54:42 +0200747#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200748
749 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200750 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200751 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200752 /* For connect(), poll even for blocking socket. The connection
753 runs asynchronously. */
754 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200755 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200756 _PyTime_t interval;
757
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 if (deadline_initialized) {
759 /* recompute the timeout */
760 interval = deadline - _PyTime_GetMonotonicClock();
761 }
762 else {
763 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200764 deadline = _PyTime_GetMonotonicClock() + timeout;
765 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200766 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200767
Victor Stinner10550cd2015-04-03 13:22:27 +0200768 if (interval >= 0)
769 res = internal_select(s, writing, interval, connect);
770 else
771 res = 1;
772 }
773 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200774 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200775 }
776
Victor Stinner31bf2d52015-04-01 21:57:09 +0200777 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200778 if (err)
779 *err = GET_SOCK_ERROR;
780
Victor Stinner31bf2d52015-04-01 21:57:09 +0200781 if (CHECK_ERRNO(EINTR)) {
782 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200783 if (PyErr_CheckSignals()) {
784 if (err)
785 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200786 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200787 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200788
789 /* retry select() */
790 continue;
791 }
792
793 /* select() failed */
794 s->errorhandler();
795 return -1;
796 }
797
798 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200799 if (err)
800 *err = SOCK_TIMEOUT_ERR;
801 else
802 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803 return -1;
804 }
805
806 /* the socket is ready */
807 }
808
Victor Stinner81c41db2015-04-02 11:50:57 +0200809 /* inner loop to retry sock_func() when sock_func() is interrupted
810 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811 while (1) {
812 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200814 Py_END_ALLOW_THREADS
815
816 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 /* sock_func() succeeded */
818 if (err)
819 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820 return 0;
821 }
822
Victor Stinner81c41db2015-04-02 11:50:57 +0200823 if (err)
824 *err = GET_SOCK_ERROR;
825
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826 if (!CHECK_ERRNO(EINTR))
827 break;
828
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 /* sock_func() was interrupted by a signal */
830 if (PyErr_CheckSignals()) {
831 if (err)
832 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200834 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200835
Victor Stinner81c41db2015-04-02 11:50:57 +0200836 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200837 }
838
839 if (s->sock_timeout > 0
840 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200841 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200842
843 For example, select() could indicate a socket is ready for
844 reading, but the data then discarded by the OS because of a
845 wrong checksum.
846
847 Loop on select() to recheck for socket readyness. */
848 continue;
849 }
850
Victor Stinner81c41db2015-04-02 11:50:57 +0200851 /* sock_func() failed */
852 if (!err)
853 s->errorhandler();
854 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000855 return -1;
856 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200857}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000858
Victor Stinner81c41db2015-04-02 11:50:57 +0200859static int
860sock_call(PySocketSockObject *s,
861 int writing,
862 int (*func) (PySocketSockObject *s, void *data),
863 void *data)
864{
Victor Stinner8912d142015-04-06 23:16:34 +0200865 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200866}
867
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000868
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000869/* Initialize a new socket object. */
870
Victor Stinner88ed6402015-04-09 10:23:12 +0200871/* Default timeout for new sockets */
872static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000873
Martin v. Löwis1a214512008-06-11 05:26:20 +0000874static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000875init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 s->sock_fd = fd;
879 s->sock_family = family;
880 s->sock_type = type;
881 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000884#ifdef SOCK_NONBLOCK
885 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100886 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000887 else
888#endif
889 {
890 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100891 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000892 internal_setblocking(s, 0);
893 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000894
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000895}
896
897
Guido van Rossum30a685f1991-06-27 15:51:29 +0000898/* Create a new socket object.
899 This just creates the object and initializes it.
900 If the creation fails, return NULL and set an exception (implicit
901 in NEWOBJ()). */
902
Guido van Rossum73624e91994-10-10 17:59:00 +0000903static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000904new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 PySocketSockObject *s;
907 s = (PySocketSockObject *)
908 PyType_GenericNew(&sock_type, NULL, NULL);
909 if (s != NULL)
910 init_sockobject(s, fd, family, type, proto);
911 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000912}
913
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914
Guido van Rossum48a680c2001-03-02 06:34:14 +0000915/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000916 thread to be in gethostbyname or getaddrinfo */
917#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200918static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000919#endif
920
921
Guido van Rossum30a685f1991-06-27 15:51:29 +0000922/* Convert a string specifying a host name or one of a few symbolic
923 names to a numeric IP address. This usually calls gethostbyname()
924 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000925 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000926 an error occurred; then an exception is raised. */
927
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000928static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +0200929setipaddr(const char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 struct addrinfo hints, *res;
932 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
935 if (name[0] == '\0') {
936 int siz;
937 memset(&hints, 0, sizeof(hints));
938 hints.ai_family = af;
939 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
940 hints.ai_flags = AI_PASSIVE;
941 Py_BEGIN_ALLOW_THREADS
942 ACQUIRE_GETADDRINFO_LOCK
943 error = getaddrinfo(NULL, "0", &hints, &res);
944 Py_END_ALLOW_THREADS
945 /* We assume that those thread-unsafe getaddrinfo() versions
946 *are* safe regarding their return value, ie. that a
947 subsequent call to getaddrinfo() does not destroy the
948 outcome of the first call. */
949 RELEASE_GETADDRINFO_LOCK
950 if (error) {
951 set_gaierror(error);
952 return -1;
953 }
954 switch (res->ai_family) {
955 case AF_INET:
956 siz = 4;
957 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000958#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000959 case AF_INET6:
960 siz = 16;
961 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 default:
964 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200965 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 "unsupported address family");
967 return -1;
968 }
969 if (res->ai_next) {
970 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200971 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 "wildcard resolved to multiple address");
973 return -1;
974 }
975 if (res->ai_addrlen < addr_ret_size)
976 addr_ret_size = res->ai_addrlen;
977 memcpy(addr_ret, res->ai_addr, addr_ret_size);
978 freeaddrinfo(res);
979 return siz;
980 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200981 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100982 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200983 if (strcmp(name, "255.255.255.255") == 0 ||
984 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 struct sockaddr_in *sin;
986 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200987 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 "address family mismatched");
989 return -1;
990 }
991 sin = (struct sockaddr_in *)addr_ret;
992 memset((void *) sin, '\0', sizeof(*sin));
993 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000994#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 sin->sin_addr.s_addr = INADDR_BROADCAST;
998 return sizeof(sin->sin_addr);
999 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001000
1001 /* avoid a name resolution in case of numeric address */
1002#ifdef HAVE_INET_PTON
1003 /* check for an IPv4 address */
1004 if (af == AF_UNSPEC || af == AF_INET) {
1005 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1006 memset(sin, 0, sizeof(*sin));
1007 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
1008 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001009#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +02001010 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +00001011#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +02001012 return 4;
1013 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001015#ifdef ENABLE_IPV6
1016 /* check for an IPv6 address - if the address contains a scope ID, we
1017 * fallback to getaddrinfo(), which can handle translation from interface
1018 * name to interface index */
1019 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1020 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1021 memset(sin, 0, sizeof(*sin));
1022 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1023 sin->sin6_family = AF_INET6;
1024#ifdef HAVE_SOCKADDR_SA_LEN
1025 sin->sin6_len = sizeof(*sin);
1026#endif
1027 return 16;
1028 }
1029 }
1030#endif /* ENABLE_IPV6 */
1031#else /* HAVE_INET_PTON */
1032 /* check for an IPv4 address */
1033 if (af == AF_INET || af == AF_UNSPEC) {
1034 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1035 memset(sin, 0, sizeof(*sin));
1036 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1037 sin->sin_family = AF_INET;
1038#ifdef HAVE_SOCKADDR_SA_LEN
1039 sin->sin_len = sizeof(*sin);
1040#endif
1041 return 4;
1042 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001043 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001044#endif /* HAVE_INET_PTON */
1045
1046 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 memset(&hints, 0, sizeof(hints));
1048 hints.ai_family = af;
1049 Py_BEGIN_ALLOW_THREADS
1050 ACQUIRE_GETADDRINFO_LOCK
1051 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001052#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 if (error == EAI_NONAME && af == AF_UNSPEC) {
1054 /* On Tru64 V5.1, numeric-to-addr conversion fails
1055 if no address family is given. Assume IPv4 for now.*/
1056 hints.ai_family = AF_INET;
1057 error = getaddrinfo(name, NULL, &hints, &res);
1058 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 Py_END_ALLOW_THREADS
1061 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1062 if (error) {
1063 set_gaierror(error);
1064 return -1;
1065 }
1066 if (res->ai_addrlen < addr_ret_size)
1067 addr_ret_size = res->ai_addrlen;
1068 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1069 freeaddrinfo(res);
1070 switch (addr_ret->sa_family) {
1071 case AF_INET:
1072 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001073#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 case AF_INET6:
1075 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001078 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001079 return -1;
1080 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001081}
1082
Guido van Rossum30a685f1991-06-27 15:51:29 +00001083
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084/* Create a string object representing an IP address.
1085 This is always a string of the form 'dd.dd.dd.dd' (with variable
1086 size numbers). */
1087
Guido van Rossum73624e91994-10-10 17:59:00 +00001088static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001089makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 char buf[NI_MAXHOST];
1092 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1095 NI_NUMERICHOST);
1096 if (error) {
1097 set_gaierror(error);
1098 return NULL;
1099 }
1100 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001101}
1102
1103
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001104#ifdef USE_BLUETOOTH
1105/* Convert a string representation of a Bluetooth address into a numeric
1106 address. Returns the length (6), or raises an exception and returns -1 if
1107 an error occurred. */
1108
1109static int
Serhiy Storchakaef1585e2015-12-25 20:01:53 +02001110setbdaddr(const char *name, bdaddr_t *bdaddr)
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 unsigned int b0, b1, b2, b3, b4, b5;
1113 char ch;
1114 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1117 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1118 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1119 bdaddr->b[0] = b0;
1120 bdaddr->b[1] = b1;
1121 bdaddr->b[2] = b2;
1122 bdaddr->b[3] = b3;
1123 bdaddr->b[4] = b4;
1124 bdaddr->b[5] = b5;
1125 return 6;
1126 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001127 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 return -1;
1129 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130}
1131
1132/* Create a string representation of the Bluetooth address. This is always a
1133 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1134 value (zero padded if necessary). */
1135
1136static PyObject *
1137makebdaddr(bdaddr_t *bdaddr)
1138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1142 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1143 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1144 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001145}
1146#endif
1147
1148
Guido van Rossum30a685f1991-06-27 15:51:29 +00001149/* Create an object representing the given socket address,
1150 suitable for passing it back to bind(), connect() etc.
1151 The family field of the sockaddr structure is inspected
1152 to determine what kind of address it really is. */
1153
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001154/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001155static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001156makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 if (addrlen == 0) {
1159 /* No address -- may be recvfrom() from known socket */
1160 Py_INCREF(Py_None);
1161 return Py_None;
1162 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001164 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 case AF_INET:
1167 {
1168 struct sockaddr_in *a;
1169 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1170 PyObject *ret = NULL;
1171 if (addrobj) {
1172 a = (struct sockaddr_in *)addr;
1173 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1174 Py_DECREF(addrobj);
1175 }
1176 return ret;
1177 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001178
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001179#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 case AF_UNIX:
1181 {
1182 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1185 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001186 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 }
1188 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001189#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 {
1191 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001192 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 }
1194 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001195#endif /* AF_UNIX */
1196
Martin v. Löwis11017b12006-01-14 18:12:57 +00001197#if defined(AF_NETLINK)
1198 case AF_NETLINK:
1199 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1201 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001202 }
1203#endif /* AF_NETLINK */
1204
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001205#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 case AF_INET6:
1207 {
1208 struct sockaddr_in6 *a;
1209 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1210 PyObject *ret = NULL;
1211 if (addrobj) {
1212 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001213 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 addrobj,
1215 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001216 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001217 a->sin6_scope_id);
1218 Py_DECREF(addrobj);
1219 }
1220 return ret;
1221 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001222#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001223
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001224#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 case AF_BLUETOOTH:
1226 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001228 case BTPROTO_L2CAP:
1229 {
1230 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1231 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1232 PyObject *ret = NULL;
1233 if (addrobj) {
1234 ret = Py_BuildValue("Oi",
1235 addrobj,
1236 _BT_L2_MEMB(a, psm));
1237 Py_DECREF(addrobj);
1238 }
1239 return ret;
1240 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 case BTPROTO_RFCOMM:
1243 {
1244 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1245 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1246 PyObject *ret = NULL;
1247 if (addrobj) {
1248 ret = Py_BuildValue("Oi",
1249 addrobj,
1250 _BT_RC_MEMB(a, channel));
1251 Py_DECREF(addrobj);
1252 }
1253 return ret;
1254 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 case BTPROTO_HCI:
1257 {
1258 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001259#if defined(__NetBSD__) || defined(__DragonFly__)
1260 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1261#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 PyObject *ret = NULL;
1263 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1264 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001265#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001267
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001268#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001269 case BTPROTO_SCO:
1270 {
1271 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1272 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1273 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001274#endif
1275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 default:
1277 PyErr_SetString(PyExc_ValueError,
1278 "Unknown Bluetooth protocol");
1279 return NULL;
1280 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001281#endif
1282
Antoine Pitroub156a462010-10-27 20:13:57 +00001283#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 case AF_PACKET:
1285 {
1286 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1287 char *ifname = "";
1288 struct ifreq ifr;
1289 /* need to look up interface name give index */
1290 if (a->sll_ifindex) {
1291 ifr.ifr_ifindex = a->sll_ifindex;
1292 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1293 ifname = ifr.ifr_name;
1294 }
1295 return Py_BuildValue("shbhy#",
1296 ifname,
1297 ntohs(a->sll_protocol),
1298 a->sll_pkttype,
1299 a->sll_hatype,
1300 a->sll_addr,
1301 a->sll_halen);
1302 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001303#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001304
Christian Heimes043d6f62008-01-07 17:19:16 +00001305#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001306 case AF_TIPC:
1307 {
1308 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1309 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1310 return Py_BuildValue("IIIII",
1311 a->addrtype,
1312 a->addr.nameseq.type,
1313 a->addr.nameseq.lower,
1314 a->addr.nameseq.upper,
1315 a->scope);
1316 } else if (a->addrtype == TIPC_ADDR_NAME) {
1317 return Py_BuildValue("IIIII",
1318 a->addrtype,
1319 a->addr.name.name.type,
1320 a->addr.name.name.instance,
1321 a->addr.name.name.instance,
1322 a->scope);
1323 } else if (a->addrtype == TIPC_ADDR_ID) {
1324 return Py_BuildValue("IIIII",
1325 a->addrtype,
1326 a->addr.id.node,
1327 a->addr.id.ref,
1328 0,
1329 a->scope);
1330 } else {
1331 PyErr_SetString(PyExc_ValueError,
1332 "Invalid address type");
1333 return NULL;
1334 }
1335 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001336#endif
1337
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001338#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001339 case AF_CAN:
1340 {
1341 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1342 char *ifname = "";
1343 struct ifreq ifr;
1344 /* need to look up interface name given index */
1345 if (a->can_ifindex) {
1346 ifr.ifr_ifindex = a->can_ifindex;
1347 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1348 ifname = ifr.ifr_name;
1349 }
1350
1351 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1352 ifname,
1353 a->can_family);
1354 }
1355#endif
1356
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001357#ifdef PF_SYSTEM
1358 case PF_SYSTEM:
1359 switch(proto) {
1360#ifdef SYSPROTO_CONTROL
1361 case SYSPROTO_CONTROL:
1362 {
1363 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1364 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1365 }
1366#endif
1367 default:
1368 PyErr_SetString(PyExc_ValueError,
1369 "Invalid address type");
1370 return 0;
1371 }
1372#endif
1373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 default:
1377 /* If we don't know the address family, don't raise an
1378 exception -- return it as an (int, bytes) tuple. */
1379 return Py_BuildValue("iy#",
1380 addr->sa_family,
1381 addr->sa_data,
1382 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001385}
1386
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001387/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1388 (in particular, numeric IP addresses). */
1389struct maybe_idna {
1390 PyObject *obj;
1391 char *buf;
1392};
1393
1394static void
1395idna_cleanup(struct maybe_idna *data)
1396{
1397 Py_CLEAR(data->obj);
1398}
1399
1400static int
1401idna_converter(PyObject *obj, struct maybe_idna *data)
1402{
1403 size_t len;
1404 PyObject *obj2, *obj3;
1405 if (obj == NULL) {
1406 idna_cleanup(data);
1407 return 1;
1408 }
1409 data->obj = NULL;
1410 len = -1;
1411 if (PyBytes_Check(obj)) {
1412 data->buf = PyBytes_AsString(obj);
1413 len = PyBytes_Size(obj);
1414 }
1415 else if (PyByteArray_Check(obj)) {
1416 data->buf = PyByteArray_AsString(obj);
1417 len = PyByteArray_Size(obj);
1418 }
1419 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1420 data->buf = PyUnicode_DATA(obj);
1421 len = PyUnicode_GET_LENGTH(obj);
1422 }
1423 else {
1424 obj2 = PyUnicode_FromObject(obj);
1425 if (!obj2) {
1426 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1427 obj->ob_type->tp_name);
1428 return 0;
1429 }
1430 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1431 Py_DECREF(obj2);
1432 if (!obj3) {
1433 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1434 return 0;
1435 }
1436 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001437 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001438 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1439 return 0;
1440 }
1441 data->obj = obj3;
1442 data->buf = PyBytes_AS_STRING(obj3);
1443 len = PyBytes_GET_SIZE(obj3);
1444 }
1445 if (strlen(data->buf) != len) {
1446 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001447 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001448 return 0;
1449 }
1450 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001451}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001452
1453/* Parse a socket address argument according to the socket object's
1454 address family. Return 1 if the address was in the proper format,
1455 0 of not. The address is returned through addr_ret, its length
1456 through len_ret. */
1457
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001458static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001459getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001463
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001464#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001465 case AF_UNIX:
1466 {
1467 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001468 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001469 int retval = 0;
1470
1471 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1472 allow embedded nulls on Linux. */
1473 if (PyUnicode_Check(args)) {
1474 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1475 return 0;
1476 }
1477 else
1478 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001479 if (!PyArg_Parse(args, "y*", &path)) {
1480 Py_DECREF(args);
1481 return retval;
1482 }
1483 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001487 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001489 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001490 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001492 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 }
1494 }
1495 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001496#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 {
1498 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001499 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001500 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001502 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001503 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001504 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 }
1506 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001507 memcpy(addr->sun_path, path.buf, path.len);
1508 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001509 retval = 1;
1510 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001511 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001512 Py_DECREF(args);
1513 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001515#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001516
Martin v. Löwis11017b12006-01-14 18:12:57 +00001517#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 case AF_NETLINK:
1519 {
1520 struct sockaddr_nl* addr;
1521 int pid, groups;
1522 addr = (struct sockaddr_nl *)addr_ret;
1523 if (!PyTuple_Check(args)) {
1524 PyErr_Format(
1525 PyExc_TypeError,
1526 "getsockaddrarg: "
1527 "AF_NETLINK address must be tuple, not %.500s",
1528 Py_TYPE(args)->tp_name);
1529 return 0;
1530 }
1531 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1532 return 0;
1533 addr->nl_family = AF_NETLINK;
1534 addr->nl_pid = pid;
1535 addr->nl_groups = groups;
1536 *len_ret = sizeof(*addr);
1537 return 1;
1538 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001539#endif
1540
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001541#ifdef AF_RDS
1542 case AF_RDS:
1543 /* RDS sockets use sockaddr_in: fall-through */
1544#endif
1545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 case AF_INET:
1547 {
1548 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001549 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 int port, result;
1551 if (!PyTuple_Check(args)) {
1552 PyErr_Format(
1553 PyExc_TypeError,
1554 "getsockaddrarg: "
1555 "AF_INET address must be tuple, not %.500s",
1556 Py_TYPE(args)->tp_name);
1557 return 0;
1558 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001559 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1560 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 return 0;
1562 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001563 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001565 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 if (result < 0)
1567 return 0;
1568 if (port < 0 || port > 0xffff) {
1569 PyErr_SetString(
1570 PyExc_OverflowError,
1571 "getsockaddrarg: port must be 0-65535.");
1572 return 0;
1573 }
1574 addr->sin_family = AF_INET;
1575 addr->sin_port = htons((short)port);
1576 *len_ret = sizeof *addr;
1577 return 1;
1578 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001579
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001580#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 case AF_INET6:
1582 {
1583 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001584 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001585 int port, result;
1586 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 flowinfo = scope_id = 0;
1588 if (!PyTuple_Check(args)) {
1589 PyErr_Format(
1590 PyExc_TypeError,
1591 "getsockaddrarg: "
1592 "AF_INET6 address must be tuple, not %.500s",
1593 Py_TYPE(args)->tp_name);
1594 return 0;
1595 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001596 if (!PyArg_ParseTuple(args, "O&i|II",
1597 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 &scope_id)) {
1599 return 0;
1600 }
1601 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001602 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001604 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 if (result < 0)
1606 return 0;
1607 if (port < 0 || port > 0xffff) {
1608 PyErr_SetString(
1609 PyExc_OverflowError,
1610 "getsockaddrarg: port must be 0-65535.");
1611 return 0;
1612 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001613 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001614 PyErr_SetString(
1615 PyExc_OverflowError,
1616 "getsockaddrarg: flowinfo must be 0-1048575.");
1617 return 0;
1618 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 addr->sin6_family = s->sock_family;
1620 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001621 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 addr->sin6_scope_id = scope_id;
1623 *len_ret = sizeof *addr;
1624 return 1;
1625 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001626#endif
1627
Hye-Shik Chang81268602004-02-02 06:05:24 +00001628#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001629 case AF_BLUETOOTH:
1630 {
1631 switch (s->sock_proto) {
1632 case BTPROTO_L2CAP:
1633 {
1634 struct sockaddr_l2 *addr;
1635 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 addr = (struct sockaddr_l2 *)addr_ret;
1638 memset(addr, 0, sizeof(struct sockaddr_l2));
1639 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1640 if (!PyArg_ParseTuple(args, "si", &straddr,
1641 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001642 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 "wrong format");
1644 return 0;
1645 }
1646 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1647 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 *len_ret = sizeof *addr;
1650 return 1;
1651 }
1652 case BTPROTO_RFCOMM:
1653 {
1654 struct sockaddr_rc *addr;
1655 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 addr = (struct sockaddr_rc *)addr_ret;
1658 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1659 if (!PyArg_ParseTuple(args, "si", &straddr,
1660 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001661 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 "wrong format");
1663 return 0;
1664 }
1665 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1666 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 *len_ret = sizeof *addr;
1669 return 1;
1670 }
1671 case BTPROTO_HCI:
1672 {
1673 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001674#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001675 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001676
Alexander Belopolskye239d232010-12-08 23:31:48 +00001677 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001678 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001679 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001680 "wrong format");
1681 return 0;
1682 }
1683 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1684 return 0;
1685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1687 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001688 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 "wrong format");
1690 return 0;
1691 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 *len_ret = sizeof *addr;
1694 return 1;
1695 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001696#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 case BTPROTO_SCO:
1698 {
1699 struct sockaddr_sco *addr;
1700 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 addr = (struct sockaddr_sco *)addr_ret;
1703 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1704 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001705 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001706 "wrong format");
1707 return 0;
1708 }
1709 straddr = PyBytes_AS_STRING(args);
1710 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1711 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 *len_ret = sizeof *addr;
1714 return 1;
1715 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001717 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001718 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001719 return 0;
1720 }
1721 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001722#endif
1723
Antoine Pitroub156a462010-10-27 20:13:57 +00001724#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 case AF_PACKET:
1726 {
1727 struct sockaddr_ll* addr;
1728 struct ifreq ifr;
1729 char *interfaceName;
1730 int protoNumber;
1731 int hatype = 0;
1732 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001733 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 if (!PyTuple_Check(args)) {
1736 PyErr_Format(
1737 PyExc_TypeError,
1738 "getsockaddrarg: "
1739 "AF_PACKET address must be tuple, not %.500s",
1740 Py_TYPE(args)->tp_name);
1741 return 0;
1742 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001743 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001745 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 return 0;
1747 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1748 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1749 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1750 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001751 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 return 0;
1753 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001754 if (haddr.buf && haddr.len > 8) {
1755 PyErr_SetString(PyExc_ValueError,
1756 "Hardware address must be 8 bytes or less");
1757 PyBuffer_Release(&haddr);
1758 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 }
1760 if (protoNumber < 0 || protoNumber > 0xffff) {
1761 PyErr_SetString(
1762 PyExc_OverflowError,
1763 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001764 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 return 0;
1766 }
1767 addr = (struct sockaddr_ll*)addr_ret;
1768 addr->sll_family = AF_PACKET;
1769 addr->sll_protocol = htons((short)protoNumber);
1770 addr->sll_ifindex = ifr.ifr_ifindex;
1771 addr->sll_pkttype = pkttype;
1772 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001773 if (haddr.buf) {
1774 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1775 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001777 else
1778 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001780 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001781 return 1;
1782 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001783#endif
1784
Christian Heimes043d6f62008-01-07 17:19:16 +00001785#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 case AF_TIPC:
1787 {
1788 unsigned int atype, v1, v2, v3;
1789 unsigned int scope = TIPC_CLUSTER_SCOPE;
1790 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 if (!PyTuple_Check(args)) {
1793 PyErr_Format(
1794 PyExc_TypeError,
1795 "getsockaddrarg: "
1796 "AF_TIPC address must be tuple, not %.500s",
1797 Py_TYPE(args)->tp_name);
1798 return 0;
1799 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 if (!PyArg_ParseTuple(args,
1802 "IIII|I;Invalid TIPC address format",
1803 &atype, &v1, &v2, &v3, &scope))
1804 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 addr = (struct sockaddr_tipc *) addr_ret;
1807 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 addr->family = AF_TIPC;
1810 addr->scope = scope;
1811 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001813 if (atype == TIPC_ADDR_NAMESEQ) {
1814 addr->addr.nameseq.type = v1;
1815 addr->addr.nameseq.lower = v2;
1816 addr->addr.nameseq.upper = v3;
1817 } else if (atype == TIPC_ADDR_NAME) {
1818 addr->addr.name.name.type = v1;
1819 addr->addr.name.name.instance = v2;
1820 } else if (atype == TIPC_ADDR_ID) {
1821 addr->addr.id.node = v1;
1822 addr->addr.id.ref = v2;
1823 } else {
1824 /* Shouldn't happen */
1825 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1826 return 0;
1827 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001831 return 1;
1832 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001833#endif
1834
Vinay Sajiped6783f2014-03-21 11:44:32 +00001835#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001836 case AF_CAN:
1837 switch (s->sock_proto) {
1838 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001839 /* fall-through */
1840 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001841 {
1842 struct sockaddr_can *addr;
1843 PyObject *interfaceName;
1844 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001845 Py_ssize_t len;
1846
Benjamin Peterson18b71912013-05-16 15:29:44 -05001847 addr = (struct sockaddr_can *)addr_ret;
1848
Charles-François Natali47413c12011-10-06 19:47:44 +02001849 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1850 &interfaceName))
1851 return 0;
1852
1853 len = PyBytes_GET_SIZE(interfaceName);
1854
1855 if (len == 0) {
1856 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001857 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001858 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1859 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001860 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1861 s->errorhandler();
1862 Py_DECREF(interfaceName);
1863 return 0;
1864 }
1865 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001866 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001867 "AF_CAN interface name too long");
1868 Py_DECREF(interfaceName);
1869 return 0;
1870 }
1871
1872 addr->can_family = AF_CAN;
1873 addr->can_ifindex = ifr.ifr_ifindex;
1874
1875 *len_ret = sizeof(*addr);
1876 Py_DECREF(interfaceName);
1877 return 1;
1878 }
1879 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001880 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001881 "getsockaddrarg: unsupported CAN protocol");
1882 return 0;
1883 }
1884#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001885
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001886#ifdef PF_SYSTEM
1887 case PF_SYSTEM:
1888 switch (s->sock_proto) {
1889#ifdef SYSPROTO_CONTROL
1890 case SYSPROTO_CONTROL:
1891 {
1892 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001893
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001894 addr = (struct sockaddr_ctl *)addr_ret;
1895 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001896 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001897
1898 if (PyUnicode_Check(args)) {
1899 struct ctl_info info;
1900 PyObject *ctl_name;
1901
1902 if (!PyArg_Parse(args, "O&",
1903 PyUnicode_FSConverter, &ctl_name)) {
1904 return 0;
1905 }
1906
Victor Stinnerf50e1872015-03-20 11:32:24 +01001907 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001908 PyErr_SetString(PyExc_ValueError,
1909 "provided string is too long");
1910 Py_DECREF(ctl_name);
1911 return 0;
1912 }
1913 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1914 sizeof(info.ctl_name));
1915 Py_DECREF(ctl_name);
1916
1917 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1918 PyErr_SetString(PyExc_OSError,
1919 "cannot find kernel control with provided name");
1920 return 0;
1921 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001922
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001923 addr->sc_id = info.ctl_id;
1924 addr->sc_unit = 0;
1925 } else if (!PyArg_ParseTuple(args, "II",
1926 &(addr->sc_id), &(addr->sc_unit))) {
1927 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1928 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001929
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001930 return 0;
1931 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001932
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001933 *len_ret = sizeof(*addr);
1934 return 1;
1935 }
1936#endif
1937 default:
1938 PyErr_SetString(PyExc_OSError,
1939 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1940 return 0;
1941 }
1942#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001947 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001948 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001950 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001951}
1952
Guido van Rossum30a685f1991-06-27 15:51:29 +00001953
Guido van Rossum48a680c2001-03-02 06:34:14 +00001954/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001955 Return 1 if the family is known, 0 otherwise. The length is returned
1956 through len_ret. */
1957
1958static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001959getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001962
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001963#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001964 case AF_UNIX:
1965 {
1966 *len_ret = sizeof (struct sockaddr_un);
1967 return 1;
1968 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001969#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001970#if defined(AF_NETLINK)
1971 case AF_NETLINK:
1972 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 *len_ret = sizeof (struct sockaddr_nl);
1974 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001975 }
1976#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001977
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001978#ifdef AF_RDS
1979 case AF_RDS:
1980 /* RDS sockets use sockaddr_in: fall-through */
1981#endif
1982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 case AF_INET:
1984 {
1985 *len_ret = sizeof (struct sockaddr_in);
1986 return 1;
1987 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001988
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001989#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001990 case AF_INET6:
1991 {
1992 *len_ret = sizeof (struct sockaddr_in6);
1993 return 1;
1994 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001995#endif
1996
Hye-Shik Chang81268602004-02-02 06:05:24 +00001997#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 case AF_BLUETOOTH:
1999 {
2000 switch(s->sock_proto)
2001 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 case BTPROTO_L2CAP:
2004 *len_ret = sizeof (struct sockaddr_l2);
2005 return 1;
2006 case BTPROTO_RFCOMM:
2007 *len_ret = sizeof (struct sockaddr_rc);
2008 return 1;
2009 case BTPROTO_HCI:
2010 *len_ret = sizeof (struct sockaddr_hci);
2011 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002012#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 case BTPROTO_SCO:
2014 *len_ret = sizeof (struct sockaddr_sco);
2015 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00002016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002017 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002018 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 "unknown BT protocol");
2020 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002022 }
2023 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002024#endif
2025
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002026#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 case AF_PACKET:
2028 {
2029 *len_ret = sizeof (struct sockaddr_ll);
2030 return 1;
2031 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002032#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002033
Christian Heimes043d6f62008-01-07 17:19:16 +00002034#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 case AF_TIPC:
2036 {
2037 *len_ret = sizeof (struct sockaddr_tipc);
2038 return 1;
2039 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002040#endif
2041
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002042#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002043 case AF_CAN:
2044 {
2045 *len_ret = sizeof (struct sockaddr_can);
2046 return 1;
2047 }
2048#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002049
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002050#ifdef PF_SYSTEM
2051 case PF_SYSTEM:
2052 switch(s->sock_proto) {
2053#ifdef SYSPROTO_CONTROL
2054 case SYSPROTO_CONTROL:
2055 *len_ret = sizeof (struct sockaddr_ctl);
2056 return 1;
2057#endif
2058 default:
2059 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2060 "unknown PF_SYSTEM protocol");
2061 return 0;
2062 }
2063#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002067 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002068 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002072}
2073
2074
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002075/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2076 Currently, these methods are only compiled if the RFC 2292/3542
2077 CMSG_LEN() macro is available. Older systems seem to have used
2078 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2079 it may be possible to define CMSG_LEN() that way if it's not
2080 provided. Some architectures might need extra padding after the
2081 cmsghdr, however, and CMSG_LEN() would have to take account of
2082 this. */
2083#ifdef CMSG_LEN
2084/* If length is in range, set *result to CMSG_LEN(length) and return
2085 true; otherwise, return false. */
2086static int
2087get_CMSG_LEN(size_t length, size_t *result)
2088{
2089 size_t tmp;
2090
2091 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2092 return 0;
2093 tmp = CMSG_LEN(length);
2094 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2095 return 0;
2096 *result = tmp;
2097 return 1;
2098}
2099
2100#ifdef CMSG_SPACE
2101/* If length is in range, set *result to CMSG_SPACE(length) and return
2102 true; otherwise, return false. */
2103static int
2104get_CMSG_SPACE(size_t length, size_t *result)
2105{
2106 size_t tmp;
2107
2108 /* Use CMSG_SPACE(1) here in order to take account of the padding
2109 necessary before *and* after the data. */
2110 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2111 return 0;
2112 tmp = CMSG_SPACE(length);
2113 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2114 return 0;
2115 *result = tmp;
2116 return 1;
2117}
2118#endif
2119
2120/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2121 pointer in msg->msg_control with at least "space" bytes after it,
2122 and its cmsg_len member inside the buffer. */
2123static int
2124cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2125{
2126 size_t cmsg_offset;
2127 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2128 sizeof(cmsgh->cmsg_len));
2129
Charles-François Natali466517d2011-08-28 18:23:43 +02002130 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002131 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002132 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002133 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2134 annoying under OS X as it's unsigned there and so it triggers a
2135 tautological comparison warning under Clang when compared against 0.
2136 Since the check is valid on other platforms, silence the warning under
2137 Clang. */
2138 #ifdef __clang__
2139 #pragma clang diagnostic push
2140 #pragma clang diagnostic ignored "-Wtautological-compare"
2141 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002142 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002143 #pragma GCC diagnostic push
2144 #pragma GCC diagnostic ignored "-Wtype-limits"
2145 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002146 if (msg->msg_controllen < 0)
2147 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002148 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002149 #pragma GCC diagnostic pop
2150 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002151 #ifdef __clang__
2152 #pragma clang diagnostic pop
2153 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002154 if (space < cmsg_len_end)
2155 space = cmsg_len_end;
2156 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2157 return (cmsg_offset <= (size_t)-1 - space &&
2158 cmsg_offset + space <= msg->msg_controllen);
2159}
2160
2161/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2162 *space to number of bytes following it in the buffer and return
2163 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2164 msg->msg_controllen are valid. */
2165static int
2166get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2167{
2168 size_t data_offset;
2169 char *data_ptr;
2170
2171 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2172 return 0;
2173 data_offset = data_ptr - (char *)msg->msg_control;
2174 if (data_offset > msg->msg_controllen)
2175 return 0;
2176 *space = msg->msg_controllen - data_offset;
2177 return 1;
2178}
2179
2180/* If cmsgh is invalid or not contained in the buffer pointed to by
2181 msg->msg_control, return -1. If cmsgh is valid and its associated
2182 data is entirely contained in the buffer, set *data_len to the
2183 length of the associated data and return 0. If only part of the
2184 associated data is contained in the buffer but cmsgh is otherwise
2185 valid, set *data_len to the length contained in the buffer and
2186 return 1. */
2187static int
2188get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2189{
2190 size_t space, cmsg_data_len;
2191
2192 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2193 cmsgh->cmsg_len < CMSG_LEN(0))
2194 return -1;
2195 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2196 if (!get_cmsg_data_space(msg, cmsgh, &space))
2197 return -1;
2198 if (space >= cmsg_data_len) {
2199 *data_len = cmsg_data_len;
2200 return 0;
2201 }
2202 *data_len = space;
2203 return 1;
2204}
2205#endif /* CMSG_LEN */
2206
2207
Victor Stinner31bf2d52015-04-01 21:57:09 +02002208struct sock_accept {
2209 socklen_t *addrlen;
2210 sock_addr_t *addrbuf;
2211 SOCKET_T result;
2212};
2213
2214#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2215/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2216static int accept4_works = -1;
2217#endif
2218
2219static int
2220sock_accept_impl(PySocketSockObject *s, void *data)
2221{
2222 struct sock_accept *ctx = data;
2223
2224#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2225 if (accept4_works != 0) {
2226 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2227 SOCK_CLOEXEC);
2228 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2229 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2230 accept4_works = (errno != ENOSYS);
2231 }
2232 }
2233 if (accept4_works == 0)
2234 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2235#else
2236 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2237#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002238
2239#ifdef MS_WINDOWS
2240 return (ctx->result != INVALID_SOCKET);
2241#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002242 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002243#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002244}
2245
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002246/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002247
Guido van Rossum73624e91994-10-10 17:59:00 +00002248static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002249sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002252 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 socklen_t addrlen;
2254 PyObject *sock = NULL;
2255 PyObject *addr = NULL;
2256 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002257 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if (!getsockaddrlen(s, &addrlen))
2260 return NULL;
2261 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002263 if (!IS_SELECTABLE(s))
2264 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002265
Victor Stinner31bf2d52015-04-01 21:57:09 +02002266 ctx.addrlen = &addrlen;
2267 ctx.addrbuf = &addrbuf;
2268 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002270 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002271
Victor Stinnerdaf45552013-08-28 00:53:59 +02002272#ifdef MS_WINDOWS
2273 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2274 PyErr_SetFromWindowsErr(0);
2275 SOCKETCLOSE(newfd);
2276 goto finally;
2277 }
2278#else
2279
2280#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2281 if (!accept4_works)
2282#endif
2283 {
2284 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2285 SOCKETCLOSE(newfd);
2286 goto finally;
2287 }
2288 }
2289#endif
2290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 sock = PyLong_FromSocket_t(newfd);
2292 if (sock == NULL) {
2293 SOCKETCLOSE(newfd);
2294 goto finally;
2295 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2298 addrlen, s->sock_proto);
2299 if (addr == NULL)
2300 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002302 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002303
Guido van Rossum67f7a382002-06-06 21:08:16 +00002304finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 Py_XDECREF(sock);
2306 Py_XDECREF(addr);
2307 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002308}
2309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002310PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002311"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002312\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002313Wait for an incoming connection. Return a new socket file descriptor\n\
2314representing the connection, and the address of the client.\n\
2315For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002316
Guido van Rossum11ba0942002-06-13 15:07:44 +00002317/* s.setblocking(flag) method. Argument:
2318 False -- non-blocking mode; same as settimeout(0)
2319 True -- blocking mode; same as settimeout(None)
2320*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002321
Guido van Rossum73624e91994-10-10 17:59:00 +00002322static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002323sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002324{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002325 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002327 block = PyLong_AsLong(arg);
2328 if (block == -1 && PyErr_Occurred())
2329 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002330
Victor Stinner9001d802015-04-06 23:06:01 +02002331 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002332 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002334 Py_INCREF(Py_None);
2335 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002336}
Guido van Rossume4485b01994-09-07 14:32:49 +00002337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002338PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002339"setblocking(flag)\n\
2340\n\
2341Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002342setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002343setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002344
Victor Stinner71694d52015-03-28 01:18:54 +01002345static int
2346socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2347{
2348#ifdef MS_WINDOWS
2349 struct timeval tv;
2350#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002351#ifndef HAVE_POLL
2352 _PyTime_t ms;
2353#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002354 int overflow = 0;
2355
2356 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002357 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002358 return 0;
2359 }
2360
Victor Stinner869e1772015-03-30 03:49:14 +02002361 if (_PyTime_FromSecondsObject(timeout,
2362 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002363 return -1;
2364
2365 if (*timeout < 0) {
2366 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2367 return -1;
2368 }
2369
2370#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002371 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002372#endif
2373#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002374 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2375 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002376#endif
2377 if (overflow) {
2378 PyErr_SetString(PyExc_OverflowError,
2379 "timeout doesn't fit into C timeval");
2380 return -1;
2381 }
2382
2383 return 0;
2384}
2385
Guido van Rossum11ba0942002-06-13 15:07:44 +00002386/* s.settimeout(timeout) method. Argument:
2387 None -- no timeout, blocking mode; same as setblocking(True)
2388 0.0 -- non-blocking mode; same as setblocking(False)
2389 > 0 -- timeout mode; operations time out after timeout seconds
2390 < 0 -- illegal; raises an exception
2391*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002393sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002394{
Victor Stinner71694d52015-03-28 01:18:54 +01002395 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002396
Victor Stinner71694d52015-03-28 01:18:54 +01002397 if (socket_parse_timeout(&timeout, arg) < 0)
2398 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002401 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 Py_INCREF(Py_None);
2404 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002405}
2406
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002407PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002408"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002410Set a timeout on socket operations. 'timeout' can be a float,\n\
2411giving in seconds, or None. Setting a timeout of None disables\n\
2412the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002414
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002415/* s.gettimeout() method.
2416 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002418sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002419{
Victor Stinner71694d52015-03-28 01:18:54 +01002420 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 Py_INCREF(Py_None);
2422 return Py_None;
2423 }
Victor Stinner71694d52015-03-28 01:18:54 +01002424 else {
2425 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2426 return PyFloat_FromDouble(seconds);
2427 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002428}
2429
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002430PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002431"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002433Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002436
Guido van Rossumaee08791992-09-08 09:05:33 +00002437/* s.setsockopt() method.
2438 With an integer third argument, sets an integer option.
2439 With a string third argument, sets an option from a buffer;
2440 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002441
Guido van Rossum73624e91994-10-10 17:59:00 +00002442static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002443sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 int level;
2446 int optname;
2447 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002448 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 if (PyArg_ParseTuple(args, "iii:setsockopt",
2452 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002453 res = setsockopt(s->sock_fd, level, optname,
2454 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 }
2456 else {
2457 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002458 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2459 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 return NULL;
Victor Stinnercc739322016-03-23 21:35:29 +01002461#ifdef MS_WINDOWS
2462 if (optval.len > INT_MAX) {
2463 PyBuffer_Release(&optval);
2464 PyErr_Format(PyExc_OverflowError,
2465 "socket option is larger than %i bytes",
2466 INT_MAX);
2467 return NULL;
2468 }
2469 res = setsockopt(s->sock_fd, level, optname,
2470 optval.buf, (int)optval.len);
2471#else
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002472 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
Victor Stinnercc739322016-03-23 21:35:29 +01002473#endif
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002474 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 }
Victor Stinnercc739322016-03-23 21:35:29 +01002476 if (res < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 return s->errorhandler();
Victor Stinnercc739322016-03-23 21:35:29 +01002478 }
2479
2480 Py_RETURN_NONE;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002481}
2482
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484"setsockopt(level, option, value)\n\
2485\n\
2486Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002487The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002488
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002489
Guido van Rossumaee08791992-09-08 09:05:33 +00002490/* s.getsockopt() method.
2491 With two arguments, retrieves an integer option.
2492 With a third integer argument, retrieves a string buffer of that size;
2493 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002494
Guido van Rossum73624e91994-10-10 17:59:00 +00002495static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002496sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 int level;
2499 int optname;
2500 int res;
2501 PyObject *buf;
2502 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2505 &level, &optname, &buflen))
2506 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 if (buflen == 0) {
2509 int flag = 0;
2510 socklen_t flagsize = sizeof flag;
2511 res = getsockopt(s->sock_fd, level, optname,
2512 (void *)&flag, &flagsize);
2513 if (res < 0)
2514 return s->errorhandler();
2515 return PyLong_FromLong(flag);
2516 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002518 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 "getsockopt buflen out of range");
2520 return NULL;
2521 }
2522 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2523 if (buf == NULL)
2524 return NULL;
2525 res = getsockopt(s->sock_fd, level, optname,
2526 (void *)PyBytes_AS_STRING(buf), &buflen);
2527 if (res < 0) {
2528 Py_DECREF(buf);
2529 return s->errorhandler();
2530 }
2531 _PyBytes_Resize(&buf, buflen);
2532 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002533}
2534
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002535PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002536"getsockopt(level, option[, buffersize]) -> value\n\
2537\n\
2538Get a socket option. See the Unix manual for level and option.\n\
2539If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002541
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002542
Fred Drake728819a2000-07-01 03:40:12 +00002543/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002544
Guido van Rossum73624e91994-10-10 17:59:00 +00002545static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002546sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 sock_addr_t addrbuf;
2549 int addrlen;
2550 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2553 return NULL;
2554 Py_BEGIN_ALLOW_THREADS
2555 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2556 Py_END_ALLOW_THREADS
2557 if (res < 0)
2558 return s->errorhandler();
2559 Py_INCREF(Py_None);
2560 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002561}
2562
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002563PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002564"bind(address)\n\
2565\n\
2566Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002567pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002568sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002569
Guido van Rossum30a685f1991-06-27 15:51:29 +00002570
2571/* s.close() method.
2572 Set the file descriptor to -1 so operations tried subsequently
2573 will surely fail. */
2574
Guido van Rossum73624e91994-10-10 17:59:00 +00002575static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002576sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002577{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002578 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002579
Victor Stinner19a8e842016-03-21 16:36:48 +01002580 fd = s->sock_fd;
2581 if (fd != -1) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 s->sock_fd = -1;
Victor Stinner19a8e842016-03-21 16:36:48 +01002583
2584 /* We do not want to retry upon EINTR: see
2585 http://lwn.net/Articles/576478/ and
2586 http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2587 for more details. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002588 Py_BEGIN_ALLOW_THREADS
2589 (void) SOCKETCLOSE(fd);
2590 Py_END_ALLOW_THREADS
2591 }
2592 Py_INCREF(Py_None);
2593 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002594}
2595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002596PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002597"close()\n\
2598\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002599Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002600
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002601static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002602sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002603{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002604 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002605 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002606 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002607}
2608
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002609PyDoc_STRVAR(detach_doc,
2610"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002611\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002612Close the socket object without closing the underlying file descriptor.\n\
2613The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002614can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002615
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002616static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002617sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002618{
Victor Stinner81c41db2015-04-02 11:50:57 +02002619 int err;
2620 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002621
Victor Stinner81c41db2015-04-02 11:50:57 +02002622 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2623 /* getsockopt() failed */
2624 return 0;
2625 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002626
Victor Stinner81c41db2015-04-02 11:50:57 +02002627 if (err == EISCONN)
2628 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002629 if (err != 0) {
2630 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2631 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002632 return 0;
2633 }
2634 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002635}
2636
2637static int
2638internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2639 int raise)
2640{
2641 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002642
2643 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002645 Py_END_ALLOW_THREADS
2646
Victor Stinner70a46f62015-03-31 22:03:59 +02002647 if (!res) {
2648 /* connect() succeeded, the socket is connected */
2649 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002651
Victor Stinner81c41db2015-04-02 11:50:57 +02002652 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002653
Victor Stinner81c41db2015-04-02 11:50:57 +02002654 /* save error, PyErr_CheckSignals() can replace it */
2655 err = GET_SOCK_ERROR;
2656 if (CHECK_ERRNO(EINTR)) {
2657 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002658 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002659
2660 /* Issue #23618: when connect() fails with EINTR, the connection is
2661 running asynchronously.
2662
2663 If the socket is blocking or has a timeout, wait until the
2664 connection completes, fails or timed out using select(), and then
2665 get the connection status using getsockopt(SO_ERROR).
2666
2667 If the socket is non-blocking, raise InterruptedError. The caller is
2668 responsible to wait until the connection completes, fails or timed
2669 out (it's the case in asyncio for example). */
2670 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2671 }
2672 else {
2673 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2674 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002675 }
2676
Victor Stinner81c41db2015-04-02 11:50:57 +02002677 if (!wait_connect) {
2678 if (raise) {
2679 /* restore error, maybe replaced by PyErr_CheckSignals() */
2680 SET_SOCK_ERROR(err);
2681 s->errorhandler();
2682 return -1;
2683 }
2684 else
2685 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002686 }
2687
Victor Stinner81c41db2015-04-02 11:50:57 +02002688 if (raise) {
2689 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002690 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2691 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002692 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002693 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002694 else {
2695 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002696 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2697 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002698 return err;
2699 }
2700 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002701}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002702
Fred Drake728819a2000-07-01 03:40:12 +00002703/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002704
Guido van Rossum73624e91994-10-10 17:59:00 +00002705static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002706sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 sock_addr_t addrbuf;
2709 int addrlen;
2710 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002712 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2713 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Victor Stinner81c41db2015-04-02 11:50:57 +02002715 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002716 if (res < 0)
2717 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002718
Victor Stinneree699e92015-03-31 21:28:42 +02002719 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002720}
2721
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002722PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002723"connect(address)\n\
2724\n\
2725Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002727
Guido van Rossum30a685f1991-06-27 15:51:29 +00002728
Fred Drake728819a2000-07-01 03:40:12 +00002729/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002730
2731static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002732sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 sock_addr_t addrbuf;
2735 int addrlen;
2736 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002738 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2739 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002740
Victor Stinner81c41db2015-04-02 11:50:57 +02002741 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002742 if (res < 0)
2743 return NULL;
2744
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002745 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002746}
2747
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002748PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002749"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002750\n\
2751This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002754
Guido van Rossumed233a51992-06-23 09:07:03 +00002755/* s.fileno() method */
2756
Guido van Rossum73624e91994-10-10 17:59:00 +00002757static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002758sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002761}
2762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002763PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002764"fileno() -> integer\n\
2765\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002766Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002767
Guido van Rossumed233a51992-06-23 09:07:03 +00002768
Guido van Rossumc89705d1992-11-26 08:54:07 +00002769/* s.getsockname() method */
2770
Guido van Rossum73624e91994-10-10 17:59:00 +00002771static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002772sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 sock_addr_t addrbuf;
2775 int res;
2776 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 if (!getsockaddrlen(s, &addrlen))
2779 return NULL;
2780 memset(&addrbuf, 0, addrlen);
2781 Py_BEGIN_ALLOW_THREADS
2782 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2783 Py_END_ALLOW_THREADS
2784 if (res < 0)
2785 return s->errorhandler();
2786 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2787 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002788}
2789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002790PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002791"getsockname() -> address info\n\
2792\n\
2793Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002794info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002795
Guido van Rossumc89705d1992-11-26 08:54:07 +00002796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002798/* s.getpeername() method */
2799
Guido van Rossum73624e91994-10-10 17:59:00 +00002800static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002801sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 sock_addr_t addrbuf;
2804 int res;
2805 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 if (!getsockaddrlen(s, &addrlen))
2808 return NULL;
2809 memset(&addrbuf, 0, addrlen);
2810 Py_BEGIN_ALLOW_THREADS
2811 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2812 Py_END_ALLOW_THREADS
2813 if (res < 0)
2814 return s->errorhandler();
2815 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2816 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002817}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002818
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002819PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002820"getpeername() -> address info\n\
2821\n\
2822Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002823info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002824
Guido van Rossumb6775db1994-08-01 11:34:53 +00002825#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002826
2827
Guido van Rossum30a685f1991-06-27 15:51:29 +00002828/* s.listen(n) method */
2829
Guido van Rossum73624e91994-10-10 17:59:00 +00002830static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002831sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002832{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002833 /* We try to choose a default backlog high enough to avoid connection drops
2834 * for common workloads, yet not too high to limit resource usage. */
2835 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002837
Charles-François Natali644b8f52014-05-22 19:45:39 +01002838 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002842 /* To avoid problems on systems that don't allow a negative backlog
2843 * (which doesn't make sense anyway) we force a minimum value of 0. */
2844 if (backlog < 0)
2845 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 res = listen(s->sock_fd, backlog);
2847 Py_END_ALLOW_THREADS
2848 if (res < 0)
2849 return s->errorhandler();
2850 Py_INCREF(Py_None);
2851 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002852}
2853
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002854PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002855"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002856\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002857Enable a server to accept connections. If backlog is specified, it must be\n\
2858at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002859unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002860connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002861
Victor Stinner31bf2d52015-04-01 21:57:09 +02002862struct sock_recv {
2863 char *cbuf;
2864 Py_ssize_t len;
2865 int flags;
2866 Py_ssize_t result;
2867};
2868
2869static int
2870sock_recv_impl(PySocketSockObject *s, void *data)
2871{
2872 struct sock_recv *ctx = data;
2873
2874#ifdef MS_WINDOWS
2875 if (ctx->len > INT_MAX)
2876 ctx->len = INT_MAX;
2877 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2878#else
2879 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2880#endif
2881 return (ctx->result >= 0);
2882}
2883
Guido van Rossum82a5c661998-07-07 20:45:43 +00002884
Thomas Wouters477c8d52006-05-27 19:21:47 +00002885/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002886 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002887 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002888 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002889 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002890 * also possible that we return a number of bytes smaller than the request
2891 * bytes.
2892 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002893
Antoine Pitrou19467d22010-08-17 19:33:30 +00002894static Py_ssize_t
2895sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002897 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 if (!IS_SELECTABLE(s)) {
2900 select_error();
2901 return -1;
2902 }
2903 if (len == 0) {
2904 /* If 0 bytes were requested, do nothing. */
2905 return 0;
2906 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002907
Victor Stinner31bf2d52015-04-01 21:57:09 +02002908 ctx.cbuf = cbuf;
2909 ctx.len = len;
2910 ctx.flags = flags;
2911 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002913
2914 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002915}
2916
Guido van Rossum48a680c2001-03-02 06:34:14 +00002917
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002918/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002919
Guido van Rossum73624e91994-10-10 17:59:00 +00002920static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002921sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002922{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002923 Py_ssize_t recvlen, outlen;
2924 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002926
Antoine Pitrou19467d22010-08-17 19:33:30 +00002927 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 if (recvlen < 0) {
2931 PyErr_SetString(PyExc_ValueError,
2932 "negative buffersize in recv");
2933 return NULL;
2934 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 /* Allocate a new string. */
2937 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2938 if (buf == NULL)
2939 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 /* Call the guts */
2942 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2943 if (outlen < 0) {
2944 /* An error occurred, release the string and return an
2945 error. */
2946 Py_DECREF(buf);
2947 return NULL;
2948 }
2949 if (outlen != recvlen) {
2950 /* We did not read as many bytes as we anticipated, resize the
2951 string if possible and be successful. */
2952 _PyBytes_Resize(&buf, outlen);
2953 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002956}
2957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002958PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002959"recv(buffersize[, flags]) -> data\n\
2960\n\
2961Receive up to buffersize bytes from the socket. For the optional flags\n\
2962argument, see the Unix manual. When no data is available, block until\n\
2963at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002964the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002965
Guido van Rossum30a685f1991-06-27 15:51:29 +00002966
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002967/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002968
Thomas Wouters477c8d52006-05-27 19:21:47 +00002969static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002970sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002973
Antoine Pitrou19467d22010-08-17 19:33:30 +00002974 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 Py_buffer pbuf;
2976 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002977 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002980 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 &pbuf, &recvlen, &flags))
2982 return NULL;
2983 buf = pbuf.buf;
2984 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 if (recvlen < 0) {
2987 PyBuffer_Release(&pbuf);
2988 PyErr_SetString(PyExc_ValueError,
2989 "negative buffersize in recv_into");
2990 return NULL;
2991 }
2992 if (recvlen == 0) {
2993 /* If nbytes was not specified, use the buffer's length */
2994 recvlen = buflen;
2995 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002997 /* Check if the buffer is large enough */
2998 if (buflen < recvlen) {
2999 PyBuffer_Release(&pbuf);
3000 PyErr_SetString(PyExc_ValueError,
3001 "buffer too small for requested bytes");
3002 return NULL;
3003 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 /* Call the guts */
3006 readlen = sock_recv_guts(s, buf, recvlen, flags);
3007 if (readlen < 0) {
3008 /* Return an error. */
3009 PyBuffer_Release(&pbuf);
3010 return NULL;
3011 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003013 PyBuffer_Release(&pbuf);
3014 /* Return the number of bytes read. Note that we do not do anything
3015 special here in the case that readlen < recvlen. */
3016 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003017}
3018
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003019PyDoc_STRVAR(recv_into_doc,
3020"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003021\n\
3022A version of recv() that stores its data into a buffer rather than creating \n\
3023a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
3024is not specified (or 0), receive up to the size available in the given buffer.\n\
3025\n\
3026See recv() for documentation about the flags.");
3027
Victor Stinner31bf2d52015-04-01 21:57:09 +02003028struct sock_recvfrom {
3029 char* cbuf;
3030 Py_ssize_t len;
3031 int flags;
3032 socklen_t *addrlen;
3033 sock_addr_t *addrbuf;
3034 Py_ssize_t result;
3035};
3036
3037static int
3038sock_recvfrom_impl(PySocketSockObject *s, void *data)
3039{
3040 struct sock_recvfrom *ctx = data;
3041
3042 memset(ctx->addrbuf, 0, *ctx->addrlen);
3043
3044#ifdef MS_WINDOWS
3045 if (ctx->len > INT_MAX)
3046 ctx->len = INT_MAX;
3047 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3048 SAS2SA(ctx->addrbuf), ctx->addrlen);
3049#else
3050 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3051 SAS2SA(ctx->addrbuf), ctx->addrlen);
3052#endif
3053 return (ctx->result >= 0);
3054}
3055
Thomas Wouters477c8d52006-05-27 19:21:47 +00003056
3057/*
Christian Heimes99170a52007-12-19 02:07:34 +00003058 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3059 * into a char buffer. If you have any inc/def ref to do to the objects that
3060 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003061 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003062 * that it is also possible that we return a number of bytes smaller than the
3063 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003064 *
3065 * 'addr' is a return value for the address object. Note that you must decref
3066 * it yourself.
3067 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003068static Py_ssize_t
3069sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003074 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 if (!getsockaddrlen(s, &addrlen))
3079 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003081 if (!IS_SELECTABLE(s)) {
3082 select_error();
3083 return -1;
3084 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003085
Victor Stinner31bf2d52015-04-01 21:57:09 +02003086 ctx.cbuf = cbuf;
3087 ctx.len = len;
3088 ctx.flags = flags;
3089 ctx.addrbuf = &addrbuf;
3090 ctx.addrlen = &addrlen;
3091 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003093
Victor Stinner31bf2d52015-04-01 21:57:09 +02003094 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3095 s->sock_proto);
3096 if (*addr == NULL)
3097 return -1;
3098
3099 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003100}
3101
3102/* s.recvfrom(nbytes [,flags]) method */
3103
3104static PyObject *
3105sock_recvfrom(PySocketSockObject *s, PyObject *args)
3106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003107 PyObject *buf = NULL;
3108 PyObject *addr = NULL;
3109 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003110 int flags = 0;
3111 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003112
Antoine Pitrou19467d22010-08-17 19:33:30 +00003113 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003114 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 if (recvlen < 0) {
3117 PyErr_SetString(PyExc_ValueError,
3118 "negative buffersize in recvfrom");
3119 return NULL;
3120 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3123 if (buf == NULL)
3124 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003126 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3127 recvlen, flags, &addr);
3128 if (outlen < 0) {
3129 goto finally;
3130 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 if (outlen != recvlen) {
3133 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003134 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003135 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003136 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 goto finally;
3138 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003141
3142finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003143 Py_XDECREF(buf);
3144 Py_XDECREF(addr);
3145 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003146}
3147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003148PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003149"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3150\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003151Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003152
Thomas Wouters477c8d52006-05-27 19:21:47 +00003153
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003154/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003155
3156static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003157sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003159 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003160
Antoine Pitrou19467d22010-08-17 19:33:30 +00003161 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 Py_buffer pbuf;
3163 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003164 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003166 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003167
Antoine Pitrou19467d22010-08-17 19:33:30 +00003168 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003169 kwlist, &pbuf,
3170 &recvlen, &flags))
3171 return NULL;
3172 buf = pbuf.buf;
3173 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003175 if (recvlen < 0) {
3176 PyBuffer_Release(&pbuf);
3177 PyErr_SetString(PyExc_ValueError,
3178 "negative buffersize in recvfrom_into");
3179 return NULL;
3180 }
3181 if (recvlen == 0) {
3182 /* If nbytes was not specified, use the buffer's length */
3183 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003184 } else if (recvlen > buflen) {
3185 PyBuffer_Release(&pbuf);
3186 PyErr_SetString(PyExc_ValueError,
3187 "nbytes is greater than the length of the buffer");
3188 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003189 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003191 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3192 if (readlen < 0) {
3193 PyBuffer_Release(&pbuf);
3194 /* Return an error */
3195 Py_XDECREF(addr);
3196 return NULL;
3197 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003198
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003199 PyBuffer_Release(&pbuf);
3200 /* Return the number of bytes read and the address. Note that we do
3201 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003202 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003203}
3204
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003205PyDoc_STRVAR(recvfrom_into_doc,
3206"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003207\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003208Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003209
Victor Stinner35bee932015-04-02 12:28:07 +02003210/* The sendmsg() and recvmsg[_into]() methods require a working
3211 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3212#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003213struct sock_recvmsg {
3214 struct msghdr *msg;
3215 int flags;
3216 ssize_t result;
3217};
3218
3219static int
3220sock_recvmsg_impl(PySocketSockObject *s, void *data)
3221{
3222 struct sock_recvmsg *ctx = data;
3223
3224 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3225 return (ctx->result >= 0);
3226}
3227
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228/*
3229 * Call recvmsg() with the supplied iovec structures, flags, and
3230 * ancillary data buffer size (controllen). Returns the tuple return
3231 * value for recvmsg() or recvmsg_into(), with the first item provided
3232 * by the supplied makeval() function. makeval() will be called with
3233 * the length read and makeval_data as arguments, and must return a
3234 * new reference (which will be decrefed if there is a subsequent
3235 * error). On error, closes any file descriptors received via
3236 * SCM_RIGHTS.
3237 */
3238static PyObject *
3239sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3240 int flags, Py_ssize_t controllen,
3241 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3242{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003243 sock_addr_t addrbuf;
3244 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003245 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003246 PyObject *cmsg_list = NULL, *retval = NULL;
3247 void *controlbuf = NULL;
3248 struct cmsghdr *cmsgh;
3249 size_t cmsgdatalen = 0;
3250 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003251 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003252
3253 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3254 ignored" when the socket is connected (Linux fills them in
3255 anyway for AF_UNIX sockets at least). Normally msg_namelen
3256 seems to be set to 0 if there's no address, but try to
3257 initialize msg_name to something that won't be mistaken for a
3258 real address if that doesn't happen. */
3259 if (!getsockaddrlen(s, &addrbuflen))
3260 return NULL;
3261 memset(&addrbuf, 0, addrbuflen);
3262 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3263
3264 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3265 PyErr_SetString(PyExc_ValueError,
3266 "invalid ancillary data buffer length");
3267 return NULL;
3268 }
3269 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3270 return PyErr_NoMemory();
3271
3272 /* Make the system call. */
3273 if (!IS_SELECTABLE(s)) {
3274 select_error();
3275 goto finally;
3276 }
3277
Victor Stinner31bf2d52015-04-01 21:57:09 +02003278 msg.msg_name = SAS2SA(&addrbuf);
3279 msg.msg_namelen = addrbuflen;
3280 msg.msg_iov = iov;
3281 msg.msg_iovlen = iovlen;
3282 msg.msg_control = controlbuf;
3283 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003284
Victor Stinner31bf2d52015-04-01 21:57:09 +02003285 ctx.msg = &msg;
3286 ctx.flags = flags;
3287 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003288 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003289
3290 /* Make list of (level, type, data) tuples from control messages. */
3291 if ((cmsg_list = PyList_New(0)) == NULL)
3292 goto err_closefds;
3293 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3294 implementations didn't do so. */
3295 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3296 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3297 PyObject *bytes, *tuple;
3298 int tmp;
3299
3300 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3301 if (cmsg_status != 0) {
3302 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3303 "received malformed or improperly-truncated "
3304 "ancillary data", 1) == -1)
3305 goto err_closefds;
3306 }
3307 if (cmsg_status < 0)
3308 break;
3309 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003310 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003311 goto err_closefds;
3312 }
3313
3314 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3315 cmsgdatalen);
3316 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3317 (int)cmsgh->cmsg_type, bytes);
3318 if (tuple == NULL)
3319 goto err_closefds;
3320 tmp = PyList_Append(cmsg_list, tuple);
3321 Py_DECREF(tuple);
3322 if (tmp != 0)
3323 goto err_closefds;
3324
3325 if (cmsg_status != 0)
3326 break;
3327 }
3328
3329 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003330 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003331 cmsg_list,
3332 (int)msg.msg_flags,
3333 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3334 ((msg.msg_namelen > addrbuflen) ?
3335 addrbuflen : msg.msg_namelen),
3336 s->sock_proto));
3337 if (retval == NULL)
3338 goto err_closefds;
3339
3340finally:
3341 Py_XDECREF(cmsg_list);
3342 PyMem_Free(controlbuf);
3343 return retval;
3344
3345err_closefds:
3346#ifdef SCM_RIGHTS
3347 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3348 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3349 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3350 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3351 if (cmsg_status < 0)
3352 break;
3353 if (cmsgh->cmsg_level == SOL_SOCKET &&
3354 cmsgh->cmsg_type == SCM_RIGHTS) {
3355 size_t numfds;
3356 int *fdp;
3357
3358 numfds = cmsgdatalen / sizeof(int);
3359 fdp = (int *)CMSG_DATA(cmsgh);
3360 while (numfds-- > 0)
3361 close(*fdp++);
3362 }
3363 if (cmsg_status != 0)
3364 break;
3365 }
3366#endif /* SCM_RIGHTS */
3367 goto finally;
3368}
3369
3370
3371static PyObject *
3372makeval_recvmsg(ssize_t received, void *data)
3373{
3374 PyObject **buf = data;
3375
3376 if (received < PyBytes_GET_SIZE(*buf))
3377 _PyBytes_Resize(buf, received);
3378 Py_XINCREF(*buf);
3379 return *buf;
3380}
3381
3382/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3383
3384static PyObject *
3385sock_recvmsg(PySocketSockObject *s, PyObject *args)
3386{
3387 Py_ssize_t bufsize, ancbufsize = 0;
3388 int flags = 0;
3389 struct iovec iov;
3390 PyObject *buf = NULL, *retval = NULL;
3391
3392 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3393 return NULL;
3394
3395 if (bufsize < 0) {
3396 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3397 return NULL;
3398 }
3399 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3400 return NULL;
3401 iov.iov_base = PyBytes_AS_STRING(buf);
3402 iov.iov_len = bufsize;
3403
3404 /* Note that we're passing a pointer to *our pointer* to the bytes
3405 object here (&buf); makeval_recvmsg() may incref the object, or
3406 deallocate it and set our pointer to NULL. */
3407 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3408 &makeval_recvmsg, &buf);
3409 Py_XDECREF(buf);
3410 return retval;
3411}
3412
3413PyDoc_STRVAR(recvmsg_doc,
3414"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3415\n\
3416Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3417socket. The ancbufsize argument sets the size in bytes of the\n\
3418internal buffer used to receive the ancillary data; it defaults to 0,\n\
3419meaning that no ancillary data will be received. Appropriate buffer\n\
3420sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3421CMSG_LEN(), and items which do not fit into the buffer might be\n\
3422truncated or discarded. The flags argument defaults to 0 and has the\n\
3423same meaning as for recv().\n\
3424\n\
3425The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3426The data item is a bytes object holding the non-ancillary data\n\
3427received. The ancdata item is a list of zero or more tuples\n\
3428(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3429(control messages) received: cmsg_level and cmsg_type are integers\n\
3430specifying the protocol level and protocol-specific type respectively,\n\
3431and cmsg_data is a bytes object holding the associated data. The\n\
3432msg_flags item is the bitwise OR of various flags indicating\n\
3433conditions on the received message; see your system documentation for\n\
3434details. If the receiving socket is unconnected, address is the\n\
3435address of the sending socket, if available; otherwise, its value is\n\
3436unspecified.\n\
3437\n\
3438If recvmsg() raises an exception after the system call returns, it\n\
3439will first attempt to close any file descriptors received via the\n\
3440SCM_RIGHTS mechanism.");
3441
3442
3443static PyObject *
3444makeval_recvmsg_into(ssize_t received, void *data)
3445{
3446 return PyLong_FromSsize_t(received);
3447}
3448
3449/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3450
3451static PyObject *
3452sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3453{
3454 Py_ssize_t ancbufsize = 0;
3455 int flags = 0;
3456 struct iovec *iovs = NULL;
3457 Py_ssize_t i, nitems, nbufs = 0;
3458 Py_buffer *bufs = NULL;
3459 PyObject *buffers_arg, *fast, *retval = NULL;
3460
3461 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3462 &buffers_arg, &ancbufsize, &flags))
3463 return NULL;
3464
3465 if ((fast = PySequence_Fast(buffers_arg,
3466 "recvmsg_into() argument 1 must be an "
3467 "iterable")) == NULL)
3468 return NULL;
3469 nitems = PySequence_Fast_GET_SIZE(fast);
3470 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003471 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003472 goto finally;
3473 }
3474
3475 /* Fill in an iovec for each item, and save the Py_buffer
3476 structs to release afterwards. */
3477 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3478 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3479 PyErr_NoMemory();
3480 goto finally;
3481 }
3482 for (; nbufs < nitems; nbufs++) {
3483 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3484 "w*;recvmsg_into() argument 1 must be an iterable "
3485 "of single-segment read-write buffers",
3486 &bufs[nbufs]))
3487 goto finally;
3488 iovs[nbufs].iov_base = bufs[nbufs].buf;
3489 iovs[nbufs].iov_len = bufs[nbufs].len;
3490 }
3491
3492 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3493 &makeval_recvmsg_into, NULL);
3494finally:
3495 for (i = 0; i < nbufs; i++)
3496 PyBuffer_Release(&bufs[i]);
3497 PyMem_Free(bufs);
3498 PyMem_Free(iovs);
3499 Py_DECREF(fast);
3500 return retval;
3501}
3502
3503PyDoc_STRVAR(recvmsg_into_doc,
3504"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3505\n\
3506Receive normal data and ancillary data from the socket, scattering the\n\
3507non-ancillary data into a series of buffers. The buffers argument\n\
3508must be an iterable of objects that export writable buffers\n\
3509(e.g. bytearray objects); these will be filled with successive chunks\n\
3510of the non-ancillary data until it has all been written or there are\n\
3511no more buffers. The ancbufsize argument sets the size in bytes of\n\
3512the internal buffer used to receive the ancillary data; it defaults to\n\
35130, meaning that no ancillary data will be received. Appropriate\n\
3514buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3515or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3516truncated or discarded. The flags argument defaults to 0 and has the\n\
3517same meaning as for recv().\n\
3518\n\
3519The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3520The nbytes item is the total number of bytes of non-ancillary data\n\
3521written into the buffers. The ancdata item is a list of zero or more\n\
3522tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3523data (control messages) received: cmsg_level and cmsg_type are\n\
3524integers specifying the protocol level and protocol-specific type\n\
3525respectively, and cmsg_data is a bytes object holding the associated\n\
3526data. The msg_flags item is the bitwise OR of various flags\n\
3527indicating conditions on the received message; see your system\n\
3528documentation for details. If the receiving socket is unconnected,\n\
3529address is the address of the sending socket, if available; otherwise,\n\
3530its value is unspecified.\n\
3531\n\
3532If recvmsg_into() raises an exception after the system call returns,\n\
3533it will first attempt to close any file descriptors received via the\n\
3534SCM_RIGHTS mechanism.");
3535#endif /* CMSG_LEN */
3536
3537
Victor Stinner31bf2d52015-04-01 21:57:09 +02003538struct sock_send {
3539 char *buf;
3540 Py_ssize_t len;
3541 int flags;
3542 Py_ssize_t result;
3543};
3544
3545static int
3546sock_send_impl(PySocketSockObject *s, void *data)
3547{
3548 struct sock_send *ctx = data;
3549
3550#ifdef MS_WINDOWS
3551 if (ctx->len > INT_MAX)
3552 ctx->len = INT_MAX;
3553 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3554#else
3555 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3556#endif
3557 return (ctx->result >= 0);
3558}
3559
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003560/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003561
Guido van Rossum73624e91994-10-10 17:59:00 +00003562static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003563sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003564{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003565 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003567 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3570 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 if (!IS_SELECTABLE(s)) {
3573 PyBuffer_Release(&pbuf);
3574 return select_error();
3575 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003576 ctx.buf = pbuf.buf;
3577 ctx.len = pbuf.len;
3578 ctx.flags = flags;
3579 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003580 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003581 return NULL;
3582 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003583 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003584
3585 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003586}
3587
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003588PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003589"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003590\n\
3591Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003592argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003593sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003594
3595
3596/* s.sendall(data [,flags]) method */
3597
3598static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003599sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003600{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003602 Py_ssize_t len, n;
3603 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003604 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003605 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003606 int has_timeout = (s->sock_timeout > 0);
3607 _PyTime_t interval = s->sock_timeout;
3608 _PyTime_t deadline = 0;
3609 int deadline_initialized = 0;
3610 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003612 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3613 return NULL;
3614 buf = pbuf.buf;
3615 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003617 if (!IS_SELECTABLE(s)) {
3618 PyBuffer_Release(&pbuf);
3619 return select_error();
3620 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003622 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003623 if (has_timeout) {
3624 if (deadline_initialized) {
3625 /* recompute the timeout */
3626 interval = deadline - _PyTime_GetMonotonicClock();
3627 }
3628 else {
3629 deadline_initialized = 1;
3630 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3631 }
3632
3633 if (interval <= 0) {
3634 PyErr_SetString(socket_timeout, "timed out");
3635 goto done;
3636 }
3637 }
3638
Victor Stinner02f32ab2015-04-01 22:53:26 +02003639 ctx.buf = buf;
3640 ctx.len = len;
3641 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003642 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3643 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003644 n = ctx.result;
3645 assert(n >= 0);
3646
3647 buf += n;
3648 len -= n;
3649
3650 /* We must run our signal handlers before looping again.
3651 send() can return a successful partial write when it is
3652 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003653 if (PyErr_CheckSignals())
3654 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003655 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003657
Victor Stinner8912d142015-04-06 23:16:34 +02003658 Py_INCREF(Py_None);
3659 res = Py_None;
3660
3661done:
3662 PyBuffer_Release(&pbuf);
3663 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003664}
3665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003666PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003667"sendall(data[, flags])\n\
3668\n\
3669Send a data string to the socket. For the optional flags\n\
3670argument, see the Unix manual. This calls send() repeatedly\n\
3671until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003672to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003673
Guido van Rossum30a685f1991-06-27 15:51:29 +00003674
Victor Stinner31bf2d52015-04-01 21:57:09 +02003675struct sock_sendto {
3676 char *buf;
3677 Py_ssize_t len;
3678 int flags;
3679 int addrlen;
3680 sock_addr_t *addrbuf;
3681 Py_ssize_t result;
3682};
3683
3684static int
3685sock_sendto_impl(PySocketSockObject *s, void *data)
3686{
3687 struct sock_sendto *ctx = data;
3688
3689#ifdef MS_WINDOWS
3690 if (ctx->len > INT_MAX)
3691 ctx->len = INT_MAX;
3692 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3693 SAS2SA(ctx->addrbuf), ctx->addrlen);
3694#else
3695 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3696 SAS2SA(ctx->addrbuf), ctx->addrlen);
3697#endif
3698 return (ctx->result >= 0);
3699}
3700
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003701/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003702
Guido van Rossum73624e91994-10-10 17:59:00 +00003703static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003704sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003706 Py_buffer pbuf;
3707 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003708 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003709 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003710 int addrlen, flags;
3711 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003713 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003714 arglen = PyTuple_Size(args);
3715 switch (arglen) {
3716 case 2:
3717 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3718 break;
3719 case 3:
3720 PyArg_ParseTuple(args, "y*iO:sendto",
3721 &pbuf, &flags, &addro);
3722 break;
3723 default:
3724 PyErr_Format(PyExc_TypeError,
3725 "sendto() takes 2 or 3 arguments (%d given)",
3726 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003727 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003728 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003729 if (PyErr_Occurred())
3730 return NULL;
3731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003732 if (!IS_SELECTABLE(s)) {
3733 PyBuffer_Release(&pbuf);
3734 return select_error();
3735 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3738 PyBuffer_Release(&pbuf);
3739 return NULL;
3740 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003741
Victor Stinner31bf2d52015-04-01 21:57:09 +02003742 ctx.buf = pbuf.buf;
3743 ctx.len = pbuf.len;
3744 ctx.flags = flags;
3745 ctx.addrlen = addrlen;
3746 ctx.addrbuf = &addrbuf;
3747 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003748 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003749 return NULL;
3750 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003751 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003752
3753 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003754}
3755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003756PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003757"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003758\n\
3759Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003760For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003761
Guido van Rossum30a685f1991-06-27 15:51:29 +00003762
Victor Stinner35bee932015-04-02 12:28:07 +02003763/* The sendmsg() and recvmsg[_into]() methods require a working
3764 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3765#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003766struct sock_sendmsg {
3767 struct msghdr *msg;
3768 int flags;
3769 ssize_t result;
3770};
3771
3772static int
3773sock_sendmsg_impl(PySocketSockObject *s, void *data)
3774{
3775 struct sock_sendmsg *ctx = data;
3776
3777 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3778 return (ctx->result >= 0);
3779}
3780
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003781/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3782
3783static PyObject *
3784sock_sendmsg(PySocketSockObject *s, PyObject *args)
3785{
3786 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3787 Py_buffer *databufs = NULL;
3788 struct iovec *iovs = NULL;
3789 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003790 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003791 struct cmsginfo {
3792 int level;
3793 int type;
3794 Py_buffer data;
3795 } *cmsgs = NULL;
3796 void *controlbuf = NULL;
3797 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003798 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003799 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3800 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003801 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003802
3803 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3804 &data_arg, &cmsg_arg, &flags, &addr_arg))
3805 return NULL;
3806
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003807 /* Parse destination address. */
3808 if (addr_arg != NULL && addr_arg != Py_None) {
3809 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3810 goto finally;
3811 msg.msg_name = &addrbuf;
3812 msg.msg_namelen = addrlen;
3813 }
3814
3815 /* Fill in an iovec for each message part, and save the Py_buffer
3816 structs to release afterwards. */
3817 if ((data_fast = PySequence_Fast(data_arg,
3818 "sendmsg() argument 1 must be an "
3819 "iterable")) == NULL)
3820 goto finally;
3821 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3822 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003823 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003824 goto finally;
3825 }
3826 msg.msg_iovlen = ndataparts;
3827 if (ndataparts > 0 &&
3828 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3829 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3830 PyErr_NoMemory();
3831 goto finally;
3832 }
3833 for (; ndatabufs < ndataparts; ndatabufs++) {
3834 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3835 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003836 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003837 &databufs[ndatabufs]))
3838 goto finally;
3839 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3840 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3841 }
3842
3843 if (cmsg_arg == NULL)
3844 ncmsgs = 0;
3845 else {
3846 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3847 "sendmsg() argument 2 must be an "
3848 "iterable")) == NULL)
3849 goto finally;
3850 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3851 }
3852
3853#ifndef CMSG_SPACE
3854 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003855 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003856 "sending multiple control messages is not supported "
3857 "on this system");
3858 goto finally;
3859 }
3860#endif
3861 /* Save level, type and Py_buffer for each control message,
3862 and calculate total size. */
3863 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3864 PyErr_NoMemory();
3865 goto finally;
3866 }
3867 controllen = controllen_last = 0;
3868 while (ncmsgbufs < ncmsgs) {
3869 size_t bufsize, space;
3870
3871 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3872 "(iiy*):[sendmsg() ancillary data items]",
3873 &cmsgs[ncmsgbufs].level,
3874 &cmsgs[ncmsgbufs].type,
3875 &cmsgs[ncmsgbufs].data))
3876 goto finally;
3877 bufsize = cmsgs[ncmsgbufs++].data.len;
3878
3879#ifdef CMSG_SPACE
3880 if (!get_CMSG_SPACE(bufsize, &space)) {
3881#else
3882 if (!get_CMSG_LEN(bufsize, &space)) {
3883#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003884 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003885 goto finally;
3886 }
3887 controllen += space;
3888 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003889 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003890 goto finally;
3891 }
3892 controllen_last = controllen;
3893 }
3894
3895 /* Construct ancillary data block from control message info. */
3896 if (ncmsgbufs > 0) {
3897 struct cmsghdr *cmsgh = NULL;
3898
3899 if ((msg.msg_control = controlbuf =
3900 PyMem_Malloc(controllen)) == NULL) {
3901 PyErr_NoMemory();
3902 goto finally;
3903 }
3904 msg.msg_controllen = controllen;
3905
3906 /* Need to zero out the buffer as a workaround for glibc's
3907 CMSG_NXTHDR() implementation. After getting the pointer to
3908 the next header, it checks its (uninitialized) cmsg_len
3909 member to see if the "message" fits in the buffer, and
3910 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003911 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003912 memset(controlbuf, 0, controllen);
3913
3914 for (i = 0; i < ncmsgbufs; i++) {
3915 size_t msg_len, data_len = cmsgs[i].data.len;
3916 int enough_space = 0;
3917
3918 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3919 if (cmsgh == NULL) {
3920 PyErr_Format(PyExc_RuntimeError,
3921 "unexpected NULL result from %s()",
3922 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3923 goto finally;
3924 }
3925 if (!get_CMSG_LEN(data_len, &msg_len)) {
3926 PyErr_SetString(PyExc_RuntimeError,
3927 "item size out of range for CMSG_LEN()");
3928 goto finally;
3929 }
3930 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3931 size_t space;
3932
3933 cmsgh->cmsg_len = msg_len;
3934 if (get_cmsg_data_space(&msg, cmsgh, &space))
3935 enough_space = (space >= data_len);
3936 }
3937 if (!enough_space) {
3938 PyErr_SetString(PyExc_RuntimeError,
3939 "ancillary data does not fit in calculated "
3940 "space");
3941 goto finally;
3942 }
3943 cmsgh->cmsg_level = cmsgs[i].level;
3944 cmsgh->cmsg_type = cmsgs[i].type;
3945 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3946 }
3947 }
3948
3949 /* Make the system call. */
3950 if (!IS_SELECTABLE(s)) {
3951 select_error();
3952 goto finally;
3953 }
3954
Victor Stinner31bf2d52015-04-01 21:57:09 +02003955 ctx.msg = &msg;
3956 ctx.flags = flags;
3957 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003958 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003959
3960 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003961
3962finally:
3963 PyMem_Free(controlbuf);
3964 for (i = 0; i < ncmsgbufs; i++)
3965 PyBuffer_Release(&cmsgs[i].data);
3966 PyMem_Free(cmsgs);
3967 Py_XDECREF(cmsg_fast);
3968 for (i = 0; i < ndatabufs; i++)
3969 PyBuffer_Release(&databufs[i]);
3970 PyMem_Free(databufs);
3971 PyMem_Free(iovs);
3972 Py_XDECREF(data_fast);
3973 return retval;
3974}
3975
3976PyDoc_STRVAR(sendmsg_doc,
3977"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3978\n\
3979Send normal and ancillary data to the socket, gathering the\n\
3980non-ancillary data from a series of buffers and concatenating it into\n\
3981a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003982data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003983The ancdata argument specifies the ancillary data (control messages)\n\
3984as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3985cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3986protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003987is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003988argument defaults to 0 and has the same meaning as for send(). If\n\
3989address is supplied and not None, it sets a destination address for\n\
3990the message. The return value is the number of bytes of non-ancillary\n\
3991data sent.");
3992#endif /* CMSG_LEN */
3993
3994
Guido van Rossum30a685f1991-06-27 15:51:29 +00003995/* s.shutdown(how) method */
3996
Guido van Rossum73624e91994-10-10 17:59:00 +00003997static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003998sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 int how;
4001 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00004002
Serhiy Storchaka78980432013-01-15 01:12:17 +02004003 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 if (how == -1 && PyErr_Occurred())
4005 return NULL;
4006 Py_BEGIN_ALLOW_THREADS
4007 res = shutdown(s->sock_fd, how);
4008 Py_END_ALLOW_THREADS
4009 if (res < 0)
4010 return s->errorhandler();
4011 Py_INCREF(Py_None);
4012 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004013}
4014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004015PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004016"shutdown(flag)\n\
4017\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00004018Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
4019of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004020
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004021#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00004022static PyObject*
4023sock_ioctl(PySocketSockObject *s, PyObject *arg)
4024{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 unsigned long cmd = SIO_RCVALL;
4026 PyObject *argO;
4027 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004029 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
4030 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00004031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004032 switch (cmd) {
4033 case SIO_RCVALL: {
4034 unsigned int option = RCVALL_ON;
4035 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
4036 return NULL;
4037 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4038 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4039 return set_error();
4040 }
4041 return PyLong_FromUnsignedLong(recv); }
4042 case SIO_KEEPALIVE_VALS: {
4043 struct tcp_keepalive ka;
4044 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4045 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4046 return NULL;
4047 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4048 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4049 return set_error();
4050 }
4051 return PyLong_FromUnsignedLong(recv); }
4052 default:
4053 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4054 return NULL;
4055 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004056}
4057PyDoc_STRVAR(sock_ioctl_doc,
4058"ioctl(cmd, option) -> long\n\
4059\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004060Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4061SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4062SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004063#endif
4064
4065#if defined(MS_WINDOWS)
4066static PyObject*
4067sock_share(PySocketSockObject *s, PyObject *arg)
4068{
4069 WSAPROTOCOL_INFO info;
4070 DWORD processId;
4071 int result;
4072
4073 if (!PyArg_ParseTuple(arg, "I", &processId))
4074 return NULL;
4075
4076 Py_BEGIN_ALLOW_THREADS
4077 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4078 Py_END_ALLOW_THREADS
4079 if (result == SOCKET_ERROR)
4080 return set_error();
4081 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4082}
4083PyDoc_STRVAR(sock_share_doc,
4084"share(process_id) -> bytes\n\
4085\n\
4086Share the socket with another process. The target process id\n\
4087must be provided and the resulting bytes object passed to the target\n\
4088process. There the shared socket can be instantiated by calling\n\
4089socket.fromshare().");
4090
Christian Heimesfaf2f632008-01-06 16:59:19 +00004091
4092#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004093
4094/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004095
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004096static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004097 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4098 accept_doc},
4099 {"bind", (PyCFunction)sock_bind, METH_O,
4100 bind_doc},
4101 {"close", (PyCFunction)sock_close, METH_NOARGS,
4102 close_doc},
4103 {"connect", (PyCFunction)sock_connect, METH_O,
4104 connect_doc},
4105 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4106 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004107 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4108 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4110 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004111#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 {"getpeername", (PyCFunction)sock_getpeername,
4113 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 {"getsockname", (PyCFunction)sock_getsockname,
4116 METH_NOARGS, getsockname_doc},
4117 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4118 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004119#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004120 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4121 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004122#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004123#if defined(MS_WINDOWS)
4124 {"share", (PyCFunction)sock_share, METH_VARARGS,
4125 sock_share_doc},
4126#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004127 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004128 listen_doc},
4129 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4130 recv_doc},
4131 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4132 recv_into_doc},
4133 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4134 recvfrom_doc},
4135 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4136 recvfrom_into_doc},
4137 {"send", (PyCFunction)sock_send, METH_VARARGS,
4138 send_doc},
4139 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4140 sendall_doc},
4141 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4142 sendto_doc},
4143 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4144 setblocking_doc},
4145 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4146 settimeout_doc},
4147 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4148 gettimeout_doc},
4149 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4150 setsockopt_doc},
4151 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4152 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004153#ifdef CMSG_LEN
4154 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4155 recvmsg_doc},
4156 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4157 recvmsg_into_doc,},
4158 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4159 sendmsg_doc},
4160#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004162};
4163
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004164/* SockObject members */
4165static PyMemberDef sock_memberlist[] = {
4166 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4167 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4168 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004169 {0},
4170};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004171
Victor Stinner71694d52015-03-28 01:18:54 +01004172static PyGetSetDef sock_getsetlist[] = {
4173 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4174 {NULL} /* sentinel */
4175};
4176
Guido van Rossum73624e91994-10-10 17:59:00 +00004177/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004178 First close the file description. */
4179
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004180static void
Victor Stinner19a8e842016-03-21 16:36:48 +01004181sock_finalize(PySocketSockObject *s)
4182{
4183 SOCKET_T fd;
4184 PyObject *error_type, *error_value, *error_traceback;
4185
4186 /* Save the current exception, if any. */
4187 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4188
4189 if (s->sock_fd != -1) {
4190 if (PyErr_ResourceWarning((PyObject *)s, 1, "unclosed %R", s)) {
4191 /* Spurious errors can appear at shutdown */
4192 if (PyErr_ExceptionMatches(PyExc_Warning)) {
4193 PyErr_WriteUnraisable((PyObject *)s);
4194 }
4195 }
4196
4197 /* Only close the socket *after* logging the ResourceWarning warning
4198 to allow the logger to call socket methods like
4199 socket.getsockname(). If the socket is closed before, socket
4200 methods fails with the EBADF error. */
4201 fd = s->sock_fd;
4202 s->sock_fd = -1;
4203
4204 /* We do not want to retry upon EINTR: see sock_close() */
4205 Py_BEGIN_ALLOW_THREADS
4206 (void) SOCKETCLOSE(fd);
4207 Py_END_ALLOW_THREADS
4208 }
4209
4210 /* Restore the saved exception. */
4211 PyErr_Restore(error_type, error_value, error_traceback);
4212}
4213
4214static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004215sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004216{
Victor Stinner19a8e842016-03-21 16:36:48 +01004217 if (PyObject_CallFinalizerFromDealloc((PyObject *)s) < 0)
4218 return;
4219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004221}
4222
Guido van Rossum30a685f1991-06-27 15:51:29 +00004223
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004224static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004225sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004226{
Victor Stinnere254e532014-07-26 14:36:55 +02004227 long sock_fd;
4228 /* On Windows, this test is needed because SOCKET_T is unsigned */
4229 if (s->sock_fd == INVALID_SOCKET) {
4230 sock_fd = -1;
4231 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004232#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004233 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004234 /* this can occur on Win64, and actually there is a special
4235 ugly printf formatter for decimal pointer length integer
4236 printing, only bother if necessary*/
4237 PyErr_SetString(PyExc_OverflowError,
4238 "no printf formatter to display "
4239 "the socket descriptor in decimal");
4240 return NULL;
4241 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004242#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004243 else
4244 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 return PyUnicode_FromFormat(
4246 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004247 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 s->sock_type,
4249 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004250}
4251
4252
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004253/* Create a new, uninitialized socket object. */
4254
4255static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004256sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004258 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 new = type->tp_alloc(type, 0);
4261 if (new != NULL) {
4262 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner9001d802015-04-06 23:06:01 +02004263 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004264 ((PySocketSockObject *)new)->errorhandler = &set_error;
4265 }
4266 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004267}
4268
4269
4270/* Initialize a new socket object. */
4271
Victor Stinnerdaf45552013-08-28 00:53:59 +02004272#ifdef SOCK_CLOEXEC
4273/* socket() and socketpair() fail with EINVAL on Linux kernel older
4274 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4275static int sock_cloexec_works = -1;
4276#endif
4277
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004278/*ARGSUSED*/
4279static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004280sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 PySocketSockObject *s = (PySocketSockObject *)self;
4283 PyObject *fdobj = NULL;
4284 SOCKET_T fd = INVALID_SOCKET;
4285 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4286 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004287#ifndef MS_WINDOWS
4288#ifdef SOCK_CLOEXEC
4289 int *atomic_flag_works = &sock_cloexec_works;
4290#else
4291 int *atomic_flag_works = NULL;
4292#endif
4293#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4296 "|iiiO:socket", keywords,
4297 &family, &type, &proto, &fdobj))
4298 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004301#ifdef MS_WINDOWS
4302 /* recreate a socket that was duplicated */
4303 if (PyBytes_Check(fdobj)) {
4304 WSAPROTOCOL_INFO info;
4305 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4306 PyErr_Format(PyExc_ValueError,
4307 "socket descriptor string has wrong size, "
4308 "should be %zu bytes.", sizeof(info));
4309 return -1;
4310 }
4311 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4312 Py_BEGIN_ALLOW_THREADS
4313 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4314 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4315 Py_END_ALLOW_THREADS
4316 if (fd == INVALID_SOCKET) {
4317 set_error();
4318 return -1;
4319 }
4320 family = info.iAddressFamily;
4321 type = info.iSocketType;
4322 proto = info.iProtocol;
4323 }
4324 else
4325#endif
4326 {
4327 fd = PyLong_AsSocket_t(fdobj);
4328 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4329 return -1;
4330 if (fd == INVALID_SOCKET) {
4331 PyErr_SetString(PyExc_ValueError,
4332 "can't use invalid socket value");
4333 return -1;
4334 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 }
4336 }
4337 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004338#ifdef MS_WINDOWS
4339 /* Windows implementation */
4340#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4341#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4342#endif
4343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004345 if (support_wsa_no_inherit) {
4346 fd = WSASocket(family, type, proto,
4347 NULL, 0,
4348 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4349 if (fd == INVALID_SOCKET) {
4350 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4351 support_wsa_no_inherit = 0;
4352 fd = socket(family, type, proto);
4353 }
4354 }
4355 else {
4356 fd = socket(family, type, proto);
4357 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 if (fd == INVALID_SOCKET) {
4361 set_error();
4362 return -1;
4363 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004364
4365 if (!support_wsa_no_inherit) {
4366 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4367 closesocket(fd);
4368 PyErr_SetFromWindowsErr(0);
4369 return -1;
4370 }
4371 }
4372#else
4373 /* UNIX */
4374 Py_BEGIN_ALLOW_THREADS
4375#ifdef SOCK_CLOEXEC
4376 if (sock_cloexec_works != 0) {
4377 fd = socket(family, type | SOCK_CLOEXEC, proto);
4378 if (sock_cloexec_works == -1) {
4379 if (fd >= 0) {
4380 sock_cloexec_works = 1;
4381 }
4382 else if (errno == EINVAL) {
4383 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4384 sock_cloexec_works = 0;
4385 fd = socket(family, type, proto);
4386 }
4387 }
4388 }
4389 else
4390#endif
4391 {
4392 fd = socket(family, type, proto);
4393 }
4394 Py_END_ALLOW_THREADS
4395
4396 if (fd == INVALID_SOCKET) {
4397 set_error();
4398 return -1;
4399 }
4400
4401 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4402 SOCKETCLOSE(fd);
4403 return -1;
4404 }
4405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004406 }
4407 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004409 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004410
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004411}
4412
4413
Guido van Rossumb6775db1994-08-01 11:34:53 +00004414/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004415
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004416static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4418 "_socket.socket", /* tp_name */
4419 sizeof(PySocketSockObject), /* tp_basicsize */
4420 0, /* tp_itemsize */
4421 (destructor)sock_dealloc, /* tp_dealloc */
4422 0, /* tp_print */
4423 0, /* tp_getattr */
4424 0, /* tp_setattr */
4425 0, /* tp_reserved */
4426 (reprfunc)sock_repr, /* tp_repr */
4427 0, /* tp_as_number */
4428 0, /* tp_as_sequence */
4429 0, /* tp_as_mapping */
4430 0, /* tp_hash */
4431 0, /* tp_call */
4432 0, /* tp_str */
4433 PyObject_GenericGetAttr, /* tp_getattro */
4434 0, /* tp_setattro */
4435 0, /* tp_as_buffer */
Victor Stinner19a8e842016-03-21 16:36:48 +01004436 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
4437 | Py_TPFLAGS_HAVE_FINALIZE, /* tp_flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 sock_doc, /* tp_doc */
4439 0, /* tp_traverse */
4440 0, /* tp_clear */
4441 0, /* tp_richcompare */
4442 0, /* tp_weaklistoffset */
4443 0, /* tp_iter */
4444 0, /* tp_iternext */
4445 sock_methods, /* tp_methods */
4446 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004447 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004448 0, /* tp_base */
4449 0, /* tp_dict */
4450 0, /* tp_descr_get */
4451 0, /* tp_descr_set */
4452 0, /* tp_dictoffset */
4453 sock_initobj, /* tp_init */
4454 PyType_GenericAlloc, /* tp_alloc */
4455 sock_new, /* tp_new */
4456 PyObject_Del, /* tp_free */
Victor Stinner19a8e842016-03-21 16:36:48 +01004457 0, /* tp_is_gc */
4458 0, /* tp_bases */
4459 0, /* tp_mro */
4460 0, /* tp_cache */
4461 0, /* tp_subclasses */
4462 0, /* tp_weaklist */
4463 0, /* tp_del */
4464 0, /* tp_version_tag */
4465 (destructor)sock_finalize, /* tp_finalize */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004466};
4467
Guido van Rossum30a685f1991-06-27 15:51:29 +00004468
Guido van Rossum81194471991-07-27 21:42:02 +00004469/* Python interface to gethostname(). */
4470
4471/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004472static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004473socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004474{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004475#ifdef MS_WINDOWS
4476 /* Don't use winsock's gethostname, as this returns the ANSI
4477 version of the hostname, whereas we need a Unicode string.
4478 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004479 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004480 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004481 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004482 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004483
4484 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004485 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004486
4487 if (GetLastError() != ERROR_MORE_DATA)
4488 return PyErr_SetFromWindowsErr(0);
4489
4490 if (size == 0)
4491 return PyUnicode_New(0, 0);
4492
4493 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4494 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004495 name = PyMem_New(wchar_t, size);
4496 if (!name) {
4497 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004498 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004499 }
Victor Stinner74168972011-11-17 01:11:36 +01004500 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4501 name,
4502 &size))
4503 {
4504 PyMem_Free(name);
4505 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004506 }
Victor Stinner74168972011-11-17 01:11:36 +01004507
4508 result = PyUnicode_FromWideChar(name, size);
4509 PyMem_Free(name);
4510 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004511#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004512 char buf[1024];
4513 int res;
4514 Py_BEGIN_ALLOW_THREADS
4515 res = gethostname(buf, (int) sizeof buf - 1);
4516 Py_END_ALLOW_THREADS
4517 if (res < 0)
4518 return set_error();
4519 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004520 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004521#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004522}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004524PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004525"gethostname() -> string\n\
4526\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004527Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004528
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004529#ifdef HAVE_SETHOSTNAME
4530PyDoc_STRVAR(sethostname_doc,
4531"sethostname(name)\n\n\
4532Sets the hostname to name.");
4533
4534static PyObject *
4535socket_sethostname(PyObject *self, PyObject *args)
4536{
4537 PyObject *hnobj;
4538 Py_buffer buf;
4539 int res, flag = 0;
4540
Christian Heimesd2774c72013-06-19 02:06:29 +02004541#ifdef _AIX
4542/* issue #18259, not declared in any useful header file */
4543extern int sethostname(const char *, size_t);
4544#endif
4545
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004546 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4547 PyErr_Clear();
4548 if (!PyArg_ParseTuple(args, "O&:sethostname",
4549 PyUnicode_FSConverter, &hnobj))
4550 return NULL;
4551 flag = 1;
4552 }
4553 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4554 if (!res) {
4555 res = sethostname(buf.buf, buf.len);
4556 PyBuffer_Release(&buf);
4557 }
4558 if (flag)
4559 Py_DECREF(hnobj);
4560 if (res)
4561 return set_error();
4562 Py_RETURN_NONE;
4563}
4564#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004565
Guido van Rossum30a685f1991-06-27 15:51:29 +00004566/* Python interface to gethostbyname(name). */
4567
4568/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004569static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004570socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 char *name;
4573 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004574 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004575
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004576 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 return NULL;
4578 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004579 goto finally;
4580 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4581finally:
4582 PyMem_Free(name);
4583 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004584}
4585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004586PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004587"gethostbyname(host) -> address\n\
4588\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004589Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004590
4591
Victor Stinner72400302016-01-28 15:41:01 +01004592static PyObject*
4593sock_decode_hostname(const char *name)
4594{
4595#ifdef MS_WINDOWS
4596 /* Issue #26227: gethostbyaddr() returns a string encoded
4597 * to the ANSI code page */
4598 return PyUnicode_DecodeFSDefault(name);
4599#else
4600 /* Decode from UTF-8 */
4601 return PyUnicode_FromString(name);
4602#endif
4603}
4604
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004605/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4606
4607static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004608gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004609{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 char **pch;
4611 PyObject *rtn_tuple = (PyObject *)NULL;
4612 PyObject *name_list = (PyObject *)NULL;
4613 PyObject *addr_list = (PyObject *)NULL;
4614 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004615 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 if (h == NULL) {
4618 /* Let's get real error message to return */
4619 set_herror(h_errno);
4620 return NULL;
4621 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 if (h->h_addrtype != af) {
4624 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004625 errno = EAFNOSUPPORT;
4626 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 return NULL;
4628 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 case AF_INET:
4633 if (alen < sizeof(struct sockaddr_in))
4634 return NULL;
4635 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004636
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004637#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 case AF_INET6:
4639 if (alen < sizeof(struct sockaddr_in6))
4640 return NULL;
4641 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004642#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 if ((name_list = PyList_New(0)) == NULL)
4647 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004649 if ((addr_list = PyList_New(0)) == NULL)
4650 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 /* SF #1511317: h_aliases can be NULL */
4653 if (h->h_aliases) {
4654 for (pch = h->h_aliases; *pch != NULL; pch++) {
4655 int status;
4656 tmp = PyUnicode_FromString(*pch);
4657 if (tmp == NULL)
4658 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 status = PyList_Append(name_list, tmp);
4661 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 if (status)
4664 goto err;
4665 }
4666 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4669 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 case AF_INET:
4674 {
4675 struct sockaddr_in sin;
4676 memset(&sin, 0, sizeof(sin));
4677 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004678#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4682 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 if (pch == h->h_addr_list && alen >= sizeof(sin))
4685 memcpy((char *) addr, &sin, sizeof(sin));
4686 break;
4687 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004688
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004689#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 case AF_INET6:
4691 {
4692 struct sockaddr_in6 sin6;
4693 memset(&sin6, 0, sizeof(sin6));
4694 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004695#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4699 tmp = makeipaddr((struct sockaddr *)&sin6,
4700 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4703 memcpy((char *) addr, &sin6, sizeof(sin6));
4704 break;
4705 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004706#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004709 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 "unsupported address family");
4711 return NULL;
4712 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 if (tmp == NULL)
4715 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 status = PyList_Append(addr_list, tmp);
4718 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 if (status)
4721 goto err;
4722 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004723
Victor Stinner72400302016-01-28 15:41:01 +01004724 name = sock_decode_hostname(h->h_name);
4725 if (name == NULL)
4726 goto err;
4727 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004728
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004729 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004730 Py_XDECREF(name_list);
4731 Py_XDECREF(addr_list);
4732 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004733}
4734
4735
4736/* Python interface to gethostbyname_ex(name). */
4737
4738/*ARGSUSED*/
4739static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004740socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004741{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 char *name;
4743 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004744 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004746 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004747#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004749#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004751#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 char buf[16384];
4753 int buf_len = (sizeof buf) - 1;
4754 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004755#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004756#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004758#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004759#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004760
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004761 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004762 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004763 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004764 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004766#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004767#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004768 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004770#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004772#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 memset((void *) &data, '\0', sizeof(data));
4774 result = gethostbyname_r(name, &hp_allocated, &data);
4775 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004776#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004777#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004778#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004782#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 Py_END_ALLOW_THREADS
4784 /* Some C libraries would require addr.__ss_family instead of
4785 addr.ss_family.
4786 Therefore, we cast the sockaddr_storage into sockaddr to
4787 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004788 sa = SAS2SA(&addr);
4789 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004791#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004793#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004794finally:
4795 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004797}
4798
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004799PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004800"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4801\n\
4802Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004803for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004804
4805
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004806/* Python interface to gethostbyaddr(IP). */
4807
4808/*ARGSUSED*/
4809static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004810socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004811{
Charles-François Natali8b759652011-12-23 16:44:51 +01004812 sock_addr_t addr;
4813 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 char *ip_num;
4815 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004816 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004817#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004819#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004821#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004822 /* glibcs up to 2.10 assume that the buf argument to
4823 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4824 does not ensure. The attribute below instructs the compiler
4825 to maintain this alignment. */
4826 char buf[16384] Py_ALIGNED(8);
4827 int buf_len = (sizeof buf) - 1;
4828 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004829#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004830#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004832#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004833#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004834 char *ap;
4835 int al;
4836 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004837
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004838 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 return NULL;
4840 af = AF_UNSPEC;
4841 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004842 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 af = sa->sa_family;
4844 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004845 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004846 switch (af) {
4847 case AF_INET:
4848 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4849 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4850 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004851#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 case AF_INET6:
4853 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4854 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4855 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004858 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004859 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 }
4861 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004862#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004863#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004864 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 &hp_allocated, buf, buf_len,
4866 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004867#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 h = gethostbyaddr_r(ap, al, af,
4869 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004870#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 memset((void *) &data, '\0', sizeof(data));
4872 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4873 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004874#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004875#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004876#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004880#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004882 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004883#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004885#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004886finally:
4887 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004889}
4890
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004891PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004892"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4893\n\
4894Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004895for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004896
Guido van Rossum30a685f1991-06-27 15:51:29 +00004897
4898/* Python interface to getservbyname(name).
4899 This only returns the port number, since the other info is already
4900 known or not useful (like the list of aliases). */
4901
4902/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004903static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004904socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004905{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 char *name, *proto=NULL;
4907 struct servent *sp;
4908 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4909 return NULL;
4910 Py_BEGIN_ALLOW_THREADS
4911 sp = getservbyname(name, proto);
4912 Py_END_ALLOW_THREADS
4913 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004914 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 return NULL;
4916 }
4917 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004918}
4919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004920PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004921"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004922\n\
4923Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004924The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4925otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004926
Guido van Rossum30a685f1991-06-27 15:51:29 +00004927
Barry Warsaw11b91a02004-06-28 00:50:43 +00004928/* Python interface to getservbyport(port).
4929 This only returns the service name, since the other info is already
4930 known or not useful (like the list of aliases). */
4931
4932/*ARGSUSED*/
4933static PyObject *
4934socket_getservbyport(PyObject *self, PyObject *args)
4935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004936 int port;
4937 char *proto=NULL;
4938 struct servent *sp;
4939 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4940 return NULL;
4941 if (port < 0 || port > 0xffff) {
4942 PyErr_SetString(
4943 PyExc_OverflowError,
4944 "getservbyport: port must be 0-65535.");
4945 return NULL;
4946 }
4947 Py_BEGIN_ALLOW_THREADS
4948 sp = getservbyport(htons((short)port), proto);
4949 Py_END_ALLOW_THREADS
4950 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004951 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 return NULL;
4953 }
4954 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004955}
4956
4957PyDoc_STRVAR(getservbyport_doc,
4958"getservbyport(port[, protocolname]) -> string\n\
4959\n\
4960Return the service name from a port number and protocol name.\n\
4961The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4962otherwise any protocol will match.");
4963
Guido van Rossum3901d851996-12-19 16:35:04 +00004964/* Python interface to getprotobyname(name).
4965 This only returns the protocol number, since the other info is
4966 already known or not useful (like the list of aliases). */
4967
4968/*ARGSUSED*/
4969static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004970socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 char *name;
4973 struct protoent *sp;
4974 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4975 return NULL;
4976 Py_BEGIN_ALLOW_THREADS
4977 sp = getprotobyname(name);
4978 Py_END_ALLOW_THREADS
4979 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004980 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 return NULL;
4982 }
4983 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004984}
4985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004986PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004987"getprotobyname(name) -> integer\n\
4988\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004989Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004990
Guido van Rossum3901d851996-12-19 16:35:04 +00004991
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004992#ifndef NO_DUP
4993/* dup() function for socket fds */
4994
4995static PyObject *
4996socket_dup(PyObject *self, PyObject *fdobj)
4997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 SOCKET_T fd, newfd;
4999 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005000#ifdef MS_WINDOWS
5001 WSAPROTOCOL_INFO info;
5002#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 fd = PyLong_AsSocket_t(fdobj);
5005 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
5006 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005007
Victor Stinnerdaf45552013-08-28 00:53:59 +02005008#ifdef MS_WINDOWS
5009 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
5010 return set_error();
5011
5012 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
5013 FROM_PROTOCOL_INFO,
5014 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (newfd == INVALID_SOCKET)
5016 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005017
Victor Stinnerdaf45552013-08-28 00:53:59 +02005018 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
5019 closesocket(newfd);
5020 PyErr_SetFromWindowsErr(0);
5021 return NULL;
5022 }
5023#else
5024 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
5025 newfd = _Py_dup(fd);
5026 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01005027 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005028#endif
5029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 newfdobj = PyLong_FromSocket_t(newfd);
5031 if (newfdobj == NULL)
5032 SOCKETCLOSE(newfd);
5033 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005034}
5035
5036PyDoc_STRVAR(dup_doc,
5037"dup(integer) -> integer\n\
5038\n\
5039Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
5040sockets; on some platforms os.dup() won't work for socket file descriptors.");
5041#endif
5042
5043
Dave Cole331708b2004-08-09 04:51:41 +00005044#ifdef HAVE_SOCKETPAIR
5045/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00005046 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00005047 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00005048
5049/*ARGSUSED*/
5050static PyObject *
5051socket_socketpair(PyObject *self, PyObject *args)
5052{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 PySocketSockObject *s0 = NULL, *s1 = NULL;
5054 SOCKET_T sv[2];
5055 int family, type = SOCK_STREAM, proto = 0;
5056 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005057#ifdef SOCK_CLOEXEC
5058 int *atomic_flag_works = &sock_cloexec_works;
5059#else
5060 int *atomic_flag_works = NULL;
5061#endif
5062 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00005063
5064#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00005066#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00005068#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5070 &family, &type, &proto))
5071 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005074 Py_BEGIN_ALLOW_THREADS
5075#ifdef SOCK_CLOEXEC
5076 if (sock_cloexec_works != 0) {
5077 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5078 if (sock_cloexec_works == -1) {
5079 if (ret >= 0) {
5080 sock_cloexec_works = 1;
5081 }
5082 else if (errno == EINVAL) {
5083 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5084 sock_cloexec_works = 0;
5085 ret = socketpair(family, type, proto, sv);
5086 }
5087 }
5088 }
5089 else
5090#endif
5091 {
5092 ret = socketpair(family, type, proto, sv);
5093 }
5094 Py_END_ALLOW_THREADS
5095
5096 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005098
5099 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5100 goto finally;
5101 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5102 goto finally;
5103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 s0 = new_sockobject(sv[0], family, type, proto);
5105 if (s0 == NULL)
5106 goto finally;
5107 s1 = new_sockobject(sv[1], family, type, proto);
5108 if (s1 == NULL)
5109 goto finally;
5110 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005111
5112finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 if (res == NULL) {
5114 if (s0 == NULL)
5115 SOCKETCLOSE(sv[0]);
5116 if (s1 == NULL)
5117 SOCKETCLOSE(sv[1]);
5118 }
5119 Py_XDECREF(s0);
5120 Py_XDECREF(s1);
5121 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005122}
5123
5124PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005125"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005126\n\
5127Create a pair of socket objects from the sockets returned by the platform\n\
5128socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005129The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005130AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005131
5132#endif /* HAVE_SOCKETPAIR */
5133
5134
Guido van Rossum006bf911996-06-12 04:04:55 +00005135static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005136socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005137{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5141 return NULL;
5142 }
5143 if (x1 < 0) {
5144 PyErr_SetString(PyExc_OverflowError,
5145 "can't convert negative number to unsigned long");
5146 return NULL;
5147 }
5148 x2 = (unsigned int)ntohs((unsigned short)x1);
5149 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005150}
5151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005152PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005153"ntohs(integer) -> integer\n\
5154\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005155Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005156
5157
Guido van Rossum006bf911996-06-12 04:04:55 +00005158static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005159socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005163 if (PyLong_Check(arg)) {
5164 x = PyLong_AsUnsignedLong(arg);
5165 if (x == (unsigned long) -1 && PyErr_Occurred())
5166 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005167#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 {
5169 unsigned long y;
5170 /* only want the trailing 32 bits */
5171 y = x & 0xFFFFFFFFUL;
5172 if (y ^ x)
5173 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005174 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 x = y;
5176 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005177#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 }
5179 else
5180 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005181 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005184}
5185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005186PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005187"ntohl(integer) -> integer\n\
5188\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005189Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005190
5191
Guido van Rossum006bf911996-06-12 04:04:55 +00005192static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005193socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5198 return NULL;
5199 }
5200 if (x1 < 0) {
5201 PyErr_SetString(PyExc_OverflowError,
5202 "can't convert negative number to unsigned long");
5203 return NULL;
5204 }
5205 x2 = (unsigned int)htons((unsigned short)x1);
5206 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005207}
5208
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005209PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005210"htons(integer) -> integer\n\
5211\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005212Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005213
5214
Guido van Rossum006bf911996-06-12 04:04:55 +00005215static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005216socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005217{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005218 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 if (PyLong_Check(arg)) {
5221 x = PyLong_AsUnsignedLong(arg);
5222 if (x == (unsigned long) -1 && PyErr_Occurred())
5223 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005224#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 {
5226 unsigned long y;
5227 /* only want the trailing 32 bits */
5228 y = x & 0xFFFFFFFFUL;
5229 if (y ^ x)
5230 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005231 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005232 x = y;
5233 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 }
5236 else
5237 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005238 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 Py_TYPE(arg)->tp_name);
5240 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005241}
5242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005243PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005244"htonl(integer) -> integer\n\
5245\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005246Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005247
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005248/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005249
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005250PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005251"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005252\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005253Convert 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 +00005254binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005255
5256static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005257socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005258{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005259#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005261#endif
5262
5263#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005264#if (SIZEOF_INT != 4)
5265#error "Not sure if in_addr_t exists and int is not 32-bits."
5266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 /* Have to use inet_addr() instead */
5268 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5273 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005274
Tim Peters1df9fdd2003-02-13 03:13:40 +00005275
5276#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005277
5278#ifdef USE_INET_ATON_WEAKLINK
5279 if (inet_aton != NULL) {
5280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 if (inet_aton(ip_addr, &buf))
5282 return PyBytes_FromStringAndSize((char *)(&buf),
5283 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005284
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005285 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 "illegal IP address string passed to inet_aton");
5287 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005288
Thomas Wouters477c8d52006-05-27 19:21:47 +00005289#ifdef USE_INET_ATON_WEAKLINK
5290 } else {
5291#endif
5292
5293#endif
5294
5295#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 /* special-case this address as inet_addr might return INADDR_NONE
5298 * for this */
5299 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005300 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005306 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 "illegal IP address string passed to inet_aton");
5308 return NULL;
5309 }
5310 }
5311 return PyBytes_FromStringAndSize((char *) &packed_addr,
5312 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005313
5314#ifdef USE_INET_ATON_WEAKLINK
5315 }
5316#endif
5317
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005318#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005319}
5320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005321PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005322"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005323\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005324Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005325
5326static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005327socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005328{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005329 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005331
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005332 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 return NULL;
5334 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005335
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005336 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005337 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005339 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 return NULL;
5341 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005342
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005343 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5344 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005347}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005348
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005349#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005350
5351PyDoc_STRVAR(inet_pton_doc,
5352"inet_pton(af, ip) -> packed IP address string\n\
5353\n\
5354Convert an IP address from string format to a packed string suitable\n\
5355for use with low-level network functions.");
5356
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005357#endif
5358
5359#ifdef HAVE_INET_PTON
5360
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005361static PyObject *
5362socket_inet_pton(PyObject *self, PyObject *args)
5363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005364 int af;
5365 char* ip;
5366 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005367#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005368 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005369#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5373 return NULL;
5374 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005375
Martin v. Löwis04697e82004-06-02 12:35:29 +00005376#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005378 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 "can't use AF_INET6, IPv6 is disabled");
5380 return NULL;
5381 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005382#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 retval = inet_pton(af, ip, packed);
5385 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005386 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 return NULL;
5388 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005389 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 "illegal IP address string passed to inet_pton");
5391 return NULL;
5392 } else if (af == AF_INET) {
5393 return PyBytes_FromStringAndSize(packed,
5394 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005395#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 } else if (af == AF_INET6) {
5397 return PyBytes_FromStringAndSize(packed,
5398 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005399#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005401 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 return NULL;
5403 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005404}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005405#elif defined(MS_WINDOWS)
5406
5407static PyObject *
5408socket_inet_pton(PyObject *self, PyObject *args)
5409{
5410 int af;
5411 char* ip;
5412 struct sockaddr_in6 addr;
5413 INT ret, size;
5414
5415 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5416 return NULL;
5417 }
5418
Victor Stinnere990c6e2013-11-16 00:18:58 +01005419 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005420 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5421
5422 if (ret) {
5423 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5424 return NULL;
5425 } else if(af == AF_INET) {
5426 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005427 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005428 sizeof(addr4->sin_addr));
5429 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005430 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005431 sizeof(addr.sin6_addr));
5432 } else {
5433 PyErr_SetString(PyExc_OSError, "unknown address family");
5434 return NULL;
5435 }
5436}
5437
5438#endif
5439
5440#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005441
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005442PyDoc_STRVAR(inet_ntop_doc,
5443"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5444\n\
5445Convert a packed IP address of the given family to string format.");
5446
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005447#endif
5448
5449
5450#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005451static PyObject *
5452socket_inet_ntop(PyObject *self, PyObject *args)
5453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005455 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005456 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005457#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005458 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005459#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005461#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005463 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5464 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005465
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005466 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 return NULL;
5468 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005471 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 PyErr_SetString(PyExc_ValueError,
5473 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005474 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005475 return NULL;
5476 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005477#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005479 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005480 PyErr_SetString(PyExc_ValueError,
5481 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005482 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 return NULL;
5484 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 } else {
5487 PyErr_Format(PyExc_ValueError,
5488 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005489 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 return NULL;
5491 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005492
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005493 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5494 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005495 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005496 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 return NULL;
5498 } else {
5499 return PyUnicode_FromString(retval);
5500 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005501}
5502
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005503#elif defined(MS_WINDOWS)
5504
5505static PyObject *
5506socket_inet_ntop(PyObject *self, PyObject *args)
5507{
5508 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005509 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005510 struct sockaddr_in6 addr;
5511 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005512#ifdef ENABLE_IPV6
5513 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5514#else
5515 char ip[INET_ADDRSTRLEN + 1];
5516#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005517
5518 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5519 memset((void *) &ip[0], '\0', sizeof(ip));
5520
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005521 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005522 return NULL;
5523 }
5524
5525 if (af == AF_INET) {
5526 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5527
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005528 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005529 PyErr_SetString(PyExc_ValueError,
5530 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005531 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005532 return NULL;
5533 }
5534 memset(addr4, 0, sizeof(struct sockaddr_in));
5535 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005536 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005537 addrlen = sizeof(struct sockaddr_in);
5538 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005539 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005540 PyErr_SetString(PyExc_ValueError,
5541 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005542 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005543 return NULL;
5544 }
5545
5546 memset(&addr, 0, sizeof(addr));
5547 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005548 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005549 addrlen = sizeof(addr);
5550 } else {
5551 PyErr_Format(PyExc_ValueError,
5552 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005553 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005554 return NULL;
5555 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005556 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005557
5558 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005559 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005560 ip, &retlen);
5561
5562 if (ret) {
5563 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5564 return NULL;
5565 } else {
5566 return PyUnicode_FromString(ip);
5567 }
5568}
5569
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005570#endif /* HAVE_INET_PTON */
5571
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005572/* Python interface to getaddrinfo(host, port). */
5573
5574/*ARGSUSED*/
5575static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005576socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005577{
Victor Stinner77af1722011-05-26 14:05:59 +02005578 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005579 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 struct addrinfo hints, *res;
5581 struct addrinfo *res0 = NULL;
5582 PyObject *hobj = NULL;
5583 PyObject *pobj = (PyObject *)NULL;
5584 char pbuf[30];
5585 char *hptr, *pptr;
5586 int family, socktype, protocol, flags;
5587 int error;
5588 PyObject *all = (PyObject *)NULL;
5589 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005590
Georg Brandl6083a4b2013-10-14 06:51:46 +02005591 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005592 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005593 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005594 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 &protocol, &flags)) {
5596 return NULL;
5597 }
5598 if (hobj == Py_None) {
5599 hptr = NULL;
5600 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005601 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005602 if (!idna)
5603 return NULL;
5604 assert(PyBytes_Check(idna));
5605 hptr = PyBytes_AS_STRING(idna);
5606 } else if (PyBytes_Check(hobj)) {
5607 hptr = PyBytes_AsString(hobj);
5608 } else {
5609 PyErr_SetString(PyExc_TypeError,
5610 "getaddrinfo() argument 1 must be string or None");
5611 return NULL;
5612 }
5613 if (PyLong_CheckExact(pobj)) {
5614 long value = PyLong_AsLong(pobj);
5615 if (value == -1 && PyErr_Occurred())
5616 goto err;
5617 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5618 pptr = pbuf;
5619 } else if (PyUnicode_Check(pobj)) {
5620 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005621 if (pptr == NULL)
5622 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005624 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 } else if (pobj == Py_None) {
5626 pptr = (char *)NULL;
5627 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005628 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005629 goto err;
5630 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005631#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005632 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5633 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005634 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5635 * This workaround avoids a segfault in libsystem.
5636 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005637 pptr = "00";
5638 }
5639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005640 memset(&hints, 0, sizeof(hints));
5641 hints.ai_family = family;
5642 hints.ai_socktype = socktype;
5643 hints.ai_protocol = protocol;
5644 hints.ai_flags = flags;
5645 Py_BEGIN_ALLOW_THREADS
5646 ACQUIRE_GETADDRINFO_LOCK
5647 error = getaddrinfo(hptr, pptr, &hints, &res0);
5648 Py_END_ALLOW_THREADS
5649 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5650 if (error) {
5651 set_gaierror(error);
5652 goto err;
5653 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005654
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005655 all = PyList_New(0);
5656 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 goto err;
5658 for (res = res0; res; res = res->ai_next) {
5659 PyObject *single;
5660 PyObject *addr =
5661 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5662 if (addr == NULL)
5663 goto err;
5664 single = Py_BuildValue("iiisO", res->ai_family,
5665 res->ai_socktype, res->ai_protocol,
5666 res->ai_canonname ? res->ai_canonname : "",
5667 addr);
5668 Py_DECREF(addr);
5669 if (single == NULL)
5670 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005672 if (PyList_Append(all, single))
5673 goto err;
5674 Py_XDECREF(single);
5675 }
5676 Py_XDECREF(idna);
5677 if (res0)
5678 freeaddrinfo(res0);
5679 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005680 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 Py_XDECREF(all);
5682 Py_XDECREF(idna);
5683 if (res0)
5684 freeaddrinfo(res0);
5685 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005686}
5687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005688PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005689"getaddrinfo(host, port [, family, type, proto, flags])\n\
5690 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005691\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005692Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005693
5694/* Python interface to getnameinfo(sa, flags). */
5695
5696/*ARGSUSED*/
5697static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005698socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 PyObject *sa = (PyObject *)NULL;
5701 int flags;
5702 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005703 int port;
5704 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5706 struct addrinfo hints, *res = NULL;
5707 int error;
5708 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005709 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005711 flags = flowinfo = scope_id = 0;
5712 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5713 return NULL;
5714 if (!PyTuple_Check(sa)) {
5715 PyErr_SetString(PyExc_TypeError,
5716 "getnameinfo() argument 1 must be a tuple");
5717 return NULL;
5718 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005719 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005720 &hostp, &port, &flowinfo, &scope_id))
5721 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005722 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005723 PyErr_SetString(PyExc_OverflowError,
5724 "getsockaddrarg: flowinfo must be 0-1048575.");
5725 return NULL;
5726 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5728 memset(&hints, 0, sizeof(hints));
5729 hints.ai_family = AF_UNSPEC;
5730 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005731 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005732 Py_BEGIN_ALLOW_THREADS
5733 ACQUIRE_GETADDRINFO_LOCK
5734 error = getaddrinfo(hostp, pbuf, &hints, &res);
5735 Py_END_ALLOW_THREADS
5736 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5737 if (error) {
5738 set_gaierror(error);
5739 goto fail;
5740 }
5741 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005742 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 "sockaddr resolved to multiple addresses");
5744 goto fail;
5745 }
5746 switch (res->ai_family) {
5747 case AF_INET:
5748 {
5749 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005750 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 "IPv4 sockaddr must be 2 tuple");
5752 goto fail;
5753 }
5754 break;
5755 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005756#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 case AF_INET6:
5758 {
5759 struct sockaddr_in6 *sin6;
5760 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005761 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 sin6->sin6_scope_id = scope_id;
5763 break;
5764 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005766 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005767 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5769 if (error) {
5770 set_gaierror(error);
5771 goto fail;
5772 }
Victor Stinner72400302016-01-28 15:41:01 +01005773
5774 name = sock_decode_hostname(hbuf);
5775 if (name == NULL)
5776 goto fail;
5777 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005778
5779fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005780 if (res)
5781 freeaddrinfo(res);
5782 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005783}
5784
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005785PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005786"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005787\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005788Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005789
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005790
5791/* Python API to getting and setting the default timeout value. */
5792
5793static PyObject *
5794socket_getdefaulttimeout(PyObject *self)
5795{
Victor Stinner71694d52015-03-28 01:18:54 +01005796 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 Py_INCREF(Py_None);
5798 return Py_None;
5799 }
Victor Stinner71694d52015-03-28 01:18:54 +01005800 else {
5801 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5802 return PyFloat_FromDouble(seconds);
5803 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005804}
5805
5806PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005807"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005808\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005809Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005810A value of None indicates that new socket objects have no timeout.\n\
5811When the socket module is first imported, the default is None.");
5812
5813static PyObject *
5814socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5815{
Victor Stinner71694d52015-03-28 01:18:54 +01005816 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005817
Victor Stinner71694d52015-03-28 01:18:54 +01005818 if (socket_parse_timeout(&timeout, arg) < 0)
5819 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 Py_INCREF(Py_None);
5824 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005825}
5826
5827PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005828"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005829\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005830Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005831A value of None indicates that new socket objects have no timeout.\n\
5832When the socket module is first imported, the default is None.");
5833
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005834#ifdef HAVE_IF_NAMEINDEX
5835/* Python API for getting interface indices and names */
5836
5837static PyObject *
5838socket_if_nameindex(PyObject *self, PyObject *arg)
5839{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005840 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005841 int i;
5842 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005843
Charles-François Natali60713592011-05-20 16:55:06 +02005844 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005845 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005846 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005847 return NULL;
5848 }
5849
5850 list = PyList_New(0);
5851 if (list == NULL) {
5852 if_freenameindex(ni);
5853 return NULL;
5854 }
5855
Charles-François Natali60713592011-05-20 16:55:06 +02005856 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5857 PyObject *ni_tuple = Py_BuildValue("IO&",
5858 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005859
5860 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5861 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005862 Py_DECREF(list);
5863 if_freenameindex(ni);
5864 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005865 }
5866 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005867 }
5868
5869 if_freenameindex(ni);
5870 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005871}
5872
5873PyDoc_STRVAR(if_nameindex_doc,
5874"if_nameindex()\n\
5875\n\
5876Returns a list of network interface information (index, name) tuples.");
5877
Charles-François Natali60713592011-05-20 16:55:06 +02005878static PyObject *
5879socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005880{
Charles-François Natali60713592011-05-20 16:55:06 +02005881 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005882 unsigned long index;
5883
Charles-François Natali60713592011-05-20 16:55:06 +02005884 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5885 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005886 return NULL;
5887
Charles-François Natali60713592011-05-20 16:55:06 +02005888 index = if_nametoindex(PyBytes_AS_STRING(oname));
5889 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005890 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005891 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005892 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005893 return NULL;
5894 }
5895
5896 return PyLong_FromUnsignedLong(index);
5897}
5898
5899PyDoc_STRVAR(if_nametoindex_doc,
5900"if_nametoindex(if_name)\n\
5901\n\
5902Returns the interface index corresponding to the interface name if_name.");
5903
Charles-François Natali60713592011-05-20 16:55:06 +02005904static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005905socket_if_indextoname(PyObject *self, PyObject *arg)
5906{
Charles-François Natali60713592011-05-20 16:55:06 +02005907 unsigned long index;
5908 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005909
Charles-François Natali60713592011-05-20 16:55:06 +02005910 index = PyLong_AsUnsignedLong(arg);
5911 if (index == (unsigned long) -1)
5912 return NULL;
5913
5914 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005915 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005916 return NULL;
5917 }
5918
Charles-François Natali60713592011-05-20 16:55:06 +02005919 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005920}
5921
5922PyDoc_STRVAR(if_indextoname_doc,
5923"if_indextoname(if_index)\n\
5924\n\
5925Returns the interface name corresponding to the interface index if_index.");
5926
5927#endif /* HAVE_IF_NAMEINDEX */
5928
5929
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005930#ifdef CMSG_LEN
5931/* Python interface to CMSG_LEN(length). */
5932
5933static PyObject *
5934socket_CMSG_LEN(PyObject *self, PyObject *args)
5935{
5936 Py_ssize_t length;
5937 size_t result;
5938
5939 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5940 return NULL;
5941 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5942 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5943 return NULL;
5944 }
5945 return PyLong_FromSize_t(result);
5946}
5947
5948PyDoc_STRVAR(CMSG_LEN_doc,
5949"CMSG_LEN(length) -> control message length\n\
5950\n\
5951Return the total length, without trailing padding, of an ancillary\n\
5952data item with associated data of the given length. This value can\n\
5953often be used as the buffer size for recvmsg() to receive a single\n\
5954item of ancillary data, but RFC 3542 requires portable applications to\n\
5955use CMSG_SPACE() and thus include space for padding, even when the\n\
5956item will be the last in the buffer. Raises OverflowError if length\n\
5957is outside the permissible range of values.");
5958
5959
5960#ifdef CMSG_SPACE
5961/* Python interface to CMSG_SPACE(length). */
5962
5963static PyObject *
5964socket_CMSG_SPACE(PyObject *self, PyObject *args)
5965{
5966 Py_ssize_t length;
5967 size_t result;
5968
5969 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5970 return NULL;
5971 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5972 PyErr_SetString(PyExc_OverflowError,
5973 "CMSG_SPACE() argument out of range");
5974 return NULL;
5975 }
5976 return PyLong_FromSize_t(result);
5977}
5978
5979PyDoc_STRVAR(CMSG_SPACE_doc,
5980"CMSG_SPACE(length) -> buffer size\n\
5981\n\
5982Return the buffer size needed for recvmsg() to receive an ancillary\n\
5983data item with associated data of the given length, along with any\n\
5984trailing padding. The buffer space needed to receive multiple items\n\
5985is the sum of the CMSG_SPACE() values for their associated data\n\
5986lengths. Raises OverflowError if length is outside the permissible\n\
5987range of values.");
5988#endif /* CMSG_SPACE */
5989#endif /* CMSG_LEN */
5990
5991
Guido van Rossum30a685f1991-06-27 15:51:29 +00005992/* List of functions exported by this module. */
5993
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005994static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005995 {"gethostbyname", socket_gethostbyname,
5996 METH_VARARGS, gethostbyname_doc},
5997 {"gethostbyname_ex", socket_gethostbyname_ex,
5998 METH_VARARGS, ghbn_ex_doc},
5999 {"gethostbyaddr", socket_gethostbyaddr,
6000 METH_VARARGS, gethostbyaddr_doc},
6001 {"gethostname", socket_gethostname,
6002 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00006003#ifdef HAVE_SETHOSTNAME
6004 {"sethostname", socket_sethostname,
6005 METH_VARARGS, sethostname_doc},
6006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 {"getservbyname", socket_getservbyname,
6008 METH_VARARGS, getservbyname_doc},
6009 {"getservbyport", socket_getservbyport,
6010 METH_VARARGS, getservbyport_doc},
6011 {"getprotobyname", socket_getprotobyname,
6012 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006013#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 {"dup", socket_dup,
6015 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006016#endif
Dave Cole331708b2004-08-09 04:51:41 +00006017#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 {"socketpair", socket_socketpair,
6019 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00006020#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 {"ntohs", socket_ntohs,
6022 METH_VARARGS, ntohs_doc},
6023 {"ntohl", socket_ntohl,
6024 METH_O, ntohl_doc},
6025 {"htons", socket_htons,
6026 METH_VARARGS, htons_doc},
6027 {"htonl", socket_htonl,
6028 METH_O, htonl_doc},
6029 {"inet_aton", socket_inet_aton,
6030 METH_VARARGS, inet_aton_doc},
6031 {"inet_ntoa", socket_inet_ntoa,
6032 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09006033#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034 {"inet_pton", socket_inet_pton,
6035 METH_VARARGS, inet_pton_doc},
6036 {"inet_ntop", socket_inet_ntop,
6037 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006038#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00006039 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
6040 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 {"getnameinfo", socket_getnameinfo,
6042 METH_VARARGS, getnameinfo_doc},
6043 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
6044 METH_NOARGS, getdefaulttimeout_doc},
6045 {"setdefaulttimeout", socket_setdefaulttimeout,
6046 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006047#ifdef HAVE_IF_NAMEINDEX
6048 {"if_nameindex", socket_if_nameindex,
6049 METH_NOARGS, if_nameindex_doc},
6050 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02006051 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07006052 {"if_indextoname", socket_if_indextoname,
6053 METH_O, if_indextoname_doc},
6054#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006055#ifdef CMSG_LEN
6056 {"CMSG_LEN", socket_CMSG_LEN,
6057 METH_VARARGS, CMSG_LEN_doc},
6058#ifdef CMSG_SPACE
6059 {"CMSG_SPACE", socket_CMSG_SPACE,
6060 METH_VARARGS, CMSG_SPACE_doc},
6061#endif
6062#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006064};
6065
Guido van Rossum30a685f1991-06-27 15:51:29 +00006066
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006067#ifdef MS_WINDOWS
6068#define OS_INIT_DEFINED
6069
6070/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006071
6072static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006073os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006074{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006076}
6077
6078static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006079os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081 WSADATA WSAData;
6082 int ret;
6083 ret = WSAStartup(0x0101, &WSAData);
6084 switch (ret) {
6085 case 0: /* No error */
6086 Py_AtExit(os_cleanup);
6087 return 1; /* Success */
6088 case WSASYSNOTREADY:
6089 PyErr_SetString(PyExc_ImportError,
6090 "WSAStartup failed: network not ready");
6091 break;
6092 case WSAVERNOTSUPPORTED:
6093 case WSAEINVAL:
6094 PyErr_SetString(
6095 PyExc_ImportError,
6096 "WSAStartup failed: requested version not supported");
6097 break;
6098 default:
6099 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6100 break;
6101 }
6102 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006103}
6104
Guido van Rossum8d665e61996-06-26 18:22:49 +00006105#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006106
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006107
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006108
6109#ifndef OS_INIT_DEFINED
6110static int
6111os_init(void)
6112{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006114}
6115#endif
6116
6117
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006118/* C API table - always add new things to the end for binary
6119 compatibility. */
6120static
6121PySocketModule_APIObject PySocketModuleAPI =
6122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006124 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006126};
6127
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006128
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006129/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006130
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006131 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006132 "socket.py" which implements some additional functionality.
6133 The import of "_socket" may fail with an ImportError exception if
6134 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006135 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006136 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006137*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006139PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006140"Implementation module for socket operations.\n\
6141\n\
6142See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006143
Martin v. Löwis1a214512008-06-11 05:26:20 +00006144static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 PyModuleDef_HEAD_INIT,
6146 PySocket_MODULE_NAME,
6147 socket_doc,
6148 -1,
6149 socket_methods,
6150 NULL,
6151 NULL,
6152 NULL,
6153 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006154};
6155
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006156PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006157PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 if (!os_init())
6162 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006163
Victor Stinnerdaf45552013-08-28 00:53:59 +02006164#ifdef MS_WINDOWS
6165 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006166#if defined(_MSC_VER) && _MSC_VER >= 1800
6167 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6168#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006169 DWORD version = GetVersion();
6170 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6171 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6172 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006173 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6174#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006175 }
6176#endif
6177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 Py_TYPE(&sock_type) = &PyType_Type;
6179 m = PyModule_Create(&socketmodule);
6180 if (m == NULL)
6181 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006182
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006183 Py_INCREF(PyExc_OSError);
6184 PySocketModuleAPI.error = PyExc_OSError;
6185 Py_INCREF(PyExc_OSError);
6186 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006188 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189 if (socket_herror == NULL)
6190 return NULL;
6191 Py_INCREF(socket_herror);
6192 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006193 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 NULL);
6195 if (socket_gaierror == NULL)
6196 return NULL;
6197 Py_INCREF(socket_gaierror);
6198 PyModule_AddObject(m, "gaierror", socket_gaierror);
6199 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006200 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201 if (socket_timeout == NULL)
6202 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006203 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 Py_INCREF(socket_timeout);
6205 PyModule_AddObject(m, "timeout", socket_timeout);
6206 Py_INCREF((PyObject *)&sock_type);
6207 if (PyModule_AddObject(m, "SocketType",
6208 (PyObject *)&sock_type) != 0)
6209 return NULL;
6210 Py_INCREF((PyObject *)&sock_type);
6211 if (PyModule_AddObject(m, "socket",
6212 (PyObject *)&sock_type) != 0)
6213 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006214
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006215#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006217#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220 Py_INCREF(has_ipv6);
6221 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223 /* Export C API */
6224 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6225 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6226 ) != 0)
6227 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006230#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006231 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006232#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006234#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006235 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006236#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006237#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006239#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006240#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006243#endif
6244#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006245 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006246#endif
6247#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006250#endif
6251#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006254#endif
6255#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006258#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006259#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006260 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006261 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006262#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006263#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006266#endif
6267#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006269 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006270#endif
6271#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006272 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006273#endif
6274#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006277#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006278#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006281#endif
6282#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006284 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006285#endif
6286#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006289#endif
6290#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006293#endif
6294#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, AF_NETLINK);
6297 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006298#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006299 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006300#endif
6301#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006303#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6305 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006306#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006307 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006308#endif
6309#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006311#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006312#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006314#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006315#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006317#endif
6318#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006319 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006320#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006321 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006322#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006324#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006325#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006327#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006328#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006329#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006331 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006332#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006333#ifdef AF_LINK
6334 PyModule_AddIntMacro(m, AF_LINK);
6335#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006336#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006339#endif
6340#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006342 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006343#endif
6344#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006347#endif
6348#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006351#endif
6352#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006353 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006354 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006355#endif
6356#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006358 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006359#endif
6360#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006363#endif
6364#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006366 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006367#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006368
Hye-Shik Chang81268602004-02-02 06:05:24 +00006369#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006370 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6371 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6372 PyModule_AddIntMacro(m, BTPROTO_HCI);
6373 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006374#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006375 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006376#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006377#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006378#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006380#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006381 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6382 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006383#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006384 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6386 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006387#endif
6388
Charles-François Natali47413c12011-10-06 19:47:44 +02006389#ifdef AF_CAN
6390 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006391 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006392#endif
6393#ifdef PF_CAN
6394 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006396#endif
6397
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006398/* Reliable Datagram Sockets */
6399#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006401#endif
6402#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006404#endif
6405
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006406/* Kernel event messages */
6407#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006409#endif
6410#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006412#endif
6413
Antoine Pitroub156a462010-10-27 20:13:57 +00006414#ifdef AF_PACKET
6415 PyModule_AddIntMacro(m, AF_PACKET);
6416#endif
6417#ifdef PF_PACKET
6418 PyModule_AddIntMacro(m, PF_PACKET);
6419#endif
6420#ifdef PACKET_HOST
6421 PyModule_AddIntMacro(m, PACKET_HOST);
6422#endif
6423#ifdef PACKET_BROADCAST
6424 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6425#endif
6426#ifdef PACKET_MULTICAST
6427 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6428#endif
6429#ifdef PACKET_OTHERHOST
6430 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6431#endif
6432#ifdef PACKET_OUTGOING
6433 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6434#endif
6435#ifdef PACKET_LOOPBACK
6436 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6437#endif
6438#ifdef PACKET_FASTROUTE
6439 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006440#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006441
Christian Heimes043d6f62008-01-07 17:19:16 +00006442#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006443 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006446 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6447 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6448 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006449
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006450 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6451 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6452 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006455 PyModule_AddIntMacro(m, SOL_TIPC);
6456 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6457 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6458 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6459 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006460
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006461 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6462 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6463 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6464 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6468 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006469#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006472#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6474 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6475 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6476 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6477 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6478 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006479#endif
6480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, SOCK_STREAM);
6483 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006484/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, SOCK_RAW);
6486 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006487#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006488 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006489#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006490#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006492#endif
6493#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006494 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006495#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006505#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006506#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006508#endif
6509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006517 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006557#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006558#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006560#endif
6561#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006563#endif
6564#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006566#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006567#ifdef SO_BINDTODEVICE
6568 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6569#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006570#ifdef SO_PRIORITY
6571 PyModule_AddIntMacro(m, SO_PRIORITY);
6572#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006573#ifdef SO_MARK
6574 PyModule_AddIntMacro(m, SO_MARK);
6575#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 /* Maximum number of connections for "listen" */
6578#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006580#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006582#endif
6583
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006584 /* Ancilliary message types */
6585#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006587#endif
6588#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006589 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006590#endif
6591#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006592 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006593#endif
6594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595 /* Flags for send, recv */
6596#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006625#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006626#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006628#endif
6629#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006631#endif
6632#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006634#endif
6635#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006637#endif
6638#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006640#endif
6641#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006643#endif
6644#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006646#endif
6647#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006649#endif
6650#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006652#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006653#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006655#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657 /* Protocol level and numbers, usable for [gs]etsockopt */
6658#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006663#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006683#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006688#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006690#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006691#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006693#endif
6694#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6696 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006697#endif
6698#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6700 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6701 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006702
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6704 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6705 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006706#endif
6707#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6709 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6710 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6711 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006712#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04006713#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
6714 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
6715#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006716#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006718 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6719 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6720 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6721 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6722 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6723 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6724 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6725 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6726 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6727 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6728 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6729 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6730#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006731#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006733#endif
6734#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006735 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006736#endif
6737#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006738 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006739#endif
6740#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006741 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006742#endif
6743#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006744 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006745#endif
6746#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006747 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006748#endif
6749#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006754#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006762#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006768#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006770#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006771#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006782#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006790#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006793#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006794 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006802#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006805#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006808#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006810#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006813#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006816#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006817#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006818 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006819#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006820#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006821 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006822#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006823#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006828#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006829#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006831#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006834#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006835#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006844#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006850#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006855#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006856#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006861#endif
6862/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006863#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006865#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006870#endif
6871
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006872#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006874#endif
6875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876 /* Some port configuration */
6877#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006879#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006884#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006886#endif
6887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888 /* Some reserved IP v.4 addresses */
6889#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006891#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006896#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006901#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006904#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006906#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006907 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006908#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006909#ifdef INADDR_ALLHOSTS_GROUP
6910 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6911 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006912#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006917#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006918 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006922#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006924#endif
6925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926 /* IPv4 [gs]etsockopt options */
6927#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006929#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006933#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006939#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006941#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006951#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006957#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006959#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006962#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006974#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006975#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006977#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006979 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6980#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006983#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006986#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006989#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006991#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006992#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006993 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006995#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006996 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006999#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007002 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00007003#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007005#endif
7006#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007008#endif
7009#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007011#endif
7012#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007014#endif
7015#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007017#endif
7018#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007020#endif
7021#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007023#endif
7024#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007026#endif
7027#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007029#endif
7030#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007032#endif
7033#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007035#endif
7036#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007038#endif
7039#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007041#endif
7042#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007044#endif
7045#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007047#endif
7048#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007050#endif
7051#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007053#endif
7054#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007056#endif
7057#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007059#endif
7060#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007062#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00007063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007064 /* TCP options */
7065#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007068#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007071#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007073#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007074#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007077#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007080#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007082#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007083#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007089#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007091#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007100#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007101#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007103#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007105 /* IPX options */
7106#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007108#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007109
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007110/* Reliable Datagram Sockets */
7111#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007112 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007113#endif
7114#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007115 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007116#endif
7117#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007119#endif
7120#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007122#endif
7123#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007124 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007125#endif
7126#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007127 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007128#endif
7129#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007130 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007131#endif
7132#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007133 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007134#endif
7135#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007137#endif
7138#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007139 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007140#endif
7141#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007142 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007143#endif
7144#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007145 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007146#endif
7147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007149#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007151#endif
7152#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007154#endif
7155#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007157#endif
7158#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007160#endif
7161#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007163#endif
7164#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007166#endif
7167#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007169#endif
7170#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007172#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007173#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007175#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007176#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007178#endif
7179#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007181#endif
7182#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007183 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007184#endif
7185#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007187#endif
7188#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007190#endif
7191#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007192 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007193#endif
7194#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007195 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007196#endif
7197#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007198 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007199#endif
7200#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007201 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007202#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007203#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007204 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007205#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007206#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007207 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007208#endif
7209#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007210 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007211#endif
7212#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007213 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007214#endif
7215#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007217#endif
7218#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007219 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007220#endif
7221#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007222 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007223#endif
7224#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007225 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007226#endif
7227#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007228 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007229#endif
7230#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007231 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007232#endif
7233#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007234 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007235#endif
7236#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007237 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007238#endif
7239#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007240 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007241#endif
7242#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007243 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007244#endif
7245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007246 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007247#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007248 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007249#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007250 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007251#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007252 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007253#endif
7254#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007255 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007256#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007257 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007258#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007259 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007260#endif
7261#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007262 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007263#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007264 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007265#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007266 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007267#endif
7268
Christian Heimesfaf2f632008-01-06 16:59:19 +00007269#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007270 {
7271 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7272 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7273 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007274 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007275 PyObject *tmp;
7276 tmp = PyLong_FromUnsignedLong(codes[i]);
7277 if (tmp == NULL)
7278 return NULL;
7279 PyModule_AddObject(m, names[i], tmp);
7280 }
7281 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007282 PyModule_AddIntMacro(m, RCVALL_OFF);
7283 PyModule_AddIntMacro(m, RCVALL_ON);
7284 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007285#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007286 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007287#endif
7288#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007289 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007290#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007291#endif /* _MSTCPIP_ */
7292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007293 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007294#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007295 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007297 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007298}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007299
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007300
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007301#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007302#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007303
7304/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007305/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007306
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007307int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007308inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007310 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007311#if (SIZEOF_INT != 4)
7312#error "Not sure if in_addr_t exists and int is not 32-bits."
7313#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007314 unsigned int packed_addr;
7315 packed_addr = inet_addr(src);
7316 if (packed_addr == INADDR_NONE)
7317 return 0;
7318 memcpy(dst, &packed_addr, 4);
7319 return 1;
7320 }
7321 /* Should set errno to EAFNOSUPPORT */
7322 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007323}
7324
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007325const char *
7326inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007327{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007328 if (af == AF_INET) {
7329 struct in_addr packed_addr;
7330 if (size < 16)
7331 /* Should set errno to ENOSPC. */
7332 return NULL;
7333 memcpy(&packed_addr, src, sizeof(packed_addr));
7334 return strncpy(dst, inet_ntoa(packed_addr), size);
7335 }
7336 /* Should set errno to EAFNOSUPPORT */
7337 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007338}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007339
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007340#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007341#endif