blob: 93dcd419481d1688e399612fcee7903000e07df8 [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__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Steve Dower65e4cb12014-11-22 12:54:57 -0800287#if defined(_MSC_VER) && _MSC_VER >= 1800
288/* Provides the IsWindows7SP1OrGreater() function */
289#include <VersionHelpers.h>
290#endif
291
Jeremy Hylton22308652001-02-02 03:23:09 +0000292#endif
293
Skip Montanaro7befb992004-02-10 16:50:21 +0000294#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000295
Neal Norwitz39d22e52002-11-02 19:55:21 +0000296#ifndef O_NONBLOCK
297# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
299
Trent Micka708d6e2004-09-07 17:48:26 +0000300/* include Python's addrinfo.h unless it causes trouble */
301#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
302 /* Do not include addinfo.h on some newer IRIX versions.
303 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
304 * for example, but not by 6.5.10.
305 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000307 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
308 * EAI_* constants are defined in (the already included) ws2tcpip.h.
309 */
310#else
311# include "addrinfo.h"
312#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000313
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000314#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000315#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000316int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000317const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000318#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000319#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000321#ifdef __APPLE__
322/* On OS X, getaddrinfo returns no error indication of lookup
323 failure, so we must use the emulation instead of the libinfo
324 implementation. Unfortunately, performing an autoconf test
325 for this bug would require DNS access for the machine performing
326 the configuration, which is not acceptable. Therefore, we
327 determine the bug just by checking for __APPLE__. If this bug
328 gets ever fixed, perhaps checking for sys/version.h would be
329 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#ifndef HAVE_GETNAMEINFO
331/* This bug seems to be fixed in Jaguar. Ths easiest way I could
332 Find to check for Jaguar is that it has getnameinfo(), which
333 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
337#ifdef HAVE_INET_ATON
338#define USE_INET_ATON_WEAKLINK
339#endif
340
Jack Jansen84262fb2002-07-02 14:40:42 +0000341#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000343/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345/* avoid clashes with the C library definition of the symbol. */
346#define getaddrinfo fake_getaddrinfo
347#define gai_strerror fake_gai_strerror
348#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349#include "getaddrinfo.c"
350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getnameinfo.c"
354#endif
355
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000356#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358#endif
359
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000360#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000361#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000362#define EAFNOSUPPORT WSAEAFNOSUPPORT
363#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000365
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#ifndef SOCKETCLOSE
367#define SOCKETCLOSE close
368#endif
369
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000370#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#define USE_BLUETOOTH 1
372#if defined(__FreeBSD__)
373#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
374#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376#define SOL_HCI SOL_HCI_RAW
377#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#define sockaddr_l2 sockaddr_l2cap
379#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
382#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000383#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385#define sockaddr_l2 sockaddr_bt
386#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#define SOL_HCI BTPROTO_HCI
390#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
400#endif
401#endif
402
Charles-François Natali8b759652011-12-23 16:44:51 +0100403/* Convert "sock_addr_t *" to "struct sockaddr *". */
404#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405
Martin v. Löwise9416172003-05-03 10:12:45 +0000406/*
407 * Constants for getnameinfo()
408 */
409#if !defined(NI_MAXHOST)
410#define NI_MAXHOST 1025
411#endif
412#if !defined(NI_MAXSERV)
413#define NI_MAXSERV 32
414#endif
415
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000416#ifndef INVALID_SOCKET /* MS defines this */
417#define INVALID_SOCKET (-1)
418#endif
419
Charles-François Natali0cc86852013-09-13 19:53:08 +0200420#ifndef INADDR_NONE
421#define INADDR_NONE (-1)
422#endif
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* XXX There's a problem here: *static* functions are not supposed to have
425 a Py prefix (or use CapitalizedWords). Later... */
426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* Global variable holding the exception type for errors detected
428 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429static PyObject *socket_herror;
430static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000431static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432
Tim Peters643a7fc2002-02-17 04:13:21 +0000433/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 The sock_type variable contains pointers to various functions,
435 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000436 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000437static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#if defined(HAVE_POLL_H)
440#include <poll.h>
441#elif defined(HAVE_SYS_POLL_H)
442#include <sys/poll.h>
443#endif
444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445/* Largest value to try to store in a socklen_t (used when handling
446 ancillary data). POSIX requires socklen_t to hold at least
447 (2**31)-1 and recommends against storing larger values, but
448 socklen_t was originally int in the BSD interface, so to be on the
449 safe side we use the smaller of (2**31)-1 and INT_MAX. */
450#if INT_MAX > 0x7fffffff
451#define SOCKLEN_T_LIMIT 0x7fffffff
452#else
453#define SOCKLEN_T_LIMIT INT_MAX
454#endif
455
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457/* Instead of select(), we'll use poll() since poll() works on any fd. */
458#define IS_SELECTABLE(s) 1
459/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000460#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461/* If there's no timeout left, we don't have to call select, so it's a safe,
462 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000465
466static PyObject*
467select_error(void)
468{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471}
472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000473#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000474#ifndef WSAEAGAIN
475#define WSAEAGAIN WSAEWOULDBLOCK
476#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#define CHECK_ERRNO(expected) \
478 (WSAGetLastError() == WSA ## expected)
479#else
480#define CHECK_ERRNO(expected) \
481 (errno == expected)
482#endif
483
Victor Stinnerdaf45552013-08-28 00:53:59 +0200484#ifdef MS_WINDOWS
485/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
486static int support_wsa_no_inherit = -1;
487#endif
488
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489/* Convenience function to raise an error according to errno
490 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491
Guido van Rossum73624e91994-10-10 17:59:00 +0000492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000493set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000495#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 int err_no = WSAGetLastError();
497 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
498 recognizes the error codes used by both GetLastError() and
499 WSAGetLastError */
500 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200501 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000502#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000503
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200504 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505}
506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512
513#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (v != NULL) {
519 PyErr_SetObject(socket_herror, v);
520 Py_DECREF(v);
521 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524}
525
526
527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531
Martin v. Löwis272cb402002-03-01 08:31:07 +0000532#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 /* EAI_SYSTEM is not available on Windows XP. */
534 if (error == EAI_SYSTEM)
535 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000536#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000538#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 if (v != NULL) {
544 PyErr_SetObject(socket_gaierror, v);
545 Py_DECREF(v);
546 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549}
550
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000551/* Function to perform the setting of socket blocking mode
552 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000553static int
554internal_setblocking(PySocketSockObject *s, int block)
555{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200556#ifdef MS_WINDOWS
557 u_long arg;
558#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100559#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100560 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100561 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000562#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000563#ifdef SOCK_NONBLOCK
564 if (block)
565 s->sock_type &= (~SOCK_NONBLOCK);
566 else
567 s->sock_type |= SOCK_NONBLOCK;
568#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100572#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 block = !block;
574 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
577 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100578 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 else
Victor Stinner9a954832013-12-04 00:41:24 +0100580 new_delay_flag = delay_flag | O_NONBLOCK;
581 if (new_delay_flag != delay_flag)
582 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
583#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585 arg = !block;
586 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Since these don't return anything */
591 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592}
593
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000594/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000595 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000596 This does not raise an exception; we'll let our caller do that
597 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000598 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000599static int
Victor Stinner71694d52015-03-28 01:18:54 +0100600internal_select_ex(PySocketSockObject *s, int writing, _PyTime_t interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100603#ifdef HAVE_POLL
604 struct pollfd pollfd;
605 _PyTime_t timeout;
606 int timeout_int;
607#else
608 fd_set fds;
609 struct timeval tv;
610#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000611
Victor Stinnerb7df3142015-03-27 22:59:32 +0100612#ifdef WITH_THREAD
613 /* must be called with the GIL held */
614 assert(PyGILState_Check());
615#endif
616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner71694d52015-03-28 01:18:54 +0100618 if (s->sock_timeout <= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* Guard against closed socket */
622 if (s->sock_fd < 0)
623 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000624
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000625 /* Handling this condition here simplifies the select loops */
Victor Stinner71694d52015-03-28 01:18:54 +0100626 if (interval < 0)
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000627 return 1;
628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 /* Prefer poll, if available, since you can poll() any fd
630 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000631#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100632 pollfd.fd = s->sock_fd;
633 pollfd.events = writing ? POLLOUT : POLLIN;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634
Victor Stinner71694d52015-03-28 01:18:54 +0100635 /* s->sock_timeout is in seconds, timeout in ms */
636 timeout = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_UP);
637 assert(timeout <= INT_MAX);
638 timeout_int = (int)timeout;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000639
Victor Stinner71694d52015-03-28 01:18:54 +0100640 Py_BEGIN_ALLOW_THREADS;
641 n = poll(&pollfd, 1, timeout_int);
642 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000643#else
Victor Stinner71694d52015-03-28 01:18:54 +0100644 /* conversion was already checked for overflow when
645 the timeout was set */
646 (void)_PyTime_AsTimeval(interval, &tv, _PyTime_ROUND_UP);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000647
Victor Stinner71694d52015-03-28 01:18:54 +0100648 FD_ZERO(&fds);
649 FD_SET(s->sock_fd, &fds);
650
651 /* See if the socket is ready */
652 Py_BEGIN_ALLOW_THREADS;
653 if (writing)
654 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
655 NULL, &fds, NULL, &tv);
656 else
657 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
658 &fds, NULL, NULL, &tv);
659 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 if (n < 0)
663 return -1;
664 if (n == 0)
665 return 1;
666 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667}
668
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000669static int
670internal_select(PySocketSockObject *s, int writing)
671{
672 return internal_select_ex(s, writing, s->sock_timeout);
673}
674
675/*
676 Two macros for automatic retry of select() in case of false positives
677 (for example, select() could indicate a socket is ready for reading
678 but the data then discarded by the OS because of a wrong checksum).
679 Here is an example of use:
680
681 BEGIN_SELECT_LOOP(s)
Victor Stinnerb7df3142015-03-27 22:59:32 +0100682
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000683 timeout = internal_select_ex(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +0100684
685 if (!timeout) {
686 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000687 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinnerb7df3142015-03-27 22:59:32 +0100688 Py_END_ALLOW_THREADS
689 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000690 if (timeout == 1) {
691 PyErr_SetString(socket_timeout, "timed out");
692 return -1;
693 }
694 END_SELECT_LOOP(s)
695*/
696
697#define BEGIN_SELECT_LOOP(s) \
698 { \
Victor Stinner71694d52015-03-28 01:18:54 +0100699 _PyTime_t deadline = 0; \
700 _PyTime_t interval = s->sock_timeout; \
701 int has_timeout = (s->sock_timeout > 0); \
702 if (has_timeout) \
703 deadline = _PyTime_GetMonotonicClock() + interval; \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000704 while (1) { \
705 errno = 0; \
706
707#define END_SELECT_LOOP(s) \
708 if (!has_timeout || \
709 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
710 break; \
Victor Stinner71694d52015-03-28 01:18:54 +0100711 interval = deadline - _PyTime_GetMonotonicClock(); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000712 } \
713 } \
714
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000715/* Initialize a new socket object. */
716
Victor Stinner71694d52015-03-28 01:18:54 +0100717static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000718
Martin v. Löwis1a214512008-06-11 05:26:20 +0000719static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000720init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 s->sock_fd = fd;
724 s->sock_family = family;
725 s->sock_type = type;
726 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000729#ifdef SOCK_NONBLOCK
730 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100731 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000732 else
733#endif
734 {
735 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100736 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000737 internal_setblocking(s, 0);
738 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000739
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000740}
741
742
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743/* Create a new socket object.
744 This just creates the object and initializes it.
745 If the creation fails, return NULL and set an exception (implicit
746 in NEWOBJ()). */
747
Guido van Rossum73624e91994-10-10 17:59:00 +0000748static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000749new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 PySocketSockObject *s;
752 s = (PySocketSockObject *)
753 PyType_GenericNew(&sock_type, NULL, NULL);
754 if (s != NULL)
755 init_sockobject(s, fd, family, type, proto);
756 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000757}
758
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759
Guido van Rossum48a680c2001-03-02 06:34:14 +0000760/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000761 thread to be in gethostbyname or getaddrinfo */
762#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200763static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000764#endif
765
766
Guido van Rossum30a685f1991-06-27 15:51:29 +0000767/* Convert a string specifying a host name or one of a few symbolic
768 names to a numeric IP address. This usually calls gethostbyname()
769 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000770 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000771 an error occurred; then an exception is raised. */
772
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000774setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 struct addrinfo hints, *res;
777 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
780 if (name[0] == '\0') {
781 int siz;
782 memset(&hints, 0, sizeof(hints));
783 hints.ai_family = af;
784 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
785 hints.ai_flags = AI_PASSIVE;
786 Py_BEGIN_ALLOW_THREADS
787 ACQUIRE_GETADDRINFO_LOCK
788 error = getaddrinfo(NULL, "0", &hints, &res);
789 Py_END_ALLOW_THREADS
790 /* We assume that those thread-unsafe getaddrinfo() versions
791 *are* safe regarding their return value, ie. that a
792 subsequent call to getaddrinfo() does not destroy the
793 outcome of the first call. */
794 RELEASE_GETADDRINFO_LOCK
795 if (error) {
796 set_gaierror(error);
797 return -1;
798 }
799 switch (res->ai_family) {
800 case AF_INET:
801 siz = 4;
802 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000803#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000804 case AF_INET6:
805 siz = 16;
806 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 default:
809 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200810 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 "unsupported address family");
812 return -1;
813 }
814 if (res->ai_next) {
815 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200816 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 "wildcard resolved to multiple address");
818 return -1;
819 }
820 if (res->ai_addrlen < addr_ret_size)
821 addr_ret_size = res->ai_addrlen;
822 memcpy(addr_ret, res->ai_addr, addr_ret_size);
823 freeaddrinfo(res);
824 return siz;
825 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200826 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100827 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200828 if (strcmp(name, "255.255.255.255") == 0 ||
829 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 struct sockaddr_in *sin;
831 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200832 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 "address family mismatched");
834 return -1;
835 }
836 sin = (struct sockaddr_in *)addr_ret;
837 memset((void *) sin, '\0', sizeof(*sin));
838 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000839#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000840 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 sin->sin_addr.s_addr = INADDR_BROADCAST;
843 return sizeof(sin->sin_addr);
844 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200845
846 /* avoid a name resolution in case of numeric address */
847#ifdef HAVE_INET_PTON
848 /* check for an IPv4 address */
849 if (af == AF_UNSPEC || af == AF_INET) {
850 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
851 memset(sin, 0, sizeof(*sin));
852 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
853 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000854#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200855 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000856#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200857 return 4;
858 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200860#ifdef ENABLE_IPV6
861 /* check for an IPv6 address - if the address contains a scope ID, we
862 * fallback to getaddrinfo(), which can handle translation from interface
863 * name to interface index */
864 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
865 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
866 memset(sin, 0, sizeof(*sin));
867 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
868 sin->sin6_family = AF_INET6;
869#ifdef HAVE_SOCKADDR_SA_LEN
870 sin->sin6_len = sizeof(*sin);
871#endif
872 return 16;
873 }
874 }
875#endif /* ENABLE_IPV6 */
876#else /* HAVE_INET_PTON */
877 /* check for an IPv4 address */
878 if (af == AF_INET || af == AF_UNSPEC) {
879 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
880 memset(sin, 0, sizeof(*sin));
881 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
882 sin->sin_family = AF_INET;
883#ifdef HAVE_SOCKADDR_SA_LEN
884 sin->sin_len = sizeof(*sin);
885#endif
886 return 4;
887 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100888 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200889#endif /* HAVE_INET_PTON */
890
891 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 memset(&hints, 0, sizeof(hints));
893 hints.ai_family = af;
894 Py_BEGIN_ALLOW_THREADS
895 ACQUIRE_GETADDRINFO_LOCK
896 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000897#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 if (error == EAI_NONAME && af == AF_UNSPEC) {
899 /* On Tru64 V5.1, numeric-to-addr conversion fails
900 if no address family is given. Assume IPv4 for now.*/
901 hints.ai_family = AF_INET;
902 error = getaddrinfo(name, NULL, &hints, &res);
903 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000904#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 Py_END_ALLOW_THREADS
906 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
907 if (error) {
908 set_gaierror(error);
909 return -1;
910 }
911 if (res->ai_addrlen < addr_ret_size)
912 addr_ret_size = res->ai_addrlen;
913 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
914 freeaddrinfo(res);
915 switch (addr_ret->sa_family) {
916 case AF_INET:
917 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000918#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 case AF_INET6:
920 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200923 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 return -1;
925 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000926}
927
Guido van Rossum30a685f1991-06-27 15:51:29 +0000928
Guido van Rossum30a685f1991-06-27 15:51:29 +0000929/* Create a string object representing an IP address.
930 This is always a string of the form 'dd.dd.dd.dd' (with variable
931 size numbers). */
932
Guido van Rossum73624e91994-10-10 17:59:00 +0000933static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000934makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 char buf[NI_MAXHOST];
937 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
940 NI_NUMERICHOST);
941 if (error) {
942 set_gaierror(error);
943 return NULL;
944 }
945 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946}
947
948
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000949#ifdef USE_BLUETOOTH
950/* Convert a string representation of a Bluetooth address into a numeric
951 address. Returns the length (6), or raises an exception and returns -1 if
952 an error occurred. */
953
954static int
955setbdaddr(char *name, bdaddr_t *bdaddr)
956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 unsigned int b0, b1, b2, b3, b4, b5;
958 char ch;
959 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
962 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
963 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
964 bdaddr->b[0] = b0;
965 bdaddr->b[1] = b1;
966 bdaddr->b[2] = b2;
967 bdaddr->b[3] = b3;
968 bdaddr->b[4] = b4;
969 bdaddr->b[5] = b5;
970 return 6;
971 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200972 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 return -1;
974 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000975}
976
977/* Create a string representation of the Bluetooth address. This is always a
978 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
979 value (zero padded if necessary). */
980
981static PyObject *
982makebdaddr(bdaddr_t *bdaddr)
983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000986 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
987 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
988 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
989 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000990}
991#endif
992
993
Guido van Rossum30a685f1991-06-27 15:51:29 +0000994/* Create an object representing the given socket address,
995 suitable for passing it back to bind(), connect() etc.
996 The family field of the sockaddr structure is inspected
997 to determine what kind of address it really is. */
998
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000999/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001000static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001001makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001002{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 if (addrlen == 0) {
1004 /* No address -- may be recvfrom() from known socket */
1005 Py_INCREF(Py_None);
1006 return Py_None;
1007 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001011 case AF_INET:
1012 {
1013 struct sockaddr_in *a;
1014 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1015 PyObject *ret = NULL;
1016 if (addrobj) {
1017 a = (struct sockaddr_in *)addr;
1018 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1019 Py_DECREF(addrobj);
1020 }
1021 return ret;
1022 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001023
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001024#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 case AF_UNIX:
1026 {
1027 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001028#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1030 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001031 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001032 }
1033 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001034#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 {
1036 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001037 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 }
1039 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001040#endif /* AF_UNIX */
1041
Martin v. Löwis11017b12006-01-14 18:12:57 +00001042#if defined(AF_NETLINK)
1043 case AF_NETLINK:
1044 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1046 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001047 }
1048#endif /* AF_NETLINK */
1049
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001050#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 case AF_INET6:
1052 {
1053 struct sockaddr_in6 *a;
1054 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1055 PyObject *ret = NULL;
1056 if (addrobj) {
1057 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001058 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 addrobj,
1060 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001061 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 a->sin6_scope_id);
1063 Py_DECREF(addrobj);
1064 }
1065 return ret;
1066 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001067#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001069#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 case AF_BLUETOOTH:
1071 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 case BTPROTO_L2CAP:
1074 {
1075 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1076 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1077 PyObject *ret = NULL;
1078 if (addrobj) {
1079 ret = Py_BuildValue("Oi",
1080 addrobj,
1081 _BT_L2_MEMB(a, psm));
1082 Py_DECREF(addrobj);
1083 }
1084 return ret;
1085 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001087 case BTPROTO_RFCOMM:
1088 {
1089 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1090 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1091 PyObject *ret = NULL;
1092 if (addrobj) {
1093 ret = Py_BuildValue("Oi",
1094 addrobj,
1095 _BT_RC_MEMB(a, channel));
1096 Py_DECREF(addrobj);
1097 }
1098 return ret;
1099 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 case BTPROTO_HCI:
1102 {
1103 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001104#if defined(__NetBSD__) || defined(__DragonFly__)
1105 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1106#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001107 PyObject *ret = NULL;
1108 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1109 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001112
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001113#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 case BTPROTO_SCO:
1115 {
1116 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1117 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1118 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001119#endif
1120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001121 default:
1122 PyErr_SetString(PyExc_ValueError,
1123 "Unknown Bluetooth protocol");
1124 return NULL;
1125 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001126#endif
1127
Antoine Pitroub156a462010-10-27 20:13:57 +00001128#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 case AF_PACKET:
1130 {
1131 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1132 char *ifname = "";
1133 struct ifreq ifr;
1134 /* need to look up interface name give index */
1135 if (a->sll_ifindex) {
1136 ifr.ifr_ifindex = a->sll_ifindex;
1137 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1138 ifname = ifr.ifr_name;
1139 }
1140 return Py_BuildValue("shbhy#",
1141 ifname,
1142 ntohs(a->sll_protocol),
1143 a->sll_pkttype,
1144 a->sll_hatype,
1145 a->sll_addr,
1146 a->sll_halen);
1147 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001148#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001149
Christian Heimes043d6f62008-01-07 17:19:16 +00001150#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001151 case AF_TIPC:
1152 {
1153 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1154 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1155 return Py_BuildValue("IIIII",
1156 a->addrtype,
1157 a->addr.nameseq.type,
1158 a->addr.nameseq.lower,
1159 a->addr.nameseq.upper,
1160 a->scope);
1161 } else if (a->addrtype == TIPC_ADDR_NAME) {
1162 return Py_BuildValue("IIIII",
1163 a->addrtype,
1164 a->addr.name.name.type,
1165 a->addr.name.name.instance,
1166 a->addr.name.name.instance,
1167 a->scope);
1168 } else if (a->addrtype == TIPC_ADDR_ID) {
1169 return Py_BuildValue("IIIII",
1170 a->addrtype,
1171 a->addr.id.node,
1172 a->addr.id.ref,
1173 0,
1174 a->scope);
1175 } else {
1176 PyErr_SetString(PyExc_ValueError,
1177 "Invalid address type");
1178 return NULL;
1179 }
1180 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001181#endif
1182
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001183#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001184 case AF_CAN:
1185 {
1186 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1187 char *ifname = "";
1188 struct ifreq ifr;
1189 /* need to look up interface name given index */
1190 if (a->can_ifindex) {
1191 ifr.ifr_ifindex = a->can_ifindex;
1192 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1193 ifname = ifr.ifr_name;
1194 }
1195
1196 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1197 ifname,
1198 a->can_family);
1199 }
1200#endif
1201
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001202#ifdef PF_SYSTEM
1203 case PF_SYSTEM:
1204 switch(proto) {
1205#ifdef SYSPROTO_CONTROL
1206 case SYSPROTO_CONTROL:
1207 {
1208 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1209 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1210 }
1211#endif
1212 default:
1213 PyErr_SetString(PyExc_ValueError,
1214 "Invalid address type");
1215 return 0;
1216 }
1217#endif
1218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001219 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 default:
1222 /* If we don't know the address family, don't raise an
1223 exception -- return it as an (int, bytes) tuple. */
1224 return Py_BuildValue("iy#",
1225 addr->sa_family,
1226 addr->sa_data,
1227 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001229 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001230}
1231
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001232/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1233 (in particular, numeric IP addresses). */
1234struct maybe_idna {
1235 PyObject *obj;
1236 char *buf;
1237};
1238
1239static void
1240idna_cleanup(struct maybe_idna *data)
1241{
1242 Py_CLEAR(data->obj);
1243}
1244
1245static int
1246idna_converter(PyObject *obj, struct maybe_idna *data)
1247{
1248 size_t len;
1249 PyObject *obj2, *obj3;
1250 if (obj == NULL) {
1251 idna_cleanup(data);
1252 return 1;
1253 }
1254 data->obj = NULL;
1255 len = -1;
1256 if (PyBytes_Check(obj)) {
1257 data->buf = PyBytes_AsString(obj);
1258 len = PyBytes_Size(obj);
1259 }
1260 else if (PyByteArray_Check(obj)) {
1261 data->buf = PyByteArray_AsString(obj);
1262 len = PyByteArray_Size(obj);
1263 }
1264 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1265 data->buf = PyUnicode_DATA(obj);
1266 len = PyUnicode_GET_LENGTH(obj);
1267 }
1268 else {
1269 obj2 = PyUnicode_FromObject(obj);
1270 if (!obj2) {
1271 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1272 obj->ob_type->tp_name);
1273 return 0;
1274 }
1275 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1276 Py_DECREF(obj2);
1277 if (!obj3) {
1278 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1279 return 0;
1280 }
1281 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001282 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001283 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1284 return 0;
1285 }
1286 data->obj = obj3;
1287 data->buf = PyBytes_AS_STRING(obj3);
1288 len = PyBytes_GET_SIZE(obj3);
1289 }
1290 if (strlen(data->buf) != len) {
1291 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001292 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001293 return 0;
1294 }
1295 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001296}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001297
1298/* Parse a socket address argument according to the socket object's
1299 address family. Return 1 if the address was in the proper format,
1300 0 of not. The address is returned through addr_ret, its length
1301 through len_ret. */
1302
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001303static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001304getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001305 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001306{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001309#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001310 case AF_UNIX:
1311 {
1312 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001313 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001314 int retval = 0;
1315
1316 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1317 allow embedded nulls on Linux. */
1318 if (PyUnicode_Check(args)) {
1319 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1320 return 0;
1321 }
1322 else
1323 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001324 if (!PyArg_Parse(args, "y*", &path)) {
1325 Py_DECREF(args);
1326 return retval;
1327 }
1328 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001331#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001332 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001333 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001334 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001335 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001337 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001338 }
1339 }
1340 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001341#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001342 {
1343 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001344 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001345 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001347 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001349 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 }
1351 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001352 memcpy(addr->sun_path, path.buf, path.len);
1353 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001354 retval = 1;
1355 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001356 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001357 Py_DECREF(args);
1358 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001360#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001361
Martin v. Löwis11017b12006-01-14 18:12:57 +00001362#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001363 case AF_NETLINK:
1364 {
1365 struct sockaddr_nl* addr;
1366 int pid, groups;
1367 addr = (struct sockaddr_nl *)addr_ret;
1368 if (!PyTuple_Check(args)) {
1369 PyErr_Format(
1370 PyExc_TypeError,
1371 "getsockaddrarg: "
1372 "AF_NETLINK address must be tuple, not %.500s",
1373 Py_TYPE(args)->tp_name);
1374 return 0;
1375 }
1376 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1377 return 0;
1378 addr->nl_family = AF_NETLINK;
1379 addr->nl_pid = pid;
1380 addr->nl_groups = groups;
1381 *len_ret = sizeof(*addr);
1382 return 1;
1383 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001384#endif
1385
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001386#ifdef AF_RDS
1387 case AF_RDS:
1388 /* RDS sockets use sockaddr_in: fall-through */
1389#endif
1390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 case AF_INET:
1392 {
1393 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001394 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 int port, result;
1396 if (!PyTuple_Check(args)) {
1397 PyErr_Format(
1398 PyExc_TypeError,
1399 "getsockaddrarg: "
1400 "AF_INET address must be tuple, not %.500s",
1401 Py_TYPE(args)->tp_name);
1402 return 0;
1403 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001404 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1405 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 return 0;
1407 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001408 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001410 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 if (result < 0)
1412 return 0;
1413 if (port < 0 || port > 0xffff) {
1414 PyErr_SetString(
1415 PyExc_OverflowError,
1416 "getsockaddrarg: port must be 0-65535.");
1417 return 0;
1418 }
1419 addr->sin_family = AF_INET;
1420 addr->sin_port = htons((short)port);
1421 *len_ret = sizeof *addr;
1422 return 1;
1423 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001424
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001425#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001426 case AF_INET6:
1427 {
1428 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001429 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001430 int port, result;
1431 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 flowinfo = scope_id = 0;
1433 if (!PyTuple_Check(args)) {
1434 PyErr_Format(
1435 PyExc_TypeError,
1436 "getsockaddrarg: "
1437 "AF_INET6 address must be tuple, not %.500s",
1438 Py_TYPE(args)->tp_name);
1439 return 0;
1440 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001441 if (!PyArg_ParseTuple(args, "O&i|II",
1442 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 &scope_id)) {
1444 return 0;
1445 }
1446 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001447 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001449 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 if (result < 0)
1451 return 0;
1452 if (port < 0 || port > 0xffff) {
1453 PyErr_SetString(
1454 PyExc_OverflowError,
1455 "getsockaddrarg: port must be 0-65535.");
1456 return 0;
1457 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001458 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001459 PyErr_SetString(
1460 PyExc_OverflowError,
1461 "getsockaddrarg: flowinfo must be 0-1048575.");
1462 return 0;
1463 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 addr->sin6_family = s->sock_family;
1465 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001466 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 addr->sin6_scope_id = scope_id;
1468 *len_ret = sizeof *addr;
1469 return 1;
1470 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001471#endif
1472
Hye-Shik Chang81268602004-02-02 06:05:24 +00001473#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 case AF_BLUETOOTH:
1475 {
1476 switch (s->sock_proto) {
1477 case BTPROTO_L2CAP:
1478 {
1479 struct sockaddr_l2 *addr;
1480 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 addr = (struct sockaddr_l2 *)addr_ret;
1483 memset(addr, 0, sizeof(struct sockaddr_l2));
1484 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1485 if (!PyArg_ParseTuple(args, "si", &straddr,
1486 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001487 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 "wrong format");
1489 return 0;
1490 }
1491 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1492 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 *len_ret = sizeof *addr;
1495 return 1;
1496 }
1497 case BTPROTO_RFCOMM:
1498 {
1499 struct sockaddr_rc *addr;
1500 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 addr = (struct sockaddr_rc *)addr_ret;
1503 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1504 if (!PyArg_ParseTuple(args, "si", &straddr,
1505 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001506 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001507 "wrong format");
1508 return 0;
1509 }
1510 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1511 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 *len_ret = sizeof *addr;
1514 return 1;
1515 }
1516 case BTPROTO_HCI:
1517 {
1518 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001519#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001520 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001521
Alexander Belopolskye239d232010-12-08 23:31:48 +00001522 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001523 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001524 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001525 "wrong format");
1526 return 0;
1527 }
1528 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1529 return 0;
1530#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1532 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001533 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 "wrong format");
1535 return 0;
1536 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 *len_ret = sizeof *addr;
1539 return 1;
1540 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001541#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 case BTPROTO_SCO:
1543 {
1544 struct sockaddr_sco *addr;
1545 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 addr = (struct sockaddr_sco *)addr_ret;
1548 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1549 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001550 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 "wrong format");
1552 return 0;
1553 }
1554 straddr = PyBytes_AS_STRING(args);
1555 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1556 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 *len_ret = sizeof *addr;
1559 return 1;
1560 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001563 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 return 0;
1565 }
1566 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001567#endif
1568
Antoine Pitroub156a462010-10-27 20:13:57 +00001569#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 case AF_PACKET:
1571 {
1572 struct sockaddr_ll* addr;
1573 struct ifreq ifr;
1574 char *interfaceName;
1575 int protoNumber;
1576 int hatype = 0;
1577 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001578 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 if (!PyTuple_Check(args)) {
1581 PyErr_Format(
1582 PyExc_TypeError,
1583 "getsockaddrarg: "
1584 "AF_PACKET address must be tuple, not %.500s",
1585 Py_TYPE(args)->tp_name);
1586 return 0;
1587 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001588 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001590 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 return 0;
1592 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1593 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1594 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1595 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001596 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 return 0;
1598 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001599 if (haddr.buf && haddr.len > 8) {
1600 PyErr_SetString(PyExc_ValueError,
1601 "Hardware address must be 8 bytes or less");
1602 PyBuffer_Release(&haddr);
1603 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001604 }
1605 if (protoNumber < 0 || protoNumber > 0xffff) {
1606 PyErr_SetString(
1607 PyExc_OverflowError,
1608 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001609 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 return 0;
1611 }
1612 addr = (struct sockaddr_ll*)addr_ret;
1613 addr->sll_family = AF_PACKET;
1614 addr->sll_protocol = htons((short)protoNumber);
1615 addr->sll_ifindex = ifr.ifr_ifindex;
1616 addr->sll_pkttype = pkttype;
1617 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001618 if (haddr.buf) {
1619 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1620 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001622 else
1623 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001624 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001625 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 return 1;
1627 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001628#endif
1629
Christian Heimes043d6f62008-01-07 17:19:16 +00001630#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 case AF_TIPC:
1632 {
1633 unsigned int atype, v1, v2, v3;
1634 unsigned int scope = TIPC_CLUSTER_SCOPE;
1635 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 if (!PyTuple_Check(args)) {
1638 PyErr_Format(
1639 PyExc_TypeError,
1640 "getsockaddrarg: "
1641 "AF_TIPC address must be tuple, not %.500s",
1642 Py_TYPE(args)->tp_name);
1643 return 0;
1644 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 if (!PyArg_ParseTuple(args,
1647 "IIII|I;Invalid TIPC address format",
1648 &atype, &v1, &v2, &v3, &scope))
1649 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 addr = (struct sockaddr_tipc *) addr_ret;
1652 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001654 addr->family = AF_TIPC;
1655 addr->scope = scope;
1656 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 if (atype == TIPC_ADDR_NAMESEQ) {
1659 addr->addr.nameseq.type = v1;
1660 addr->addr.nameseq.lower = v2;
1661 addr->addr.nameseq.upper = v3;
1662 } else if (atype == TIPC_ADDR_NAME) {
1663 addr->addr.name.name.type = v1;
1664 addr->addr.name.name.instance = v2;
1665 } else if (atype == TIPC_ADDR_ID) {
1666 addr->addr.id.node = v1;
1667 addr->addr.id.ref = v2;
1668 } else {
1669 /* Shouldn't happen */
1670 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1671 return 0;
1672 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001674 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 return 1;
1677 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001678#endif
1679
Vinay Sajiped6783f2014-03-21 11:44:32 +00001680#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001681 case AF_CAN:
1682 switch (s->sock_proto) {
1683 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001684 /* fall-through */
1685 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001686 {
1687 struct sockaddr_can *addr;
1688 PyObject *interfaceName;
1689 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001690 Py_ssize_t len;
1691
Benjamin Peterson18b71912013-05-16 15:29:44 -05001692 addr = (struct sockaddr_can *)addr_ret;
1693
Charles-François Natali47413c12011-10-06 19:47:44 +02001694 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1695 &interfaceName))
1696 return 0;
1697
1698 len = PyBytes_GET_SIZE(interfaceName);
1699
1700 if (len == 0) {
1701 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001702 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001703 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1704 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001705 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1706 s->errorhandler();
1707 Py_DECREF(interfaceName);
1708 return 0;
1709 }
1710 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001711 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001712 "AF_CAN interface name too long");
1713 Py_DECREF(interfaceName);
1714 return 0;
1715 }
1716
1717 addr->can_family = AF_CAN;
1718 addr->can_ifindex = ifr.ifr_ifindex;
1719
1720 *len_ret = sizeof(*addr);
1721 Py_DECREF(interfaceName);
1722 return 1;
1723 }
1724 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001725 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001726 "getsockaddrarg: unsupported CAN protocol");
1727 return 0;
1728 }
1729#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001730
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001731#ifdef PF_SYSTEM
1732 case PF_SYSTEM:
1733 switch (s->sock_proto) {
1734#ifdef SYSPROTO_CONTROL
1735 case SYSPROTO_CONTROL:
1736 {
1737 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001738
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001739 addr = (struct sockaddr_ctl *)addr_ret;
1740 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001741 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001742
1743 if (PyUnicode_Check(args)) {
1744 struct ctl_info info;
1745 PyObject *ctl_name;
1746
1747 if (!PyArg_Parse(args, "O&",
1748 PyUnicode_FSConverter, &ctl_name)) {
1749 return 0;
1750 }
1751
Victor Stinnerf50e1872015-03-20 11:32:24 +01001752 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001753 PyErr_SetString(PyExc_ValueError,
1754 "provided string is too long");
1755 Py_DECREF(ctl_name);
1756 return 0;
1757 }
1758 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1759 sizeof(info.ctl_name));
1760 Py_DECREF(ctl_name);
1761
1762 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1763 PyErr_SetString(PyExc_OSError,
1764 "cannot find kernel control with provided name");
1765 return 0;
1766 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001767
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001768 addr->sc_id = info.ctl_id;
1769 addr->sc_unit = 0;
1770 } else if (!PyArg_ParseTuple(args, "II",
1771 &(addr->sc_id), &(addr->sc_unit))) {
1772 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1773 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001774
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001775 return 0;
1776 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001777
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001778 *len_ret = sizeof(*addr);
1779 return 1;
1780 }
1781#endif
1782 default:
1783 PyErr_SetString(PyExc_OSError,
1784 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1785 return 0;
1786 }
1787#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001792 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001796}
1797
Guido van Rossum30a685f1991-06-27 15:51:29 +00001798
Guido van Rossum48a680c2001-03-02 06:34:14 +00001799/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001800 Return 1 if the family is known, 0 otherwise. The length is returned
1801 through len_ret. */
1802
1803static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001804getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001807
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001808#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 case AF_UNIX:
1810 {
1811 *len_ret = sizeof (struct sockaddr_un);
1812 return 1;
1813 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001814#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001815#if defined(AF_NETLINK)
1816 case AF_NETLINK:
1817 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001818 *len_ret = sizeof (struct sockaddr_nl);
1819 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001820 }
1821#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001822
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001823#ifdef AF_RDS
1824 case AF_RDS:
1825 /* RDS sockets use sockaddr_in: fall-through */
1826#endif
1827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 case AF_INET:
1829 {
1830 *len_ret = sizeof (struct sockaddr_in);
1831 return 1;
1832 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001833
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001834#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001835 case AF_INET6:
1836 {
1837 *len_ret = sizeof (struct sockaddr_in6);
1838 return 1;
1839 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001840#endif
1841
Hye-Shik Chang81268602004-02-02 06:05:24 +00001842#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 case AF_BLUETOOTH:
1844 {
1845 switch(s->sock_proto)
1846 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 case BTPROTO_L2CAP:
1849 *len_ret = sizeof (struct sockaddr_l2);
1850 return 1;
1851 case BTPROTO_RFCOMM:
1852 *len_ret = sizeof (struct sockaddr_rc);
1853 return 1;
1854 case BTPROTO_HCI:
1855 *len_ret = sizeof (struct sockaddr_hci);
1856 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001857#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001858 case BTPROTO_SCO:
1859 *len_ret = sizeof (struct sockaddr_sco);
1860 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001863 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001864 "unknown BT protocol");
1865 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001867 }
1868 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001869#endif
1870
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001871#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 case AF_PACKET:
1873 {
1874 *len_ret = sizeof (struct sockaddr_ll);
1875 return 1;
1876 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001877#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001878
Christian Heimes043d6f62008-01-07 17:19:16 +00001879#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 case AF_TIPC:
1881 {
1882 *len_ret = sizeof (struct sockaddr_tipc);
1883 return 1;
1884 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001885#endif
1886
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001887#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001888 case AF_CAN:
1889 {
1890 *len_ret = sizeof (struct sockaddr_can);
1891 return 1;
1892 }
1893#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001894
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001895#ifdef PF_SYSTEM
1896 case PF_SYSTEM:
1897 switch(s->sock_proto) {
1898#ifdef SYSPROTO_CONTROL
1899 case SYSPROTO_CONTROL:
1900 *len_ret = sizeof (struct sockaddr_ctl);
1901 return 1;
1902#endif
1903 default:
1904 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1905 "unknown PF_SYSTEM protocol");
1906 return 0;
1907 }
1908#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001912 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001913 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001917}
1918
1919
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001920/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1921 Currently, these methods are only compiled if the RFC 2292/3542
1922 CMSG_LEN() macro is available. Older systems seem to have used
1923 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1924 it may be possible to define CMSG_LEN() that way if it's not
1925 provided. Some architectures might need extra padding after the
1926 cmsghdr, however, and CMSG_LEN() would have to take account of
1927 this. */
1928#ifdef CMSG_LEN
1929/* If length is in range, set *result to CMSG_LEN(length) and return
1930 true; otherwise, return false. */
1931static int
1932get_CMSG_LEN(size_t length, size_t *result)
1933{
1934 size_t tmp;
1935
1936 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1937 return 0;
1938 tmp = CMSG_LEN(length);
1939 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1940 return 0;
1941 *result = tmp;
1942 return 1;
1943}
1944
1945#ifdef CMSG_SPACE
1946/* If length is in range, set *result to CMSG_SPACE(length) and return
1947 true; otherwise, return false. */
1948static int
1949get_CMSG_SPACE(size_t length, size_t *result)
1950{
1951 size_t tmp;
1952
1953 /* Use CMSG_SPACE(1) here in order to take account of the padding
1954 necessary before *and* after the data. */
1955 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1956 return 0;
1957 tmp = CMSG_SPACE(length);
1958 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1959 return 0;
1960 *result = tmp;
1961 return 1;
1962}
1963#endif
1964
1965/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1966 pointer in msg->msg_control with at least "space" bytes after it,
1967 and its cmsg_len member inside the buffer. */
1968static int
1969cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1970{
1971 size_t cmsg_offset;
1972 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1973 sizeof(cmsgh->cmsg_len));
1974
Charles-François Natali466517d2011-08-28 18:23:43 +02001975 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001976 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001977 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001978 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1979 annoying under OS X as it's unsigned there and so it triggers a
1980 tautological comparison warning under Clang when compared against 0.
1981 Since the check is valid on other platforms, silence the warning under
1982 Clang. */
1983 #ifdef __clang__
1984 #pragma clang diagnostic push
1985 #pragma clang diagnostic ignored "-Wtautological-compare"
1986 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02001987 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02001988 #pragma GCC diagnostic push
1989 #pragma GCC diagnostic ignored "-Wtype-limits"
1990 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05001991 if (msg->msg_controllen < 0)
1992 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02001993 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02001994 #pragma GCC diagnostic pop
1995 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05001996 #ifdef __clang__
1997 #pragma clang diagnostic pop
1998 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001999 if (space < cmsg_len_end)
2000 space = cmsg_len_end;
2001 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2002 return (cmsg_offset <= (size_t)-1 - space &&
2003 cmsg_offset + space <= msg->msg_controllen);
2004}
2005
2006/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2007 *space to number of bytes following it in the buffer and return
2008 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2009 msg->msg_controllen are valid. */
2010static int
2011get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2012{
2013 size_t data_offset;
2014 char *data_ptr;
2015
2016 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2017 return 0;
2018 data_offset = data_ptr - (char *)msg->msg_control;
2019 if (data_offset > msg->msg_controllen)
2020 return 0;
2021 *space = msg->msg_controllen - data_offset;
2022 return 1;
2023}
2024
2025/* If cmsgh is invalid or not contained in the buffer pointed to by
2026 msg->msg_control, return -1. If cmsgh is valid and its associated
2027 data is entirely contained in the buffer, set *data_len to the
2028 length of the associated data and return 0. If only part of the
2029 associated data is contained in the buffer but cmsgh is otherwise
2030 valid, set *data_len to the length contained in the buffer and
2031 return 1. */
2032static int
2033get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2034{
2035 size_t space, cmsg_data_len;
2036
2037 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2038 cmsgh->cmsg_len < CMSG_LEN(0))
2039 return -1;
2040 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2041 if (!get_cmsg_data_space(msg, cmsgh, &space))
2042 return -1;
2043 if (space >= cmsg_data_len) {
2044 *data_len = cmsg_data_len;
2045 return 0;
2046 }
2047 *data_len = space;
2048 return 1;
2049}
2050#endif /* CMSG_LEN */
2051
2052
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002053/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002054
Guido van Rossum73624e91994-10-10 17:59:00 +00002055static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002056sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002057{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002058 sock_addr_t addrbuf;
2059 SOCKET_T newfd = INVALID_SOCKET;
2060 socklen_t addrlen;
2061 PyObject *sock = NULL;
2062 PyObject *addr = NULL;
2063 PyObject *res = NULL;
2064 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002065 int async_err = 0;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002066#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2067 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2068 static int accept4_works = -1;
2069#endif
2070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002071 if (!getsockaddrlen(s, &addrlen))
2072 return NULL;
2073 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 if (!IS_SELECTABLE(s))
2076 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002077
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002078 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002079 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002080 timeout = internal_select_ex(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002081
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002082 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002083 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02002084#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002085 if (accept4_works != 0) {
2086 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2087 SOCK_CLOEXEC);
2088 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2089 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2090 accept4_works = (errno != ENOSYS);
2091 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002092 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002093 if (accept4_works == 0)
2094 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002095#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002096 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002097#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002098 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002099 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002100 } while (newfd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002101 if (timeout == 1) {
2102 PyErr_SetString(socket_timeout, "timed out");
2103 return NULL;
2104 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002105 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 if (newfd == INVALID_SOCKET)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002108 return (!async_err) ? s->errorhandler() : NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00002109
Victor Stinnerdaf45552013-08-28 00:53:59 +02002110#ifdef MS_WINDOWS
2111 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2112 PyErr_SetFromWindowsErr(0);
2113 SOCKETCLOSE(newfd);
2114 goto finally;
2115 }
2116#else
2117
2118#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2119 if (!accept4_works)
2120#endif
2121 {
2122 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2123 SOCKETCLOSE(newfd);
2124 goto finally;
2125 }
2126 }
2127#endif
2128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 sock = PyLong_FromSocket_t(newfd);
2130 if (sock == NULL) {
2131 SOCKETCLOSE(newfd);
2132 goto finally;
2133 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002135 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2136 addrlen, s->sock_proto);
2137 if (addr == NULL)
2138 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002141
Guido van Rossum67f7a382002-06-06 21:08:16 +00002142finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002143 Py_XDECREF(sock);
2144 Py_XDECREF(addr);
2145 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002146}
2147
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002148PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002149"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002150\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002151Wait for an incoming connection. Return a new socket file descriptor\n\
2152representing the connection, and the address of the client.\n\
2153For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002154
Guido van Rossum11ba0942002-06-13 15:07:44 +00002155/* s.setblocking(flag) method. Argument:
2156 False -- non-blocking mode; same as settimeout(0)
2157 True -- blocking mode; same as settimeout(None)
2158*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002159
Guido van Rossum73624e91994-10-10 17:59:00 +00002160static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002161sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002162{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002163 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 block = PyLong_AsLong(arg);
2166 if (block == -1 && PyErr_Occurred())
2167 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002168
Victor Stinner71694d52015-03-28 01:18:54 +01002169 s->sock_timeout = block ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 Py_INCREF(Py_None);
2173 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002174}
Guido van Rossume4485b01994-09-07 14:32:49 +00002175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002176PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002177"setblocking(flag)\n\
2178\n\
2179Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002180setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182
Victor Stinner71694d52015-03-28 01:18:54 +01002183static int
2184socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2185{
2186#ifdef MS_WINDOWS
2187 struct timeval tv;
2188#endif
2189 int overflow = 0;
2190
2191 if (timeout_obj == Py_None) {
2192 *timeout = -1;
2193 return 0;
2194 }
2195
2196 if (_PyTime_FromSecondsObject(timeout, timeout_obj, _PyTime_ROUND_UP) < 0)
2197 return -1;
2198
2199 if (*timeout < 0) {
2200 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2201 return -1;
2202 }
2203
2204#ifdef MS_WINDOWS
2205 overflow = (_PyTime_AsTimeval(timeout, &tv, _PyTime_ROUND_UP) < 0);
2206#endif
2207#ifndef HAVE_POLL
2208 timeout = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_UP);
2209 overflow = (timeout > INT_MAX);
2210#endif
2211 if (overflow) {
2212 PyErr_SetString(PyExc_OverflowError,
2213 "timeout doesn't fit into C timeval");
2214 return -1;
2215 }
2216
2217 return 0;
2218}
2219
Guido van Rossum11ba0942002-06-13 15:07:44 +00002220/* s.settimeout(timeout) method. Argument:
2221 None -- no timeout, blocking mode; same as setblocking(True)
2222 0.0 -- non-blocking mode; same as setblocking(False)
2223 > 0 -- timeout mode; operations time out after timeout seconds
2224 < 0 -- illegal; raises an exception
2225*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002227sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002228{
Victor Stinner71694d52015-03-28 01:18:54 +01002229 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002230
Victor Stinner71694d52015-03-28 01:18:54 +01002231 if (socket_parse_timeout(&timeout, arg) < 0)
2232 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002235 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 Py_INCREF(Py_None);
2238 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002239}
2240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002241PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002242"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002244Set a timeout on socket operations. 'timeout' can be a float,\n\
2245giving in seconds, or None. Setting a timeout of None disables\n\
2246the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002247Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002248
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002249/* s.gettimeout() method.
2250 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002252sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002253{
Victor Stinner71694d52015-03-28 01:18:54 +01002254 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 Py_INCREF(Py_None);
2256 return Py_None;
2257 }
Victor Stinner71694d52015-03-28 01:18:54 +01002258 else {
2259 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2260 return PyFloat_FromDouble(seconds);
2261 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002262}
2263
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002264PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002265"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002266\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002267Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002268operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002269operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002270
Guido van Rossumaee08791992-09-08 09:05:33 +00002271/* s.setsockopt() method.
2272 With an integer third argument, sets an integer option.
2273 With a string third argument, sets an option from a buffer;
2274 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002275
Guido van Rossum73624e91994-10-10 17:59:00 +00002276static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002277sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002278{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002279 int level;
2280 int optname;
2281 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002282 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002285 if (PyArg_ParseTuple(args, "iii:setsockopt",
2286 &level, &optname, &flag)) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002287 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002288 }
2289 else {
2290 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002291 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2292 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002293 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002294 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2295 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if (res < 0)
2298 return s->errorhandler();
2299 Py_INCREF(Py_None);
2300 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002301}
2302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002303PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002304"setsockopt(level, option, value)\n\
2305\n\
2306Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002307The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002308
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002309
Guido van Rossumaee08791992-09-08 09:05:33 +00002310/* s.getsockopt() method.
2311 With two arguments, retrieves an integer option.
2312 With a third integer argument, retrieves a string buffer of that size;
2313 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002314
Guido van Rossum73624e91994-10-10 17:59:00 +00002315static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002316sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002318 int level;
2319 int optname;
2320 int res;
2321 PyObject *buf;
2322 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002323
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002324 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2325 &level, &optname, &buflen))
2326 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002328 if (buflen == 0) {
2329 int flag = 0;
2330 socklen_t flagsize = sizeof flag;
2331 res = getsockopt(s->sock_fd, level, optname,
2332 (void *)&flag, &flagsize);
2333 if (res < 0)
2334 return s->errorhandler();
2335 return PyLong_FromLong(flag);
2336 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002337 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002338 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 "getsockopt buflen out of range");
2340 return NULL;
2341 }
2342 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2343 if (buf == NULL)
2344 return NULL;
2345 res = getsockopt(s->sock_fd, level, optname,
2346 (void *)PyBytes_AS_STRING(buf), &buflen);
2347 if (res < 0) {
2348 Py_DECREF(buf);
2349 return s->errorhandler();
2350 }
2351 _PyBytes_Resize(&buf, buflen);
2352 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002353}
2354
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002355PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002356"getsockopt(level, option[, buffersize]) -> value\n\
2357\n\
2358Get a socket option. See the Unix manual for level and option.\n\
2359If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002360string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002361
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002362
Fred Drake728819a2000-07-01 03:40:12 +00002363/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002364
Guido van Rossum73624e91994-10-10 17:59:00 +00002365static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002366sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002367{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 sock_addr_t addrbuf;
2369 int addrlen;
2370 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2373 return NULL;
2374 Py_BEGIN_ALLOW_THREADS
2375 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2376 Py_END_ALLOW_THREADS
2377 if (res < 0)
2378 return s->errorhandler();
2379 Py_INCREF(Py_None);
2380 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002381}
2382
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002383PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002384"bind(address)\n\
2385\n\
2386Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002387pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002388sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002389
Guido van Rossum30a685f1991-06-27 15:51:29 +00002390
2391/* s.close() method.
2392 Set the file descriptor to -1 so operations tried subsequently
2393 will surely fail. */
2394
Guido van Rossum73624e91994-10-10 17:59:00 +00002395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002399
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002400 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2401 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2402 * for more details.
2403 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 if ((fd = s->sock_fd) != -1) {
2405 s->sock_fd = -1;
2406 Py_BEGIN_ALLOW_THREADS
2407 (void) SOCKETCLOSE(fd);
2408 Py_END_ALLOW_THREADS
2409 }
2410 Py_INCREF(Py_None);
2411 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412}
2413
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002414PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002415"close()\n\
2416\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002417Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002418
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002419static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002420sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002421{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002422 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002423 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002424 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002425}
2426
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002427PyDoc_STRVAR(detach_doc,
2428"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002429\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002430Close the socket object without closing the underlying file descriptor.\n\
2431The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002432can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002433
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002434static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002435internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002436 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 timeout = 0;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002441
2442 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002443 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002444 Py_END_ALLOW_THREADS
2445
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002446#ifdef MS_WINDOWS
2447
Victor Stinner71694d52015-03-28 01:18:54 +01002448 if (s->sock_timeout > 0
Victor Stinnerb7df3142015-03-27 22:59:32 +01002449 && res < 0 && WSAGetLastError() == WSAEWOULDBLOCK
2450 && IS_SELECTABLE(s)) {
2451 /* This is a mess. Best solution: trust select */
2452 fd_set fds;
2453 fd_set fds_exc;
2454 struct timeval tv;
Victor Stinner71694d52015-03-28 01:18:54 +01002455 int conv;
2456
2457 /* conversion was already checked for overflow when
2458 the timeout was set */
2459 (void)_PyTime_AsTimeval(s->sock_timeout, &tv, _PyTime_ROUND_UP);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002460
2461 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb7df3142015-03-27 22:59:32 +01002462 FD_ZERO(&fds);
2463 FD_SET(s->sock_fd, &fds);
2464 FD_ZERO(&fds_exc);
2465 FD_SET(s->sock_fd, &fds_exc);
2466 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2467 NULL, &fds, &fds_exc, &tv);
2468 Py_END_ALLOW_THREADS
2469
2470 if (res == 0) {
2471 res = WSAEWOULDBLOCK;
2472 timeout = 1;
2473 } else if (res > 0) {
2474 if (FD_ISSET(s->sock_fd, &fds))
2475 /* The socket is in the writable set - this
2476 means connected */
2477 res = 0;
2478 else {
2479 /* As per MS docs, we need to call getsockopt()
2480 to get the underlying error */
2481 int res_size = sizeof res;
2482 /* It must be in the exception set */
2483 assert(FD_ISSET(s->sock_fd, &fds_exc));
2484 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2485 (char *)&res, &res_size))
2486 /* getsockopt also clears WSAGetLastError,
2487 so reset it back. */
2488 WSASetLastError(res);
2489 else
2490 res = WSAGetLastError();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002492 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01002493 /* else if (res < 0) an error occurred */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 if (res < 0)
2497 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002498
2499#else
2500
Victor Stinner71694d52015-03-28 01:18:54 +01002501 if (s->sock_timeout > 0
Victor Stinnerb7df3142015-03-27 22:59:32 +01002502 && res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2503
2504 timeout = internal_select(s, 1);
2505
2506 if (timeout == 0) {
2507 /* Bug #1019808: in case of an EINPROGRESS,
2508 use getsockopt(SO_ERROR) to get the real
2509 error. */
2510 socklen_t res_size = sizeof res;
2511 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2512 SO_ERROR, &res, &res_size);
2513 if (res == EISCONN)
2514 res = 0;
2515 errno = res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002516 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01002517 else if (timeout == -1) {
2518 res = errno; /* had error */
2519 }
2520 else
2521 res = EWOULDBLOCK; /* timed out */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002524 if (res < 0)
2525 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002526
2527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002529
Victor Stinner71694d52015-03-28 01:18:54 +01002530 assert(res >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002531 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002532}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002533
Fred Drake728819a2000-07-01 03:40:12 +00002534/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535
Guido van Rossum73624e91994-10-10 17:59:00 +00002536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002537sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 sock_addr_t addrbuf;
2540 int addrlen;
2541 int res;
2542 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2545 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002547 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if (timeout == 1) {
2550 PyErr_SetString(socket_timeout, "timed out");
2551 return NULL;
2552 }
Victor Stinner71694d52015-03-28 01:18:54 +01002553 if (res < 0)
2554 return NULL;
2555 if (res != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002556 return s->errorhandler();
Victor Stinner71694d52015-03-28 01:18:54 +01002557 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002558 Py_INCREF(Py_None);
2559 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002560}
2561
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002562PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002563"connect(address)\n\
2564\n\
2565Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002566is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002567
Guido van Rossum30a685f1991-06-27 15:51:29 +00002568
Fred Drake728819a2000-07-01 03:40:12 +00002569/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002570
2571static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002572sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002573{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002574 sock_addr_t addrbuf;
2575 int addrlen;
2576 int res;
2577 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2580 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002583
Victor Stinner71694d52015-03-28 01:18:54 +01002584 if (res < 0)
2585 return NULL;
2586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 /* Signals are not errors (though they may raise exceptions). Adapted
2588 from PyErr_SetFromErrnoWithFilenameObject(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 if (res == EINTR && PyErr_CheckSignals())
2590 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002593}
2594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002595PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002596"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002597\n\
2598This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002599instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002600
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002601
Guido van Rossumed233a51992-06-23 09:07:03 +00002602/* s.fileno() method */
2603
Guido van Rossum73624e91994-10-10 17:59:00 +00002604static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002605sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002606{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002608}
2609
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002610PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002611"fileno() -> integer\n\
2612\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002613Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002614
Guido van Rossumed233a51992-06-23 09:07:03 +00002615
Guido van Rossumc89705d1992-11-26 08:54:07 +00002616/* s.getsockname() method */
2617
Guido van Rossum73624e91994-10-10 17:59:00 +00002618static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002619sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002621 sock_addr_t addrbuf;
2622 int res;
2623 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002625 if (!getsockaddrlen(s, &addrlen))
2626 return NULL;
2627 memset(&addrbuf, 0, addrlen);
2628 Py_BEGIN_ALLOW_THREADS
2629 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2630 Py_END_ALLOW_THREADS
2631 if (res < 0)
2632 return s->errorhandler();
2633 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2634 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002635}
2636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002637PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002638"getsockname() -> address info\n\
2639\n\
2640Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002641info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002642
Guido van Rossumc89705d1992-11-26 08:54:07 +00002643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002644#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002645/* s.getpeername() method */
2646
Guido van Rossum73624e91994-10-10 17:59:00 +00002647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002648sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002650 sock_addr_t addrbuf;
2651 int res;
2652 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 if (!getsockaddrlen(s, &addrlen))
2655 return NULL;
2656 memset(&addrbuf, 0, addrlen);
2657 Py_BEGIN_ALLOW_THREADS
2658 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2659 Py_END_ALLOW_THREADS
2660 if (res < 0)
2661 return s->errorhandler();
2662 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2663 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002664}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002666PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002667"getpeername() -> address info\n\
2668\n\
2669Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002670info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002671
Guido van Rossumb6775db1994-08-01 11:34:53 +00002672#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002673
2674
Guido van Rossum30a685f1991-06-27 15:51:29 +00002675/* s.listen(n) method */
2676
Guido van Rossum73624e91994-10-10 17:59:00 +00002677static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002678sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002679{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002680 /* We try to choose a default backlog high enough to avoid connection drops
2681 * for common workloads, yet not too high to limit resource usage. */
2682 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002684
Charles-François Natali644b8f52014-05-22 19:45:39 +01002685 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002689 /* To avoid problems on systems that don't allow a negative backlog
2690 * (which doesn't make sense anyway) we force a minimum value of 0. */
2691 if (backlog < 0)
2692 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 res = listen(s->sock_fd, backlog);
2694 Py_END_ALLOW_THREADS
2695 if (res < 0)
2696 return s->errorhandler();
2697 Py_INCREF(Py_None);
2698 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002699}
2700
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002701PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002702"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002703\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002704Enable a server to accept connections. If backlog is specified, it must be\n\
2705at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002706unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002707connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002708
2709
Thomas Wouters477c8d52006-05-27 19:21:47 +00002710/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002711 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002712 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002713 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002714 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002715 * also possible that we return a number of bytes smaller than the request
2716 * bytes.
2717 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002718
Antoine Pitrou19467d22010-08-17 19:33:30 +00002719static Py_ssize_t
2720sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002721{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002722 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002724 int async_err = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002725
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002726 if (!IS_SELECTABLE(s)) {
2727 select_error();
2728 return -1;
2729 }
2730 if (len == 0) {
2731 /* If 0 bytes were requested, do nothing. */
2732 return 0;
2733 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002734
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002735 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002736 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002737 timeout = internal_select_ex(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002738
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002739 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002740 Py_BEGIN_ALLOW_THREADS
Victor Stinner14b9b112013-06-25 00:37:25 +02002741#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002742 if (len > INT_MAX)
2743 len = INT_MAX;
2744 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002745#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002746 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002747#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002748 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002749 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002750 } while (outlen < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Thomas Wouters477c8d52006-05-27 19:21:47 +00002751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002752 if (timeout == 1) {
2753 PyErr_SetString(socket_timeout, "timed out");
2754 return -1;
2755 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002756 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (outlen < 0) {
2758 /* Note: the call to errorhandler() ALWAYS indirectly returned
2759 NULL, so ignore its return value */
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002760 if (!async_err)
2761 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 return -1;
2763 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002764 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002765}
2766
Guido van Rossum48a680c2001-03-02 06:34:14 +00002767
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002768/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002769
Guido van Rossum73624e91994-10-10 17:59:00 +00002770static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002771sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002772{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002773 Py_ssize_t recvlen, outlen;
2774 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002776
Antoine Pitrou19467d22010-08-17 19:33:30 +00002777 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (recvlen < 0) {
2781 PyErr_SetString(PyExc_ValueError,
2782 "negative buffersize in recv");
2783 return NULL;
2784 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 /* Allocate a new string. */
2787 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2788 if (buf == NULL)
2789 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 /* Call the guts */
2792 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2793 if (outlen < 0) {
2794 /* An error occurred, release the string and return an
2795 error. */
2796 Py_DECREF(buf);
2797 return NULL;
2798 }
2799 if (outlen != recvlen) {
2800 /* We did not read as many bytes as we anticipated, resize the
2801 string if possible and be successful. */
2802 _PyBytes_Resize(&buf, outlen);
2803 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002805 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002806}
2807
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002808PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002809"recv(buffersize[, flags]) -> data\n\
2810\n\
2811Receive up to buffersize bytes from the socket. For the optional flags\n\
2812argument, see the Unix manual. When no data is available, block until\n\
2813at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002814the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002815
Guido van Rossum30a685f1991-06-27 15:51:29 +00002816
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002817/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002818
Thomas Wouters477c8d52006-05-27 19:21:47 +00002819static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002820sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002821{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002823
Antoine Pitrou19467d22010-08-17 19:33:30 +00002824 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 Py_buffer pbuf;
2826 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002827 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002828
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002830 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 &pbuf, &recvlen, &flags))
2832 return NULL;
2833 buf = pbuf.buf;
2834 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 if (recvlen < 0) {
2837 PyBuffer_Release(&pbuf);
2838 PyErr_SetString(PyExc_ValueError,
2839 "negative buffersize in recv_into");
2840 return NULL;
2841 }
2842 if (recvlen == 0) {
2843 /* If nbytes was not specified, use the buffer's length */
2844 recvlen = buflen;
2845 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 /* Check if the buffer is large enough */
2848 if (buflen < recvlen) {
2849 PyBuffer_Release(&pbuf);
2850 PyErr_SetString(PyExc_ValueError,
2851 "buffer too small for requested bytes");
2852 return NULL;
2853 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 /* Call the guts */
2856 readlen = sock_recv_guts(s, buf, recvlen, flags);
2857 if (readlen < 0) {
2858 /* Return an error. */
2859 PyBuffer_Release(&pbuf);
2860 return NULL;
2861 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002863 PyBuffer_Release(&pbuf);
2864 /* Return the number of bytes read. Note that we do not do anything
2865 special here in the case that readlen < recvlen. */
2866 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002867}
2868
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002869PyDoc_STRVAR(recv_into_doc,
2870"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002871\n\
2872A version of recv() that stores its data into a buffer rather than creating \n\
2873a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2874is not specified (or 0), receive up to the size available in the given buffer.\n\
2875\n\
2876See recv() for documentation about the flags.");
2877
2878
2879/*
Christian Heimes99170a52007-12-19 02:07:34 +00002880 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2881 * into a char buffer. If you have any inc/def ref to do to the objects that
2882 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002883 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002884 * that it is also possible that we return a number of bytes smaller than the
2885 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002886 *
2887 * 'addr' is a return value for the address object. Note that you must decref
2888 * it yourself.
2889 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002890static Py_ssize_t
2891sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 sock_addr_t addrbuf;
2895 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002896 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 socklen_t addrlen;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002898 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 if (!getsockaddrlen(s, &addrlen))
2903 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 if (!IS_SELECTABLE(s)) {
2906 select_error();
2907 return -1;
2908 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002909
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002910 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002911 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002912 memset(&addrbuf, 0, addrlen);
2913 timeout = internal_select_ex(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002914
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002915 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002916 Py_BEGIN_ALLOW_THREADS
Victor Stinnere990c6e2013-11-16 00:18:58 +01002917#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002918 if (len > INT_MAX)
2919 len = INT_MAX;
2920 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
2921 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002922#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002923 n = recvfrom(s->sock_fd, cbuf, len, flags,
2924 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002925#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002926 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002927 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002928 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002930 if (timeout == 1) {
2931 PyErr_SetString(socket_timeout, "timed out");
2932 return -1;
2933 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002934 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 if (n < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002936 if (!async_err)
2937 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 return -1;
2939 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2942 addrlen, s->sock_proto)))
2943 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002946}
2947
2948/* s.recvfrom(nbytes [,flags]) method */
2949
2950static PyObject *
2951sock_recvfrom(PySocketSockObject *s, PyObject *args)
2952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 PyObject *buf = NULL;
2954 PyObject *addr = NULL;
2955 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002956 int flags = 0;
2957 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002958
Antoine Pitrou19467d22010-08-17 19:33:30 +00002959 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 if (recvlen < 0) {
2963 PyErr_SetString(PyExc_ValueError,
2964 "negative buffersize in recvfrom");
2965 return NULL;
2966 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2969 if (buf == NULL)
2970 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2973 recvlen, flags, &addr);
2974 if (outlen < 0) {
2975 goto finally;
2976 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 if (outlen != recvlen) {
2979 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002980 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002982 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002983 goto finally;
2984 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002986 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002987
2988finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002989 Py_XDECREF(buf);
2990 Py_XDECREF(addr);
2991 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002992}
2993
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002994PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002995"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2996\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002997Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002998
Thomas Wouters477c8d52006-05-27 19:21:47 +00002999
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003000/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003001
3002static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003003sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003005 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003006
Antoine Pitrou19467d22010-08-17 19:33:30 +00003007 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 Py_buffer pbuf;
3009 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003010 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003012 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003013
Antoine Pitrou19467d22010-08-17 19:33:30 +00003014 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 kwlist, &pbuf,
3016 &recvlen, &flags))
3017 return NULL;
3018 buf = pbuf.buf;
3019 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 if (recvlen < 0) {
3022 PyBuffer_Release(&pbuf);
3023 PyErr_SetString(PyExc_ValueError,
3024 "negative buffersize in recvfrom_into");
3025 return NULL;
3026 }
3027 if (recvlen == 0) {
3028 /* If nbytes was not specified, use the buffer's length */
3029 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003030 } else if (recvlen > buflen) {
3031 PyBuffer_Release(&pbuf);
3032 PyErr_SetString(PyExc_ValueError,
3033 "nbytes is greater than the length of the buffer");
3034 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3038 if (readlen < 0) {
3039 PyBuffer_Release(&pbuf);
3040 /* Return an error */
3041 Py_XDECREF(addr);
3042 return NULL;
3043 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045 PyBuffer_Release(&pbuf);
3046 /* Return the number of bytes read and the address. Note that we do
3047 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003048 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003049}
3050
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003051PyDoc_STRVAR(recvfrom_into_doc,
3052"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003053\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003054Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003055
3056
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003057/* The sendmsg() and recvmsg[_into]() methods require a working
3058 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3059#ifdef CMSG_LEN
3060/*
3061 * Call recvmsg() with the supplied iovec structures, flags, and
3062 * ancillary data buffer size (controllen). Returns the tuple return
3063 * value for recvmsg() or recvmsg_into(), with the first item provided
3064 * by the supplied makeval() function. makeval() will be called with
3065 * the length read and makeval_data as arguments, and must return a
3066 * new reference (which will be decrefed if there is a subsequent
3067 * error). On error, closes any file descriptors received via
3068 * SCM_RIGHTS.
3069 */
3070static PyObject *
3071sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3072 int flags, Py_ssize_t controllen,
3073 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3074{
3075 ssize_t bytes_received = -1;
3076 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003077 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003078 sock_addr_t addrbuf;
3079 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003080 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003081 PyObject *cmsg_list = NULL, *retval = NULL;
3082 void *controlbuf = NULL;
3083 struct cmsghdr *cmsgh;
3084 size_t cmsgdatalen = 0;
3085 int cmsg_status;
3086
3087 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3088 ignored" when the socket is connected (Linux fills them in
3089 anyway for AF_UNIX sockets at least). Normally msg_namelen
3090 seems to be set to 0 if there's no address, but try to
3091 initialize msg_name to something that won't be mistaken for a
3092 real address if that doesn't happen. */
3093 if (!getsockaddrlen(s, &addrbuflen))
3094 return NULL;
3095 memset(&addrbuf, 0, addrbuflen);
3096 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3097
3098 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3099 PyErr_SetString(PyExc_ValueError,
3100 "invalid ancillary data buffer length");
3101 return NULL;
3102 }
3103 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3104 return PyErr_NoMemory();
3105
3106 /* Make the system call. */
3107 if (!IS_SELECTABLE(s)) {
3108 select_error();
3109 goto finally;
3110 }
3111
3112 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003113 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003114 msg.msg_name = SAS2SA(&addrbuf);
3115 msg.msg_namelen = addrbuflen;
3116 msg.msg_iov = iov;
3117 msg.msg_iovlen = iovlen;
3118 msg.msg_control = controlbuf;
3119 msg.msg_controllen = controllen;
3120 timeout = internal_select_ex(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003121
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003122 if (timeout == 1) {
3123 PyErr_SetString(socket_timeout, "timed out");
3124 goto finally;
3125 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01003126
3127 if (!timeout) {
3128 Py_BEGIN_ALLOW_THREADS;
3129 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3130 Py_END_ALLOW_THREADS;
3131 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003132 } while (bytes_received < 0 && errno == EINTR &&
3133 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003134 END_SELECT_LOOP(s)
3135
3136 if (bytes_received < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003137 if (!async_err)
3138 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003139 goto finally;
3140 }
3141
3142 /* Make list of (level, type, data) tuples from control messages. */
3143 if ((cmsg_list = PyList_New(0)) == NULL)
3144 goto err_closefds;
3145 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3146 implementations didn't do so. */
3147 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3148 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3149 PyObject *bytes, *tuple;
3150 int tmp;
3151
3152 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3153 if (cmsg_status != 0) {
3154 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3155 "received malformed or improperly-truncated "
3156 "ancillary data", 1) == -1)
3157 goto err_closefds;
3158 }
3159 if (cmsg_status < 0)
3160 break;
3161 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003162 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003163 goto err_closefds;
3164 }
3165
3166 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3167 cmsgdatalen);
3168 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3169 (int)cmsgh->cmsg_type, bytes);
3170 if (tuple == NULL)
3171 goto err_closefds;
3172 tmp = PyList_Append(cmsg_list, tuple);
3173 Py_DECREF(tuple);
3174 if (tmp != 0)
3175 goto err_closefds;
3176
3177 if (cmsg_status != 0)
3178 break;
3179 }
3180
3181 retval = Py_BuildValue("NOiN",
3182 (*makeval)(bytes_received, makeval_data),
3183 cmsg_list,
3184 (int)msg.msg_flags,
3185 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3186 ((msg.msg_namelen > addrbuflen) ?
3187 addrbuflen : msg.msg_namelen),
3188 s->sock_proto));
3189 if (retval == NULL)
3190 goto err_closefds;
3191
3192finally:
3193 Py_XDECREF(cmsg_list);
3194 PyMem_Free(controlbuf);
3195 return retval;
3196
3197err_closefds:
3198#ifdef SCM_RIGHTS
3199 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3200 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3201 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3202 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3203 if (cmsg_status < 0)
3204 break;
3205 if (cmsgh->cmsg_level == SOL_SOCKET &&
3206 cmsgh->cmsg_type == SCM_RIGHTS) {
3207 size_t numfds;
3208 int *fdp;
3209
3210 numfds = cmsgdatalen / sizeof(int);
3211 fdp = (int *)CMSG_DATA(cmsgh);
3212 while (numfds-- > 0)
3213 close(*fdp++);
3214 }
3215 if (cmsg_status != 0)
3216 break;
3217 }
3218#endif /* SCM_RIGHTS */
3219 goto finally;
3220}
3221
3222
3223static PyObject *
3224makeval_recvmsg(ssize_t received, void *data)
3225{
3226 PyObject **buf = data;
3227
3228 if (received < PyBytes_GET_SIZE(*buf))
3229 _PyBytes_Resize(buf, received);
3230 Py_XINCREF(*buf);
3231 return *buf;
3232}
3233
3234/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3235
3236static PyObject *
3237sock_recvmsg(PySocketSockObject *s, PyObject *args)
3238{
3239 Py_ssize_t bufsize, ancbufsize = 0;
3240 int flags = 0;
3241 struct iovec iov;
3242 PyObject *buf = NULL, *retval = NULL;
3243
3244 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3245 return NULL;
3246
3247 if (bufsize < 0) {
3248 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3249 return NULL;
3250 }
3251 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3252 return NULL;
3253 iov.iov_base = PyBytes_AS_STRING(buf);
3254 iov.iov_len = bufsize;
3255
3256 /* Note that we're passing a pointer to *our pointer* to the bytes
3257 object here (&buf); makeval_recvmsg() may incref the object, or
3258 deallocate it and set our pointer to NULL. */
3259 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3260 &makeval_recvmsg, &buf);
3261 Py_XDECREF(buf);
3262 return retval;
3263}
3264
3265PyDoc_STRVAR(recvmsg_doc,
3266"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3267\n\
3268Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3269socket. The ancbufsize argument sets the size in bytes of the\n\
3270internal buffer used to receive the ancillary data; it defaults to 0,\n\
3271meaning that no ancillary data will be received. Appropriate buffer\n\
3272sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3273CMSG_LEN(), and items which do not fit into the buffer might be\n\
3274truncated or discarded. The flags argument defaults to 0 and has the\n\
3275same meaning as for recv().\n\
3276\n\
3277The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3278The data item is a bytes object holding the non-ancillary data\n\
3279received. The ancdata item is a list of zero or more tuples\n\
3280(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3281(control messages) received: cmsg_level and cmsg_type are integers\n\
3282specifying the protocol level and protocol-specific type respectively,\n\
3283and cmsg_data is a bytes object holding the associated data. The\n\
3284msg_flags item is the bitwise OR of various flags indicating\n\
3285conditions on the received message; see your system documentation for\n\
3286details. If the receiving socket is unconnected, address is the\n\
3287address of the sending socket, if available; otherwise, its value is\n\
3288unspecified.\n\
3289\n\
3290If recvmsg() raises an exception after the system call returns, it\n\
3291will first attempt to close any file descriptors received via the\n\
3292SCM_RIGHTS mechanism.");
3293
3294
3295static PyObject *
3296makeval_recvmsg_into(ssize_t received, void *data)
3297{
3298 return PyLong_FromSsize_t(received);
3299}
3300
3301/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3302
3303static PyObject *
3304sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3305{
3306 Py_ssize_t ancbufsize = 0;
3307 int flags = 0;
3308 struct iovec *iovs = NULL;
3309 Py_ssize_t i, nitems, nbufs = 0;
3310 Py_buffer *bufs = NULL;
3311 PyObject *buffers_arg, *fast, *retval = NULL;
3312
3313 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3314 &buffers_arg, &ancbufsize, &flags))
3315 return NULL;
3316
3317 if ((fast = PySequence_Fast(buffers_arg,
3318 "recvmsg_into() argument 1 must be an "
3319 "iterable")) == NULL)
3320 return NULL;
3321 nitems = PySequence_Fast_GET_SIZE(fast);
3322 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003323 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003324 goto finally;
3325 }
3326
3327 /* Fill in an iovec for each item, and save the Py_buffer
3328 structs to release afterwards. */
3329 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3330 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3331 PyErr_NoMemory();
3332 goto finally;
3333 }
3334 for (; nbufs < nitems; nbufs++) {
3335 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3336 "w*;recvmsg_into() argument 1 must be an iterable "
3337 "of single-segment read-write buffers",
3338 &bufs[nbufs]))
3339 goto finally;
3340 iovs[nbufs].iov_base = bufs[nbufs].buf;
3341 iovs[nbufs].iov_len = bufs[nbufs].len;
3342 }
3343
3344 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3345 &makeval_recvmsg_into, NULL);
3346finally:
3347 for (i = 0; i < nbufs; i++)
3348 PyBuffer_Release(&bufs[i]);
3349 PyMem_Free(bufs);
3350 PyMem_Free(iovs);
3351 Py_DECREF(fast);
3352 return retval;
3353}
3354
3355PyDoc_STRVAR(recvmsg_into_doc,
3356"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3357\n\
3358Receive normal data and ancillary data from the socket, scattering the\n\
3359non-ancillary data into a series of buffers. The buffers argument\n\
3360must be an iterable of objects that export writable buffers\n\
3361(e.g. bytearray objects); these will be filled with successive chunks\n\
3362of the non-ancillary data until it has all been written or there are\n\
3363no more buffers. The ancbufsize argument sets the size in bytes of\n\
3364the internal buffer used to receive the ancillary data; it defaults to\n\
33650, meaning that no ancillary data will be received. Appropriate\n\
3366buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3367or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3368truncated or discarded. The flags argument defaults to 0 and has the\n\
3369same meaning as for recv().\n\
3370\n\
3371The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3372The nbytes item is the total number of bytes of non-ancillary data\n\
3373written into the buffers. The ancdata item is a list of zero or more\n\
3374tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3375data (control messages) received: cmsg_level and cmsg_type are\n\
3376integers specifying the protocol level and protocol-specific type\n\
3377respectively, and cmsg_data is a bytes object holding the associated\n\
3378data. The msg_flags item is the bitwise OR of various flags\n\
3379indicating conditions on the received message; see your system\n\
3380documentation for details. If the receiving socket is unconnected,\n\
3381address is the address of the sending socket, if available; otherwise,\n\
3382its value is unspecified.\n\
3383\n\
3384If recvmsg_into() raises an exception after the system call returns,\n\
3385it will first attempt to close any file descriptors received via the\n\
3386SCM_RIGHTS mechanism.");
3387#endif /* CMSG_LEN */
3388
3389
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003390/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003391
Guido van Rossum73624e91994-10-10 17:59:00 +00003392static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003393sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003395 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003396 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003397 int async_err = 0;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003398 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3402 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 if (!IS_SELECTABLE(s)) {
3405 PyBuffer_Release(&pbuf);
3406 return select_error();
3407 }
3408 buf = pbuf.buf;
3409 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003410
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003411 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003412 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003413 timeout = internal_select_ex(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003414
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003415 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003416 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003417#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003418 if (len > INT_MAX)
3419 len = INT_MAX;
3420 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003421#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003422 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003423#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003424 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003425 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003426 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003428 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003429 PyErr_SetString(socket_timeout, "timed out");
3430 return NULL;
3431 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003432 END_SELECT_LOOP(s)
3433
3434 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003435 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003436 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003437 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003438}
3439
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003440PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003441"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003442\n\
3443Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003444argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003445sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003446
3447
3448/* s.sendall(data [,flags]) method */
3449
3450static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003451sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003453 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003454 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003455 int async_err = 0;
3456 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003457 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3460 return NULL;
3461 buf = pbuf.buf;
3462 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 if (!IS_SELECTABLE(s)) {
3465 PyBuffer_Release(&pbuf);
3466 return select_error();
3467 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 do {
3470 timeout = internal_select(s, 1);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003472 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003473 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003474 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003475#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003476 if (len > INT_MAX)
3477 len = INT_MAX;
3478 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003479#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003480 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003481#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003482 Py_END_ALLOW_THREADS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003483 }
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003484 if (timeout == 1) {
3485 PyBuffer_Release(&pbuf);
3486 PyErr_SetString(socket_timeout, "timed out");
3487 return NULL;
3488 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003489 if (n >= 0) {
3490 buf += n;
3491 len -= n;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003492 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003493 } while (len > 0 && (n >= 0 || errno == EINTR) &&
3494 !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003495 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003496
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003497 if (n < 0 || async_err)
3498 return (!async_err) ? s->errorhandler() : NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003500 Py_INCREF(Py_None);
3501 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003502}
3503
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003504PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003505"sendall(data[, flags])\n\
3506\n\
3507Send a data string to the socket. For the optional flags\n\
3508argument, see the Unix manual. This calls send() repeatedly\n\
3509until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003510to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003511
Guido van Rossum30a685f1991-06-27 15:51:29 +00003512
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003513/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003514
Guido van Rossum73624e91994-10-10 17:59:00 +00003515static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003516sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003518 Py_buffer pbuf;
3519 PyObject *addro;
3520 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003521 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 sock_addr_t addrbuf;
3523 int addrlen, n = -1, flags, timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003524 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003526 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003527 arglen = PyTuple_Size(args);
3528 switch (arglen) {
3529 case 2:
3530 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3531 break;
3532 case 3:
3533 PyArg_ParseTuple(args, "y*iO:sendto",
3534 &pbuf, &flags, &addro);
3535 break;
3536 default:
3537 PyErr_Format(PyExc_TypeError,
3538 "sendto() takes 2 or 3 arguments (%d given)",
3539 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003540 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003541 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003542 if (PyErr_Occurred())
3543 return NULL;
3544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 buf = pbuf.buf;
3546 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 if (!IS_SELECTABLE(s)) {
3549 PyBuffer_Release(&pbuf);
3550 return select_error();
3551 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003553 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3554 PyBuffer_Release(&pbuf);
3555 return NULL;
3556 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003557
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003558 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003559 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003560 timeout = internal_select_ex(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003561
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003562 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003563 Py_BEGIN_ALLOW_THREADS
Victor Stinner14b9b112013-06-25 00:37:25 +02003564#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003565 if (len > INT_MAX)
3566 len = INT_MAX;
3567 n = sendto(s->sock_fd, buf, (int)len, flags,
3568 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003569#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003570 n = sendto(s->sock_fd, buf, len, flags,
3571 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003572#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003573 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003574 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003575 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003577 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003578 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 PyErr_SetString(socket_timeout, "timed out");
3580 return NULL;
3581 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003582 END_SELECT_LOOP(s)
3583 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003584 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003585 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003586 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003587}
3588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003589PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003590"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003591\n\
3592Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003593For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003594
Guido van Rossum30a685f1991-06-27 15:51:29 +00003595
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003596/* The sendmsg() and recvmsg[_into]() methods require a working
3597 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3598#ifdef CMSG_LEN
3599/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3600
3601static PyObject *
3602sock_sendmsg(PySocketSockObject *s, PyObject *args)
3603{
3604 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3605 Py_buffer *databufs = NULL;
3606 struct iovec *iovs = NULL;
3607 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003608 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003609 struct cmsginfo {
3610 int level;
3611 int type;
3612 Py_buffer data;
3613 } *cmsgs = NULL;
3614 void *controlbuf = NULL;
3615 size_t controllen, controllen_last;
3616 ssize_t bytes_sent = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003617 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003618 int addrlen, timeout, flags = 0;
3619 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3620 *cmsg_fast = NULL, *retval = NULL;
3621
3622 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3623 &data_arg, &cmsg_arg, &flags, &addr_arg))
3624 return NULL;
3625
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003626 /* Parse destination address. */
3627 if (addr_arg != NULL && addr_arg != Py_None) {
3628 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3629 goto finally;
3630 msg.msg_name = &addrbuf;
3631 msg.msg_namelen = addrlen;
3632 }
3633
3634 /* Fill in an iovec for each message part, and save the Py_buffer
3635 structs to release afterwards. */
3636 if ((data_fast = PySequence_Fast(data_arg,
3637 "sendmsg() argument 1 must be an "
3638 "iterable")) == NULL)
3639 goto finally;
3640 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3641 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003642 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003643 goto finally;
3644 }
3645 msg.msg_iovlen = ndataparts;
3646 if (ndataparts > 0 &&
3647 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3648 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3649 PyErr_NoMemory();
3650 goto finally;
3651 }
3652 for (; ndatabufs < ndataparts; ndatabufs++) {
3653 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3654 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003655 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003656 &databufs[ndatabufs]))
3657 goto finally;
3658 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3659 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3660 }
3661
3662 if (cmsg_arg == NULL)
3663 ncmsgs = 0;
3664 else {
3665 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3666 "sendmsg() argument 2 must be an "
3667 "iterable")) == NULL)
3668 goto finally;
3669 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3670 }
3671
3672#ifndef CMSG_SPACE
3673 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003674 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003675 "sending multiple control messages is not supported "
3676 "on this system");
3677 goto finally;
3678 }
3679#endif
3680 /* Save level, type and Py_buffer for each control message,
3681 and calculate total size. */
3682 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3683 PyErr_NoMemory();
3684 goto finally;
3685 }
3686 controllen = controllen_last = 0;
3687 while (ncmsgbufs < ncmsgs) {
3688 size_t bufsize, space;
3689
3690 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3691 "(iiy*):[sendmsg() ancillary data items]",
3692 &cmsgs[ncmsgbufs].level,
3693 &cmsgs[ncmsgbufs].type,
3694 &cmsgs[ncmsgbufs].data))
3695 goto finally;
3696 bufsize = cmsgs[ncmsgbufs++].data.len;
3697
3698#ifdef CMSG_SPACE
3699 if (!get_CMSG_SPACE(bufsize, &space)) {
3700#else
3701 if (!get_CMSG_LEN(bufsize, &space)) {
3702#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003703 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003704 goto finally;
3705 }
3706 controllen += space;
3707 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003708 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003709 goto finally;
3710 }
3711 controllen_last = controllen;
3712 }
3713
3714 /* Construct ancillary data block from control message info. */
3715 if (ncmsgbufs > 0) {
3716 struct cmsghdr *cmsgh = NULL;
3717
3718 if ((msg.msg_control = controlbuf =
3719 PyMem_Malloc(controllen)) == NULL) {
3720 PyErr_NoMemory();
3721 goto finally;
3722 }
3723 msg.msg_controllen = controllen;
3724
3725 /* Need to zero out the buffer as a workaround for glibc's
3726 CMSG_NXTHDR() implementation. After getting the pointer to
3727 the next header, it checks its (uninitialized) cmsg_len
3728 member to see if the "message" fits in the buffer, and
3729 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003730 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731 memset(controlbuf, 0, controllen);
3732
3733 for (i = 0; i < ncmsgbufs; i++) {
3734 size_t msg_len, data_len = cmsgs[i].data.len;
3735 int enough_space = 0;
3736
3737 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3738 if (cmsgh == NULL) {
3739 PyErr_Format(PyExc_RuntimeError,
3740 "unexpected NULL result from %s()",
3741 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3742 goto finally;
3743 }
3744 if (!get_CMSG_LEN(data_len, &msg_len)) {
3745 PyErr_SetString(PyExc_RuntimeError,
3746 "item size out of range for CMSG_LEN()");
3747 goto finally;
3748 }
3749 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3750 size_t space;
3751
3752 cmsgh->cmsg_len = msg_len;
3753 if (get_cmsg_data_space(&msg, cmsgh, &space))
3754 enough_space = (space >= data_len);
3755 }
3756 if (!enough_space) {
3757 PyErr_SetString(PyExc_RuntimeError,
3758 "ancillary data does not fit in calculated "
3759 "space");
3760 goto finally;
3761 }
3762 cmsgh->cmsg_level = cmsgs[i].level;
3763 cmsgh->cmsg_type = cmsgs[i].type;
3764 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3765 }
3766 }
3767
3768 /* Make the system call. */
3769 if (!IS_SELECTABLE(s)) {
3770 select_error();
3771 goto finally;
3772 }
3773
3774 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003775 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003776 timeout = internal_select_ex(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003777
3778 if (!timeout) {
3779 Py_BEGIN_ALLOW_THREADS;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003780 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003781 Py_END_ALLOW_THREADS;
3782 }
3783
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003784 if (timeout == 1) {
3785 PyErr_SetString(socket_timeout, "timed out");
3786 goto finally;
3787 }
3788 } while (bytes_sent < 0 && errno == EINTR &&
3789 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003790 END_SELECT_LOOP(s)
3791
3792 if (bytes_sent < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003793 if (!async_err)
3794 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003795 goto finally;
3796 }
3797 retval = PyLong_FromSsize_t(bytes_sent);
3798
3799finally:
3800 PyMem_Free(controlbuf);
3801 for (i = 0; i < ncmsgbufs; i++)
3802 PyBuffer_Release(&cmsgs[i].data);
3803 PyMem_Free(cmsgs);
3804 Py_XDECREF(cmsg_fast);
3805 for (i = 0; i < ndatabufs; i++)
3806 PyBuffer_Release(&databufs[i]);
3807 PyMem_Free(databufs);
3808 PyMem_Free(iovs);
3809 Py_XDECREF(data_fast);
3810 return retval;
3811}
3812
3813PyDoc_STRVAR(sendmsg_doc,
3814"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3815\n\
3816Send normal and ancillary data to the socket, gathering the\n\
3817non-ancillary data from a series of buffers and concatenating it into\n\
3818a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003819data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003820The ancdata argument specifies the ancillary data (control messages)\n\
3821as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3822cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3823protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003824is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003825argument defaults to 0 and has the same meaning as for send(). If\n\
3826address is supplied and not None, it sets a destination address for\n\
3827the message. The return value is the number of bytes of non-ancillary\n\
3828data sent.");
3829#endif /* CMSG_LEN */
3830
3831
Guido van Rossum30a685f1991-06-27 15:51:29 +00003832/* s.shutdown(how) method */
3833
Guido van Rossum73624e91994-10-10 17:59:00 +00003834static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003835sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003837 int how;
3838 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003839
Serhiy Storchaka78980432013-01-15 01:12:17 +02003840 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003841 if (how == -1 && PyErr_Occurred())
3842 return NULL;
3843 Py_BEGIN_ALLOW_THREADS
3844 res = shutdown(s->sock_fd, how);
3845 Py_END_ALLOW_THREADS
3846 if (res < 0)
3847 return s->errorhandler();
3848 Py_INCREF(Py_None);
3849 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003850}
3851
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003852PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003853"shutdown(flag)\n\
3854\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003855Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3856of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003857
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003858#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003859static PyObject*
3860sock_ioctl(PySocketSockObject *s, PyObject *arg)
3861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 unsigned long cmd = SIO_RCVALL;
3863 PyObject *argO;
3864 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003866 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3867 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003869 switch (cmd) {
3870 case SIO_RCVALL: {
3871 unsigned int option = RCVALL_ON;
3872 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3873 return NULL;
3874 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3875 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3876 return set_error();
3877 }
3878 return PyLong_FromUnsignedLong(recv); }
3879 case SIO_KEEPALIVE_VALS: {
3880 struct tcp_keepalive ka;
3881 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3882 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3883 return NULL;
3884 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3885 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3886 return set_error();
3887 }
3888 return PyLong_FromUnsignedLong(recv); }
3889 default:
3890 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3891 return NULL;
3892 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003893}
3894PyDoc_STRVAR(sock_ioctl_doc,
3895"ioctl(cmd, option) -> long\n\
3896\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003897Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3898SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3899SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003900#endif
3901
3902#if defined(MS_WINDOWS)
3903static PyObject*
3904sock_share(PySocketSockObject *s, PyObject *arg)
3905{
3906 WSAPROTOCOL_INFO info;
3907 DWORD processId;
3908 int result;
3909
3910 if (!PyArg_ParseTuple(arg, "I", &processId))
3911 return NULL;
3912
3913 Py_BEGIN_ALLOW_THREADS
3914 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3915 Py_END_ALLOW_THREADS
3916 if (result == SOCKET_ERROR)
3917 return set_error();
3918 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3919}
3920PyDoc_STRVAR(sock_share_doc,
3921"share(process_id) -> bytes\n\
3922\n\
3923Share the socket with another process. The target process id\n\
3924must be provided and the resulting bytes object passed to the target\n\
3925process. There the shared socket can be instantiated by calling\n\
3926socket.fromshare().");
3927
Christian Heimesfaf2f632008-01-06 16:59:19 +00003928
3929#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003930
3931/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003932
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003933static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003934 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3935 accept_doc},
3936 {"bind", (PyCFunction)sock_bind, METH_O,
3937 bind_doc},
3938 {"close", (PyCFunction)sock_close, METH_NOARGS,
3939 close_doc},
3940 {"connect", (PyCFunction)sock_connect, METH_O,
3941 connect_doc},
3942 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3943 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003944 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3945 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003946 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3947 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003948#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003949 {"getpeername", (PyCFunction)sock_getpeername,
3950 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 {"getsockname", (PyCFunction)sock_getsockname,
3953 METH_NOARGS, getsockname_doc},
3954 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3955 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003956#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3958 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003959#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003960#if defined(MS_WINDOWS)
3961 {"share", (PyCFunction)sock_share, METH_VARARGS,
3962 sock_share_doc},
3963#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003964 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 listen_doc},
3966 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3967 recv_doc},
3968 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3969 recv_into_doc},
3970 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3971 recvfrom_doc},
3972 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3973 recvfrom_into_doc},
3974 {"send", (PyCFunction)sock_send, METH_VARARGS,
3975 send_doc},
3976 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3977 sendall_doc},
3978 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3979 sendto_doc},
3980 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3981 setblocking_doc},
3982 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3983 settimeout_doc},
3984 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3985 gettimeout_doc},
3986 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3987 setsockopt_doc},
3988 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3989 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003990#ifdef CMSG_LEN
3991 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3992 recvmsg_doc},
3993 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3994 recvmsg_into_doc,},
3995 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3996 sendmsg_doc},
3997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003999};
4000
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004001/* SockObject members */
4002static PyMemberDef sock_memberlist[] = {
4003 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4004 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4005 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004006 {0},
4007};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004008
Victor Stinner71694d52015-03-28 01:18:54 +01004009static PyGetSetDef sock_getsetlist[] = {
4010 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4011 {NULL} /* sentinel */
4012};
4013
Guido van Rossum73624e91994-10-10 17:59:00 +00004014/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004015 First close the file description. */
4016
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004017static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004018sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004019{
Antoine Pitroue033e062010-10-29 10:38:18 +00004020 if (s->sock_fd != -1) {
4021 PyObject *exc, *val, *tb;
4022 Py_ssize_t old_refcount = Py_REFCNT(s);
4023 ++Py_REFCNT(s);
4024 PyErr_Fetch(&exc, &val, &tb);
4025 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4026 "unclosed %R", s))
4027 /* Spurious errors can appear at shutdown */
4028 if (PyErr_ExceptionMatches(PyExc_Warning))
4029 PyErr_WriteUnraisable((PyObject *) s);
4030 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004032 Py_REFCNT(s) = old_refcount;
4033 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004035}
4036
Guido van Rossum30a685f1991-06-27 15:51:29 +00004037
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004038static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004039sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004040{
Victor Stinnere254e532014-07-26 14:36:55 +02004041 long sock_fd;
4042 /* On Windows, this test is needed because SOCKET_T is unsigned */
4043 if (s->sock_fd == INVALID_SOCKET) {
4044 sock_fd = -1;
4045 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004046#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004047 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004048 /* this can occur on Win64, and actually there is a special
4049 ugly printf formatter for decimal pointer length integer
4050 printing, only bother if necessary*/
4051 PyErr_SetString(PyExc_OverflowError,
4052 "no printf formatter to display "
4053 "the socket descriptor in decimal");
4054 return NULL;
4055 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004056#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004057 else
4058 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 return PyUnicode_FromFormat(
4060 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004061 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 s->sock_type,
4063 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004064}
4065
4066
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004067/* Create a new, uninitialized socket object. */
4068
4069static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004070sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 new = type->tp_alloc(type, 0);
4075 if (new != NULL) {
4076 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner71694d52015-03-28 01:18:54 +01004077 ((PySocketSockObject *)new)->sock_timeout = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 ((PySocketSockObject *)new)->errorhandler = &set_error;
4079 }
4080 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004081}
4082
4083
4084/* Initialize a new socket object. */
4085
Victor Stinnerdaf45552013-08-28 00:53:59 +02004086#ifdef SOCK_CLOEXEC
4087/* socket() and socketpair() fail with EINVAL on Linux kernel older
4088 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4089static int sock_cloexec_works = -1;
4090#endif
4091
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004092/*ARGSUSED*/
4093static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004094sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004095{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004096 PySocketSockObject *s = (PySocketSockObject *)self;
4097 PyObject *fdobj = NULL;
4098 SOCKET_T fd = INVALID_SOCKET;
4099 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4100 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004101#ifndef MS_WINDOWS
4102#ifdef SOCK_CLOEXEC
4103 int *atomic_flag_works = &sock_cloexec_works;
4104#else
4105 int *atomic_flag_works = NULL;
4106#endif
4107#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4110 "|iiiO:socket", keywords,
4111 &family, &type, &proto, &fdobj))
4112 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004115#ifdef MS_WINDOWS
4116 /* recreate a socket that was duplicated */
4117 if (PyBytes_Check(fdobj)) {
4118 WSAPROTOCOL_INFO info;
4119 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4120 PyErr_Format(PyExc_ValueError,
4121 "socket descriptor string has wrong size, "
4122 "should be %zu bytes.", sizeof(info));
4123 return -1;
4124 }
4125 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4126 Py_BEGIN_ALLOW_THREADS
4127 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4128 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4129 Py_END_ALLOW_THREADS
4130 if (fd == INVALID_SOCKET) {
4131 set_error();
4132 return -1;
4133 }
4134 family = info.iAddressFamily;
4135 type = info.iSocketType;
4136 proto = info.iProtocol;
4137 }
4138 else
4139#endif
4140 {
4141 fd = PyLong_AsSocket_t(fdobj);
4142 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4143 return -1;
4144 if (fd == INVALID_SOCKET) {
4145 PyErr_SetString(PyExc_ValueError,
4146 "can't use invalid socket value");
4147 return -1;
4148 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004149 }
4150 }
4151 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004152#ifdef MS_WINDOWS
4153 /* Windows implementation */
4154#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4155#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4156#endif
4157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004158 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004159 if (support_wsa_no_inherit) {
4160 fd = WSASocket(family, type, proto,
4161 NULL, 0,
4162 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4163 if (fd == INVALID_SOCKET) {
4164 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4165 support_wsa_no_inherit = 0;
4166 fd = socket(family, type, proto);
4167 }
4168 }
4169 else {
4170 fd = socket(family, type, proto);
4171 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 if (fd == INVALID_SOCKET) {
4175 set_error();
4176 return -1;
4177 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004178
4179 if (!support_wsa_no_inherit) {
4180 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4181 closesocket(fd);
4182 PyErr_SetFromWindowsErr(0);
4183 return -1;
4184 }
4185 }
4186#else
4187 /* UNIX */
4188 Py_BEGIN_ALLOW_THREADS
4189#ifdef SOCK_CLOEXEC
4190 if (sock_cloexec_works != 0) {
4191 fd = socket(family, type | SOCK_CLOEXEC, proto);
4192 if (sock_cloexec_works == -1) {
4193 if (fd >= 0) {
4194 sock_cloexec_works = 1;
4195 }
4196 else if (errno == EINVAL) {
4197 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4198 sock_cloexec_works = 0;
4199 fd = socket(family, type, proto);
4200 }
4201 }
4202 }
4203 else
4204#endif
4205 {
4206 fd = socket(family, type, proto);
4207 }
4208 Py_END_ALLOW_THREADS
4209
4210 if (fd == INVALID_SOCKET) {
4211 set_error();
4212 return -1;
4213 }
4214
4215 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4216 SOCKETCLOSE(fd);
4217 return -1;
4218 }
4219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004220 }
4221 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004224
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004225}
4226
4227
Guido van Rossumb6775db1994-08-01 11:34:53 +00004228/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004229
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004230static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004231 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4232 "_socket.socket", /* tp_name */
4233 sizeof(PySocketSockObject), /* tp_basicsize */
4234 0, /* tp_itemsize */
4235 (destructor)sock_dealloc, /* tp_dealloc */
4236 0, /* tp_print */
4237 0, /* tp_getattr */
4238 0, /* tp_setattr */
4239 0, /* tp_reserved */
4240 (reprfunc)sock_repr, /* tp_repr */
4241 0, /* tp_as_number */
4242 0, /* tp_as_sequence */
4243 0, /* tp_as_mapping */
4244 0, /* tp_hash */
4245 0, /* tp_call */
4246 0, /* tp_str */
4247 PyObject_GenericGetAttr, /* tp_getattro */
4248 0, /* tp_setattro */
4249 0, /* tp_as_buffer */
4250 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4251 sock_doc, /* tp_doc */
4252 0, /* tp_traverse */
4253 0, /* tp_clear */
4254 0, /* tp_richcompare */
4255 0, /* tp_weaklistoffset */
4256 0, /* tp_iter */
4257 0, /* tp_iternext */
4258 sock_methods, /* tp_methods */
4259 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004260 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 0, /* tp_base */
4262 0, /* tp_dict */
4263 0, /* tp_descr_get */
4264 0, /* tp_descr_set */
4265 0, /* tp_dictoffset */
4266 sock_initobj, /* tp_init */
4267 PyType_GenericAlloc, /* tp_alloc */
4268 sock_new, /* tp_new */
4269 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004270};
4271
Guido van Rossum30a685f1991-06-27 15:51:29 +00004272
Guido van Rossum81194471991-07-27 21:42:02 +00004273/* Python interface to gethostname(). */
4274
4275/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004276static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004277socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004278{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004279#ifdef MS_WINDOWS
4280 /* Don't use winsock's gethostname, as this returns the ANSI
4281 version of the hostname, whereas we need a Unicode string.
4282 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004283 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004284 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004285 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004286 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004287
4288 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004289 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004290
4291 if (GetLastError() != ERROR_MORE_DATA)
4292 return PyErr_SetFromWindowsErr(0);
4293
4294 if (size == 0)
4295 return PyUnicode_New(0, 0);
4296
4297 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4298 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004299 name = PyMem_New(wchar_t, size);
4300 if (!name) {
4301 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004302 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004303 }
Victor Stinner74168972011-11-17 01:11:36 +01004304 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4305 name,
4306 &size))
4307 {
4308 PyMem_Free(name);
4309 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004310 }
Victor Stinner74168972011-11-17 01:11:36 +01004311
4312 result = PyUnicode_FromWideChar(name, size);
4313 PyMem_Free(name);
4314 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004315#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 char buf[1024];
4317 int res;
4318 Py_BEGIN_ALLOW_THREADS
4319 res = gethostname(buf, (int) sizeof buf - 1);
4320 Py_END_ALLOW_THREADS
4321 if (res < 0)
4322 return set_error();
4323 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004324 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004325#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004326}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004327
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004328PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004329"gethostname() -> string\n\
4330\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004331Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004332
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004333#ifdef HAVE_SETHOSTNAME
4334PyDoc_STRVAR(sethostname_doc,
4335"sethostname(name)\n\n\
4336Sets the hostname to name.");
4337
4338static PyObject *
4339socket_sethostname(PyObject *self, PyObject *args)
4340{
4341 PyObject *hnobj;
4342 Py_buffer buf;
4343 int res, flag = 0;
4344
Christian Heimesd2774c72013-06-19 02:06:29 +02004345#ifdef _AIX
4346/* issue #18259, not declared in any useful header file */
4347extern int sethostname(const char *, size_t);
4348#endif
4349
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004350 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4351 PyErr_Clear();
4352 if (!PyArg_ParseTuple(args, "O&:sethostname",
4353 PyUnicode_FSConverter, &hnobj))
4354 return NULL;
4355 flag = 1;
4356 }
4357 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4358 if (!res) {
4359 res = sethostname(buf.buf, buf.len);
4360 PyBuffer_Release(&buf);
4361 }
4362 if (flag)
4363 Py_DECREF(hnobj);
4364 if (res)
4365 return set_error();
4366 Py_RETURN_NONE;
4367}
4368#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004369
Guido van Rossum30a685f1991-06-27 15:51:29 +00004370/* Python interface to gethostbyname(name). */
4371
4372/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004373static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004374socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004376 char *name;
4377 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004378 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004379
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004380 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 return NULL;
4382 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004383 goto finally;
4384 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4385finally:
4386 PyMem_Free(name);
4387 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004388}
4389
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004390PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004391"gethostbyname(host) -> address\n\
4392\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004393Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004394
4395
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004396/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4397
4398static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004399gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004400{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 char **pch;
4402 PyObject *rtn_tuple = (PyObject *)NULL;
4403 PyObject *name_list = (PyObject *)NULL;
4404 PyObject *addr_list = (PyObject *)NULL;
4405 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 if (h == NULL) {
4408 /* Let's get real error message to return */
4409 set_herror(h_errno);
4410 return NULL;
4411 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004413 if (h->h_addrtype != af) {
4414 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004415 errno = EAFNOSUPPORT;
4416 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 return NULL;
4418 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 case AF_INET:
4423 if (alen < sizeof(struct sockaddr_in))
4424 return NULL;
4425 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004426
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004427#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 case AF_INET6:
4429 if (alen < sizeof(struct sockaddr_in6))
4430 return NULL;
4431 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004432#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 if ((name_list = PyList_New(0)) == NULL)
4437 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004438
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 if ((addr_list = PyList_New(0)) == NULL)
4440 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 /* SF #1511317: h_aliases can be NULL */
4443 if (h->h_aliases) {
4444 for (pch = h->h_aliases; *pch != NULL; pch++) {
4445 int status;
4446 tmp = PyUnicode_FromString(*pch);
4447 if (tmp == NULL)
4448 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 status = PyList_Append(name_list, tmp);
4451 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 if (status)
4454 goto err;
4455 }
4456 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4459 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 case AF_INET:
4464 {
4465 struct sockaddr_in sin;
4466 memset(&sin, 0, sizeof(sin));
4467 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004468#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4472 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 if (pch == h->h_addr_list && alen >= sizeof(sin))
4475 memcpy((char *) addr, &sin, sizeof(sin));
4476 break;
4477 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004478
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004479#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004480 case AF_INET6:
4481 {
4482 struct sockaddr_in6 sin6;
4483 memset(&sin6, 0, sizeof(sin6));
4484 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004485#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4489 tmp = makeipaddr((struct sockaddr *)&sin6,
4490 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4493 memcpy((char *) addr, &sin6, sizeof(sin6));
4494 break;
4495 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004496#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004499 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 "unsupported address family");
4501 return NULL;
4502 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 if (tmp == NULL)
4505 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 status = PyList_Append(addr_list, tmp);
4508 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 if (status)
4511 goto err;
4512 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004515
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004516 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 Py_XDECREF(name_list);
4518 Py_XDECREF(addr_list);
4519 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004520}
4521
4522
4523/* Python interface to gethostbyname_ex(name). */
4524
4525/*ARGSUSED*/
4526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004527socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004529 char *name;
4530 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004531 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004533 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004534#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004536#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004538#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 char buf[16384];
4540 int buf_len = (sizeof buf) - 1;
4541 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004542#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004543#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004544 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004545#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004546#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004547
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004548 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004550 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004551 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004553#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004554#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004555 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004557#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004559#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 memset((void *) &data, '\0', sizeof(data));
4561 result = gethostbyname_r(name, &hp_allocated, &data);
4562 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004563#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004564#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004565#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004569#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 Py_END_ALLOW_THREADS
4571 /* Some C libraries would require addr.__ss_family instead of
4572 addr.ss_family.
4573 Therefore, we cast the sockaddr_storage into sockaddr to
4574 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004575 sa = SAS2SA(&addr);
4576 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004578#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004580#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004581finally:
4582 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004584}
4585
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004586PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004587"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4588\n\
4589Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004590for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004591
4592
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004593/* Python interface to gethostbyaddr(IP). */
4594
4595/*ARGSUSED*/
4596static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004597socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004598{
Charles-François Natali8b759652011-12-23 16:44:51 +01004599 sock_addr_t addr;
4600 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 char *ip_num;
4602 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004603 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004604#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004606#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004608#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 /* glibcs up to 2.10 assume that the buf argument to
4610 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4611 does not ensure. The attribute below instructs the compiler
4612 to maintain this alignment. */
4613 char buf[16384] Py_ALIGNED(8);
4614 int buf_len = (sizeof buf) - 1;
4615 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004616#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004617#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004619#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004620#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 char *ap;
4622 int al;
4623 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004624
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004625 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 return NULL;
4627 af = AF_UNSPEC;
4628 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004629 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 af = sa->sa_family;
4631 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004632 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 switch (af) {
4634 case AF_INET:
4635 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4636 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4637 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004638#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 case AF_INET6:
4640 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4641 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4642 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004645 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004646 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 }
4648 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004649#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004650#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004651 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 &hp_allocated, buf, buf_len,
4653 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004654#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 h = gethostbyaddr_r(ap, al, af,
4656 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004657#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 memset((void *) &data, '\0', sizeof(data));
4659 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4660 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004661#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004662#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004663#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004664 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004666 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004667#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004669 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004670#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004672#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004673finally:
4674 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004676}
4677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004678PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004679"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4680\n\
4681Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004682for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004683
Guido van Rossum30a685f1991-06-27 15:51:29 +00004684
4685/* Python interface to getservbyname(name).
4686 This only returns the port number, since the other info is already
4687 known or not useful (like the list of aliases). */
4688
4689/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004690static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004691socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004692{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 char *name, *proto=NULL;
4694 struct servent *sp;
4695 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4696 return NULL;
4697 Py_BEGIN_ALLOW_THREADS
4698 sp = getservbyname(name, proto);
4699 Py_END_ALLOW_THREADS
4700 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004701 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 return NULL;
4703 }
4704 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004705}
4706
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004707PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004708"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004709\n\
4710Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004711The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4712otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004713
Guido van Rossum30a685f1991-06-27 15:51:29 +00004714
Barry Warsaw11b91a02004-06-28 00:50:43 +00004715/* Python interface to getservbyport(port).
4716 This only returns the service name, since the other info is already
4717 known or not useful (like the list of aliases). */
4718
4719/*ARGSUSED*/
4720static PyObject *
4721socket_getservbyport(PyObject *self, PyObject *args)
4722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004723 int port;
4724 char *proto=NULL;
4725 struct servent *sp;
4726 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4727 return NULL;
4728 if (port < 0 || port > 0xffff) {
4729 PyErr_SetString(
4730 PyExc_OverflowError,
4731 "getservbyport: port must be 0-65535.");
4732 return NULL;
4733 }
4734 Py_BEGIN_ALLOW_THREADS
4735 sp = getservbyport(htons((short)port), proto);
4736 Py_END_ALLOW_THREADS
4737 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004738 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 return NULL;
4740 }
4741 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004742}
4743
4744PyDoc_STRVAR(getservbyport_doc,
4745"getservbyport(port[, protocolname]) -> string\n\
4746\n\
4747Return the service name from a port number and protocol name.\n\
4748The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4749otherwise any protocol will match.");
4750
Guido van Rossum3901d851996-12-19 16:35:04 +00004751/* Python interface to getprotobyname(name).
4752 This only returns the protocol number, since the other info is
4753 already known or not useful (like the list of aliases). */
4754
4755/*ARGSUSED*/
4756static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004757socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 char *name;
4760 struct protoent *sp;
4761 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4762 return NULL;
4763 Py_BEGIN_ALLOW_THREADS
4764 sp = getprotobyname(name);
4765 Py_END_ALLOW_THREADS
4766 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004767 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 return NULL;
4769 }
4770 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004771}
4772
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004773PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004774"getprotobyname(name) -> integer\n\
4775\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004776Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004777
Guido van Rossum3901d851996-12-19 16:35:04 +00004778
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004779#ifndef NO_DUP
4780/* dup() function for socket fds */
4781
4782static PyObject *
4783socket_dup(PyObject *self, PyObject *fdobj)
4784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 SOCKET_T fd, newfd;
4786 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004787#ifdef MS_WINDOWS
4788 WSAPROTOCOL_INFO info;
4789#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 fd = PyLong_AsSocket_t(fdobj);
4792 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4793 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004794
Victor Stinnerdaf45552013-08-28 00:53:59 +02004795#ifdef MS_WINDOWS
4796 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4797 return set_error();
4798
4799 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4800 FROM_PROTOCOL_INFO,
4801 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004802 if (newfd == INVALID_SOCKET)
4803 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004804
Victor Stinnerdaf45552013-08-28 00:53:59 +02004805 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4806 closesocket(newfd);
4807 PyErr_SetFromWindowsErr(0);
4808 return NULL;
4809 }
4810#else
4811 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4812 newfd = _Py_dup(fd);
4813 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004814 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004815#endif
4816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004817 newfdobj = PyLong_FromSocket_t(newfd);
4818 if (newfdobj == NULL)
4819 SOCKETCLOSE(newfd);
4820 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004821}
4822
4823PyDoc_STRVAR(dup_doc,
4824"dup(integer) -> integer\n\
4825\n\
4826Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4827sockets; on some platforms os.dup() won't work for socket file descriptors.");
4828#endif
4829
4830
Dave Cole331708b2004-08-09 04:51:41 +00004831#ifdef HAVE_SOCKETPAIR
4832/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004833 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004834 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004835
4836/*ARGSUSED*/
4837static PyObject *
4838socket_socketpair(PyObject *self, PyObject *args)
4839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004840 PySocketSockObject *s0 = NULL, *s1 = NULL;
4841 SOCKET_T sv[2];
4842 int family, type = SOCK_STREAM, proto = 0;
4843 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004844#ifdef SOCK_CLOEXEC
4845 int *atomic_flag_works = &sock_cloexec_works;
4846#else
4847 int *atomic_flag_works = NULL;
4848#endif
4849 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004850
4851#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004853#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004854 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4857 &family, &type, &proto))
4858 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004861 Py_BEGIN_ALLOW_THREADS
4862#ifdef SOCK_CLOEXEC
4863 if (sock_cloexec_works != 0) {
4864 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4865 if (sock_cloexec_works == -1) {
4866 if (ret >= 0) {
4867 sock_cloexec_works = 1;
4868 }
4869 else if (errno == EINVAL) {
4870 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4871 sock_cloexec_works = 0;
4872 ret = socketpair(family, type, proto, sv);
4873 }
4874 }
4875 }
4876 else
4877#endif
4878 {
4879 ret = socketpair(family, type, proto, sv);
4880 }
4881 Py_END_ALLOW_THREADS
4882
4883 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004885
4886 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4887 goto finally;
4888 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4889 goto finally;
4890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 s0 = new_sockobject(sv[0], family, type, proto);
4892 if (s0 == NULL)
4893 goto finally;
4894 s1 = new_sockobject(sv[1], family, type, proto);
4895 if (s1 == NULL)
4896 goto finally;
4897 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004898
4899finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 if (res == NULL) {
4901 if (s0 == NULL)
4902 SOCKETCLOSE(sv[0]);
4903 if (s1 == NULL)
4904 SOCKETCLOSE(sv[1]);
4905 }
4906 Py_XDECREF(s0);
4907 Py_XDECREF(s1);
4908 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004909}
4910
4911PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004912"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004913\n\
4914Create a pair of socket objects from the sockets returned by the platform\n\
4915socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004916The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004917AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004918
4919#endif /* HAVE_SOCKETPAIR */
4920
4921
Guido van Rossum006bf911996-06-12 04:04:55 +00004922static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004923socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004925 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4928 return NULL;
4929 }
4930 if (x1 < 0) {
4931 PyErr_SetString(PyExc_OverflowError,
4932 "can't convert negative number to unsigned long");
4933 return NULL;
4934 }
4935 x2 = (unsigned int)ntohs((unsigned short)x1);
4936 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004937}
4938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004939PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004940"ntohs(integer) -> integer\n\
4941\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004942Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004943
4944
Guido van Rossum006bf911996-06-12 04:04:55 +00004945static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004946socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 if (PyLong_Check(arg)) {
4951 x = PyLong_AsUnsignedLong(arg);
4952 if (x == (unsigned long) -1 && PyErr_Occurred())
4953 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004954#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 {
4956 unsigned long y;
4957 /* only want the trailing 32 bits */
4958 y = x & 0xFFFFFFFFUL;
4959 if (y ^ x)
4960 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004961 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 x = y;
4963 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 }
4966 else
4967 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004968 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004970 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004971}
4972
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004973PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004974"ntohl(integer) -> integer\n\
4975\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004976Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004977
4978
Guido van Rossum006bf911996-06-12 04:04:55 +00004979static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004980socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4985 return NULL;
4986 }
4987 if (x1 < 0) {
4988 PyErr_SetString(PyExc_OverflowError,
4989 "can't convert negative number to unsigned long");
4990 return NULL;
4991 }
4992 x2 = (unsigned int)htons((unsigned short)x1);
4993 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004994}
4995
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004996PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004997"htons(integer) -> integer\n\
4998\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004999Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005000
5001
Guido van Rossum006bf911996-06-12 04:04:55 +00005002static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005003socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005005 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 if (PyLong_Check(arg)) {
5008 x = PyLong_AsUnsignedLong(arg);
5009 if (x == (unsigned long) -1 && PyErr_Occurred())
5010 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005011#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 {
5013 unsigned long y;
5014 /* only want the trailing 32 bits */
5015 y = x & 0xFFFFFFFFUL;
5016 if (y ^ x)
5017 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005018 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 x = y;
5020 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005021#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 }
5023 else
5024 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005025 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 Py_TYPE(arg)->tp_name);
5027 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005028}
5029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005030PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005031"htonl(integer) -> integer\n\
5032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005033Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005034
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005035/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005036
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005037PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005038"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005039\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005040Convert 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 +00005041binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005042
5043static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005044socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005045{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005046#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005048#endif
5049
5050#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005051#if (SIZEOF_INT != 4)
5052#error "Not sure if in_addr_t exists and int is not 32-bits."
5053#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 /* Have to use inet_addr() instead */
5055 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005056#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005058
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5060 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005061
Tim Peters1df9fdd2003-02-13 03:13:40 +00005062
5063#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005064
5065#ifdef USE_INET_ATON_WEAKLINK
5066 if (inet_aton != NULL) {
5067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 if (inet_aton(ip_addr, &buf))
5069 return PyBytes_FromStringAndSize((char *)(&buf),
5070 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005071
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005072 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 "illegal IP address string passed to inet_aton");
5074 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005075
Thomas Wouters477c8d52006-05-27 19:21:47 +00005076#ifdef USE_INET_ATON_WEAKLINK
5077 } else {
5078#endif
5079
5080#endif
5081
5082#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 /* special-case this address as inet_addr might return INADDR_NONE
5085 * for this */
5086 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005087 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005090 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005093 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 "illegal IP address string passed to inet_aton");
5095 return NULL;
5096 }
5097 }
5098 return PyBytes_FromStringAndSize((char *) &packed_addr,
5099 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005100
5101#ifdef USE_INET_ATON_WEAKLINK
5102 }
5103#endif
5104
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005105#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005106}
5107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005108PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005109"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005110\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005111Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005112
5113static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005114socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005115{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005116 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005118
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005119 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 return NULL;
5121 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005122
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005123 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005124 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005126 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 return NULL;
5128 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005129
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005130 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5131 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005134}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005135
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005136#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005137
5138PyDoc_STRVAR(inet_pton_doc,
5139"inet_pton(af, ip) -> packed IP address string\n\
5140\n\
5141Convert an IP address from string format to a packed string suitable\n\
5142for use with low-level network functions.");
5143
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005144#endif
5145
5146#ifdef HAVE_INET_PTON
5147
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005148static PyObject *
5149socket_inet_pton(PyObject *self, PyObject *args)
5150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 int af;
5152 char* ip;
5153 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005154#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005155 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005156#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005159 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5160 return NULL;
5161 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005162
Martin v. Löwis04697e82004-06-02 12:35:29 +00005163#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005165 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 "can't use AF_INET6, IPv6 is disabled");
5167 return NULL;
5168 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005169#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 retval = inet_pton(af, ip, packed);
5172 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005173 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 return NULL;
5175 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005176 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 "illegal IP address string passed to inet_pton");
5178 return NULL;
5179 } else if (af == AF_INET) {
5180 return PyBytes_FromStringAndSize(packed,
5181 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005182#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005183 } else if (af == AF_INET6) {
5184 return PyBytes_FromStringAndSize(packed,
5185 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005188 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 return NULL;
5190 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005191}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005192#elif defined(MS_WINDOWS)
5193
5194static PyObject *
5195socket_inet_pton(PyObject *self, PyObject *args)
5196{
5197 int af;
5198 char* ip;
5199 struct sockaddr_in6 addr;
5200 INT ret, size;
5201
5202 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5203 return NULL;
5204 }
5205
Victor Stinnere990c6e2013-11-16 00:18:58 +01005206 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005207 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5208
5209 if (ret) {
5210 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5211 return NULL;
5212 } else if(af == AF_INET) {
5213 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005214 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005215 sizeof(addr4->sin_addr));
5216 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005217 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005218 sizeof(addr.sin6_addr));
5219 } else {
5220 PyErr_SetString(PyExc_OSError, "unknown address family");
5221 return NULL;
5222 }
5223}
5224
5225#endif
5226
5227#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005228
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005229PyDoc_STRVAR(inet_ntop_doc,
5230"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5231\n\
5232Convert a packed IP address of the given family to string format.");
5233
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005234#endif
5235
5236
5237#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005238static PyObject *
5239socket_inet_ntop(PyObject *self, PyObject *args)
5240{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005241 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005242 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005243 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005244#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005245 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005246#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005248#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005250 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5251 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005252
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005253 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 return NULL;
5255 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005256
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005258 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 PyErr_SetString(PyExc_ValueError,
5260 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005261 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 return NULL;
5263 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005264#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005266 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 PyErr_SetString(PyExc_ValueError,
5268 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005269 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 return NULL;
5271 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 } else {
5274 PyErr_Format(PyExc_ValueError,
5275 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005276 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 return NULL;
5278 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005279
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005280 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5281 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005283 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 return NULL;
5285 } else {
5286 return PyUnicode_FromString(retval);
5287 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005289 /* NOTREACHED */
5290 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5291 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005292}
5293
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005294#elif defined(MS_WINDOWS)
5295
5296static PyObject *
5297socket_inet_ntop(PyObject *self, PyObject *args)
5298{
5299 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005300 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005301 struct sockaddr_in6 addr;
5302 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005303#ifdef ENABLE_IPV6
5304 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5305#else
5306 char ip[INET_ADDRSTRLEN + 1];
5307#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005308
5309 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5310 memset((void *) &ip[0], '\0', sizeof(ip));
5311
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005312 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005313 return NULL;
5314 }
5315
5316 if (af == AF_INET) {
5317 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5318
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005319 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005320 PyErr_SetString(PyExc_ValueError,
5321 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005322 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005323 return NULL;
5324 }
5325 memset(addr4, 0, sizeof(struct sockaddr_in));
5326 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005327 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005328 addrlen = sizeof(struct sockaddr_in);
5329 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005330 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005331 PyErr_SetString(PyExc_ValueError,
5332 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005333 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005334 return NULL;
5335 }
5336
5337 memset(&addr, 0, sizeof(addr));
5338 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005339 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005340 addrlen = sizeof(addr);
5341 } else {
5342 PyErr_Format(PyExc_ValueError,
5343 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005344 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005345 return NULL;
5346 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005347 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005348
5349 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005350 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005351 ip, &retlen);
5352
5353 if (ret) {
5354 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5355 return NULL;
5356 } else {
5357 return PyUnicode_FromString(ip);
5358 }
5359}
5360
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005361#endif /* HAVE_INET_PTON */
5362
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005363/* Python interface to getaddrinfo(host, port). */
5364
5365/*ARGSUSED*/
5366static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005367socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005368{
Victor Stinner77af1722011-05-26 14:05:59 +02005369 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005370 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 struct addrinfo hints, *res;
5372 struct addrinfo *res0 = NULL;
5373 PyObject *hobj = NULL;
5374 PyObject *pobj = (PyObject *)NULL;
5375 char pbuf[30];
5376 char *hptr, *pptr;
5377 int family, socktype, protocol, flags;
5378 int error;
5379 PyObject *all = (PyObject *)NULL;
5380 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005381
Georg Brandl6083a4b2013-10-14 06:51:46 +02005382 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005384 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005385 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 &protocol, &flags)) {
5387 return NULL;
5388 }
5389 if (hobj == Py_None) {
5390 hptr = NULL;
5391 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005392 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005393
5394 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 if (!idna)
5396 return NULL;
5397 assert(PyBytes_Check(idna));
5398 hptr = PyBytes_AS_STRING(idna);
5399 } else if (PyBytes_Check(hobj)) {
5400 hptr = PyBytes_AsString(hobj);
5401 } else {
5402 PyErr_SetString(PyExc_TypeError,
5403 "getaddrinfo() argument 1 must be string or None");
5404 return NULL;
5405 }
5406 if (PyLong_CheckExact(pobj)) {
5407 long value = PyLong_AsLong(pobj);
5408 if (value == -1 && PyErr_Occurred())
5409 goto err;
5410 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5411 pptr = pbuf;
5412 } else if (PyUnicode_Check(pobj)) {
5413 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005414 if (pptr == NULL)
5415 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005417 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 } else if (pobj == Py_None) {
5419 pptr = (char *)NULL;
5420 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005421 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 goto err;
5423 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005424#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005425 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5426 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005427 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5428 * This workaround avoids a segfault in libsystem.
5429 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005430 pptr = "00";
5431 }
5432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005433 memset(&hints, 0, sizeof(hints));
5434 hints.ai_family = family;
5435 hints.ai_socktype = socktype;
5436 hints.ai_protocol = protocol;
5437 hints.ai_flags = flags;
5438 Py_BEGIN_ALLOW_THREADS
5439 ACQUIRE_GETADDRINFO_LOCK
5440 error = getaddrinfo(hptr, pptr, &hints, &res0);
5441 Py_END_ALLOW_THREADS
5442 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5443 if (error) {
5444 set_gaierror(error);
5445 goto err;
5446 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 if ((all = PyList_New(0)) == NULL)
5449 goto err;
5450 for (res = res0; res; res = res->ai_next) {
5451 PyObject *single;
5452 PyObject *addr =
5453 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5454 if (addr == NULL)
5455 goto err;
5456 single = Py_BuildValue("iiisO", res->ai_family,
5457 res->ai_socktype, res->ai_protocol,
5458 res->ai_canonname ? res->ai_canonname : "",
5459 addr);
5460 Py_DECREF(addr);
5461 if (single == NULL)
5462 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 if (PyList_Append(all, single))
5465 goto err;
5466 Py_XDECREF(single);
5467 }
5468 Py_XDECREF(idna);
5469 if (res0)
5470 freeaddrinfo(res0);
5471 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005472 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 Py_XDECREF(all);
5474 Py_XDECREF(idna);
5475 if (res0)
5476 freeaddrinfo(res0);
5477 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005478}
5479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005480PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005481"getaddrinfo(host, port [, family, type, proto, flags])\n\
5482 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005483\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005484Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005485
5486/* Python interface to getnameinfo(sa, flags). */
5487
5488/*ARGSUSED*/
5489static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005490socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005491{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005492 PyObject *sa = (PyObject *)NULL;
5493 int flags;
5494 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005495 int port;
5496 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5498 struct addrinfo hints, *res = NULL;
5499 int error;
5500 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 flags = flowinfo = scope_id = 0;
5503 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5504 return NULL;
5505 if (!PyTuple_Check(sa)) {
5506 PyErr_SetString(PyExc_TypeError,
5507 "getnameinfo() argument 1 must be a tuple");
5508 return NULL;
5509 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005510 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005511 &hostp, &port, &flowinfo, &scope_id))
5512 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005513 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005514 PyErr_SetString(PyExc_OverflowError,
5515 "getsockaddrarg: flowinfo must be 0-1048575.");
5516 return NULL;
5517 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005518 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5519 memset(&hints, 0, sizeof(hints));
5520 hints.ai_family = AF_UNSPEC;
5521 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005522 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005523 Py_BEGIN_ALLOW_THREADS
5524 ACQUIRE_GETADDRINFO_LOCK
5525 error = getaddrinfo(hostp, pbuf, &hints, &res);
5526 Py_END_ALLOW_THREADS
5527 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5528 if (error) {
5529 set_gaierror(error);
5530 goto fail;
5531 }
5532 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005533 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005534 "sockaddr resolved to multiple addresses");
5535 goto fail;
5536 }
5537 switch (res->ai_family) {
5538 case AF_INET:
5539 {
5540 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005541 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 "IPv4 sockaddr must be 2 tuple");
5543 goto fail;
5544 }
5545 break;
5546 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005547#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005548 case AF_INET6:
5549 {
5550 struct sockaddr_in6 *sin6;
5551 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005552 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 sin6->sin6_scope_id = scope_id;
5554 break;
5555 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005558 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5560 if (error) {
5561 set_gaierror(error);
5562 goto fail;
5563 }
5564 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005565
5566fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 if (res)
5568 freeaddrinfo(res);
5569 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005570}
5571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005572PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005573"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005574\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005575Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005576
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005577
5578/* Python API to getting and setting the default timeout value. */
5579
5580static PyObject *
5581socket_getdefaulttimeout(PyObject *self)
5582{
Victor Stinner71694d52015-03-28 01:18:54 +01005583 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 Py_INCREF(Py_None);
5585 return Py_None;
5586 }
Victor Stinner71694d52015-03-28 01:18:54 +01005587 else {
5588 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5589 return PyFloat_FromDouble(seconds);
5590 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005591}
5592
5593PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005594"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005595\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005596Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005597A value of None indicates that new socket objects have no timeout.\n\
5598When the socket module is first imported, the default is None.");
5599
5600static PyObject *
5601socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5602{
Victor Stinner71694d52015-03-28 01:18:54 +01005603 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005604
Victor Stinner71694d52015-03-28 01:18:54 +01005605 if (socket_parse_timeout(&timeout, arg) < 0)
5606 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005608 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005610 Py_INCREF(Py_None);
5611 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005612}
5613
5614PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005615"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005616\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005617Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005618A value of None indicates that new socket objects have no timeout.\n\
5619When the socket module is first imported, the default is None.");
5620
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005621#ifdef HAVE_IF_NAMEINDEX
5622/* Python API for getting interface indices and names */
5623
5624static PyObject *
5625socket_if_nameindex(PyObject *self, PyObject *arg)
5626{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005627 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005628 int i;
5629 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005630
Charles-François Natali60713592011-05-20 16:55:06 +02005631 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005632 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005633 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005634 return NULL;
5635 }
5636
5637 list = PyList_New(0);
5638 if (list == NULL) {
5639 if_freenameindex(ni);
5640 return NULL;
5641 }
5642
Charles-François Natali60713592011-05-20 16:55:06 +02005643 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5644 PyObject *ni_tuple = Py_BuildValue("IO&",
5645 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005646
5647 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5648 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005649 Py_DECREF(list);
5650 if_freenameindex(ni);
5651 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005652 }
5653 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005654 }
5655
5656 if_freenameindex(ni);
5657 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005658}
5659
5660PyDoc_STRVAR(if_nameindex_doc,
5661"if_nameindex()\n\
5662\n\
5663Returns a list of network interface information (index, name) tuples.");
5664
Charles-François Natali60713592011-05-20 16:55:06 +02005665static PyObject *
5666socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005667{
Charles-François Natali60713592011-05-20 16:55:06 +02005668 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005669 unsigned long index;
5670
Charles-François Natali60713592011-05-20 16:55:06 +02005671 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5672 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005673 return NULL;
5674
Charles-François Natali60713592011-05-20 16:55:06 +02005675 index = if_nametoindex(PyBytes_AS_STRING(oname));
5676 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005677 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005678 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005679 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005680 return NULL;
5681 }
5682
5683 return PyLong_FromUnsignedLong(index);
5684}
5685
5686PyDoc_STRVAR(if_nametoindex_doc,
5687"if_nametoindex(if_name)\n\
5688\n\
5689Returns the interface index corresponding to the interface name if_name.");
5690
Charles-François Natali60713592011-05-20 16:55:06 +02005691static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005692socket_if_indextoname(PyObject *self, PyObject *arg)
5693{
Charles-François Natali60713592011-05-20 16:55:06 +02005694 unsigned long index;
5695 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005696
Charles-François Natali60713592011-05-20 16:55:06 +02005697 index = PyLong_AsUnsignedLong(arg);
5698 if (index == (unsigned long) -1)
5699 return NULL;
5700
5701 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005702 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005703 return NULL;
5704 }
5705
Charles-François Natali60713592011-05-20 16:55:06 +02005706 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005707}
5708
5709PyDoc_STRVAR(if_indextoname_doc,
5710"if_indextoname(if_index)\n\
5711\n\
5712Returns the interface name corresponding to the interface index if_index.");
5713
5714#endif /* HAVE_IF_NAMEINDEX */
5715
5716
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005717#ifdef CMSG_LEN
5718/* Python interface to CMSG_LEN(length). */
5719
5720static PyObject *
5721socket_CMSG_LEN(PyObject *self, PyObject *args)
5722{
5723 Py_ssize_t length;
5724 size_t result;
5725
5726 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5727 return NULL;
5728 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5729 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5730 return NULL;
5731 }
5732 return PyLong_FromSize_t(result);
5733}
5734
5735PyDoc_STRVAR(CMSG_LEN_doc,
5736"CMSG_LEN(length) -> control message length\n\
5737\n\
5738Return the total length, without trailing padding, of an ancillary\n\
5739data item with associated data of the given length. This value can\n\
5740often be used as the buffer size for recvmsg() to receive a single\n\
5741item of ancillary data, but RFC 3542 requires portable applications to\n\
5742use CMSG_SPACE() and thus include space for padding, even when the\n\
5743item will be the last in the buffer. Raises OverflowError if length\n\
5744is outside the permissible range of values.");
5745
5746
5747#ifdef CMSG_SPACE
5748/* Python interface to CMSG_SPACE(length). */
5749
5750static PyObject *
5751socket_CMSG_SPACE(PyObject *self, PyObject *args)
5752{
5753 Py_ssize_t length;
5754 size_t result;
5755
5756 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5757 return NULL;
5758 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5759 PyErr_SetString(PyExc_OverflowError,
5760 "CMSG_SPACE() argument out of range");
5761 return NULL;
5762 }
5763 return PyLong_FromSize_t(result);
5764}
5765
5766PyDoc_STRVAR(CMSG_SPACE_doc,
5767"CMSG_SPACE(length) -> buffer size\n\
5768\n\
5769Return the buffer size needed for recvmsg() to receive an ancillary\n\
5770data item with associated data of the given length, along with any\n\
5771trailing padding. The buffer space needed to receive multiple items\n\
5772is the sum of the CMSG_SPACE() values for their associated data\n\
5773lengths. Raises OverflowError if length is outside the permissible\n\
5774range of values.");
5775#endif /* CMSG_SPACE */
5776#endif /* CMSG_LEN */
5777
5778
Guido van Rossum30a685f1991-06-27 15:51:29 +00005779/* List of functions exported by this module. */
5780
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005781static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005782 {"gethostbyname", socket_gethostbyname,
5783 METH_VARARGS, gethostbyname_doc},
5784 {"gethostbyname_ex", socket_gethostbyname_ex,
5785 METH_VARARGS, ghbn_ex_doc},
5786 {"gethostbyaddr", socket_gethostbyaddr,
5787 METH_VARARGS, gethostbyaddr_doc},
5788 {"gethostname", socket_gethostname,
5789 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005790#ifdef HAVE_SETHOSTNAME
5791 {"sethostname", socket_sethostname,
5792 METH_VARARGS, sethostname_doc},
5793#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 {"getservbyname", socket_getservbyname,
5795 METH_VARARGS, getservbyname_doc},
5796 {"getservbyport", socket_getservbyport,
5797 METH_VARARGS, getservbyport_doc},
5798 {"getprotobyname", socket_getprotobyname,
5799 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005800#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 {"dup", socket_dup,
5802 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005803#endif
Dave Cole331708b2004-08-09 04:51:41 +00005804#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 {"socketpair", socket_socketpair,
5806 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005808 {"ntohs", socket_ntohs,
5809 METH_VARARGS, ntohs_doc},
5810 {"ntohl", socket_ntohl,
5811 METH_O, ntohl_doc},
5812 {"htons", socket_htons,
5813 METH_VARARGS, htons_doc},
5814 {"htonl", socket_htonl,
5815 METH_O, htonl_doc},
5816 {"inet_aton", socket_inet_aton,
5817 METH_VARARGS, inet_aton_doc},
5818 {"inet_ntoa", socket_inet_ntoa,
5819 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005820#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 {"inet_pton", socket_inet_pton,
5822 METH_VARARGS, inet_pton_doc},
5823 {"inet_ntop", socket_inet_ntop,
5824 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005825#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005826 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5827 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 {"getnameinfo", socket_getnameinfo,
5829 METH_VARARGS, getnameinfo_doc},
5830 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5831 METH_NOARGS, getdefaulttimeout_doc},
5832 {"setdefaulttimeout", socket_setdefaulttimeout,
5833 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005834#ifdef HAVE_IF_NAMEINDEX
5835 {"if_nameindex", socket_if_nameindex,
5836 METH_NOARGS, if_nameindex_doc},
5837 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005838 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005839 {"if_indextoname", socket_if_indextoname,
5840 METH_O, if_indextoname_doc},
5841#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005842#ifdef CMSG_LEN
5843 {"CMSG_LEN", socket_CMSG_LEN,
5844 METH_VARARGS, CMSG_LEN_doc},
5845#ifdef CMSG_SPACE
5846 {"CMSG_SPACE", socket_CMSG_SPACE,
5847 METH_VARARGS, CMSG_SPACE_doc},
5848#endif
5849#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005850 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005851};
5852
Guido van Rossum30a685f1991-06-27 15:51:29 +00005853
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005854#ifdef MS_WINDOWS
5855#define OS_INIT_DEFINED
5856
5857/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005858
5859static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005860os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005863}
5864
5865static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005866os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005867{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 WSADATA WSAData;
5869 int ret;
5870 ret = WSAStartup(0x0101, &WSAData);
5871 switch (ret) {
5872 case 0: /* No error */
5873 Py_AtExit(os_cleanup);
5874 return 1; /* Success */
5875 case WSASYSNOTREADY:
5876 PyErr_SetString(PyExc_ImportError,
5877 "WSAStartup failed: network not ready");
5878 break;
5879 case WSAVERNOTSUPPORTED:
5880 case WSAEINVAL:
5881 PyErr_SetString(
5882 PyExc_ImportError,
5883 "WSAStartup failed: requested version not supported");
5884 break;
5885 default:
5886 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5887 break;
5888 }
5889 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005890}
5891
Guido van Rossum8d665e61996-06-26 18:22:49 +00005892#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005893
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005894
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005895
5896#ifndef OS_INIT_DEFINED
5897static int
5898os_init(void)
5899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005901}
5902#endif
5903
5904
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005905/* C API table - always add new things to the end for binary
5906 compatibility. */
5907static
5908PySocketModule_APIObject PySocketModuleAPI =
5909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005911 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005913};
5914
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005915
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005916/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005917
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005918 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005919 "socket.py" which implements some additional functionality.
5920 The import of "_socket" may fail with an ImportError exception if
5921 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005922 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005923 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005924*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005925
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005926PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005927"Implementation module for socket operations.\n\
5928\n\
5929See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005930
Martin v. Löwis1a214512008-06-11 05:26:20 +00005931static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 PyModuleDef_HEAD_INIT,
5933 PySocket_MODULE_NAME,
5934 socket_doc,
5935 -1,
5936 socket_methods,
5937 NULL,
5938 NULL,
5939 NULL,
5940 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005941};
5942
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005943PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005944PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005946 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 if (!os_init())
5949 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005950
Victor Stinnerdaf45552013-08-28 00:53:59 +02005951#ifdef MS_WINDOWS
5952 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08005953#if defined(_MSC_VER) && _MSC_VER >= 1800
5954 support_wsa_no_inherit = IsWindows7SP1OrGreater();
5955#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02005956 DWORD version = GetVersion();
5957 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5958 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5959 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08005960 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
5961#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02005962 }
5963#endif
5964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 Py_TYPE(&sock_type) = &PyType_Type;
5966 m = PyModule_Create(&socketmodule);
5967 if (m == NULL)
5968 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005969
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005970 Py_INCREF(PyExc_OSError);
5971 PySocketModuleAPI.error = PyExc_OSError;
5972 Py_INCREF(PyExc_OSError);
5973 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005975 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 if (socket_herror == NULL)
5977 return NULL;
5978 Py_INCREF(socket_herror);
5979 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005980 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 NULL);
5982 if (socket_gaierror == NULL)
5983 return NULL;
5984 Py_INCREF(socket_gaierror);
5985 PyModule_AddObject(m, "gaierror", socket_gaierror);
5986 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005987 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 if (socket_timeout == NULL)
5989 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005990 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 Py_INCREF(socket_timeout);
5992 PyModule_AddObject(m, "timeout", socket_timeout);
5993 Py_INCREF((PyObject *)&sock_type);
5994 if (PyModule_AddObject(m, "SocketType",
5995 (PyObject *)&sock_type) != 0)
5996 return NULL;
5997 Py_INCREF((PyObject *)&sock_type);
5998 if (PyModule_AddObject(m, "socket",
5999 (PyObject *)&sock_type) != 0)
6000 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006001
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006002#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006004#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006005 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006006#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 Py_INCREF(has_ipv6);
6008 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006010 /* Export C API */
6011 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6012 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6013 ) != 0)
6014 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006017#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006018 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006019#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006020 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006021#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006022 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006023#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006024#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006025 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006026#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006027#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006029 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006030#endif
6031#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006032 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006033#endif
6034#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006036 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006037#endif
6038#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006040 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006041#endif
6042#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006044 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006045#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006046#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006048 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006049#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006050#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006052 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006053#endif
6054#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006055 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006056 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006057#endif
6058#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006059 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006060#endif
6061#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006063 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006064#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006065#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006067 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006068#endif
6069#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006071 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006072#endif
6073#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006074 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006075 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006076#endif
6077#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006079 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006080#endif
6081#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006082 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006083 PyModule_AddIntMacro(m, AF_NETLINK);
6084 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006085#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006086 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006087#endif
6088#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006089 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006090#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006091 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6092 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006093#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006094 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006095#endif
6096#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006097 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006098#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006099#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006100 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006101#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006102#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006103 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006104#endif
6105#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006106 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006107#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006108 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006109#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006110 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006111#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006112#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006113 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006114#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006115#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006116#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006118 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006119#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006120#ifdef AF_LINK
6121 PyModule_AddIntMacro(m, AF_LINK);
6122#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006123#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006125 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006126#endif
6127#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006129 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006130#endif
6131#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006134#endif
6135#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006137 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006138#endif
6139#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006141 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006142#endif
6143#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006146#endif
6147#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006150#endif
6151#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006153 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006154#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006155
Hye-Shik Chang81268602004-02-02 06:05:24 +00006156#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006157 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6158 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6159 PyModule_AddIntMacro(m, BTPROTO_HCI);
6160 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006161#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006163#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006164#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006165#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006166 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006167#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006168 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6169 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006170#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006171 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006172 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6173 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006174#endif
6175
Charles-François Natali47413c12011-10-06 19:47:44 +02006176#ifdef AF_CAN
6177 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006179#endif
6180#ifdef PF_CAN
6181 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006182 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006183#endif
6184
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006185/* Reliable Datagram Sockets */
6186#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006188#endif
6189#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006190 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006191#endif
6192
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006193/* Kernel event messages */
6194#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006196#endif
6197#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006199#endif
6200
Antoine Pitroub156a462010-10-27 20:13:57 +00006201#ifdef AF_PACKET
6202 PyModule_AddIntMacro(m, AF_PACKET);
6203#endif
6204#ifdef PF_PACKET
6205 PyModule_AddIntMacro(m, PF_PACKET);
6206#endif
6207#ifdef PACKET_HOST
6208 PyModule_AddIntMacro(m, PACKET_HOST);
6209#endif
6210#ifdef PACKET_BROADCAST
6211 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6212#endif
6213#ifdef PACKET_MULTICAST
6214 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6215#endif
6216#ifdef PACKET_OTHERHOST
6217 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6218#endif
6219#ifdef PACKET_OUTGOING
6220 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6221#endif
6222#ifdef PACKET_LOOPBACK
6223 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6224#endif
6225#ifdef PACKET_FASTROUTE
6226 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006227#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006228
Christian Heimes043d6f62008-01-07 17:19:16 +00006229#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6234 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6235 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006236
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6238 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6239 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, SOL_TIPC);
6243 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6244 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6245 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6246 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006247
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006248 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6249 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6250 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6251 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006254 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6255 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006256#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006257 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006258 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006259#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6261 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6262 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6263 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6264 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6265 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006266#endif
6267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006269 PyModule_AddIntMacro(m, SOCK_STREAM);
6270 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006271/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006272 PyModule_AddIntMacro(m, SOCK_RAW);
6273 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006274#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006275 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006276#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006277#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006278 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006279#endif
6280#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006281 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006282#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006292#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006293#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006295#endif
6296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006306#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006307 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006308#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006311#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006312#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006314#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006315#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006317#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006318#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006319 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006320#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006322 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006324#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006325 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006326#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006327#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006328 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006331 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006333#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006334 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006335#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006340 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006343 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006344#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006345#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006347#endif
6348#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006349 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006350#endif
6351#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006352 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006353#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006354#ifdef SO_BINDTODEVICE
6355 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6356#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006357#ifdef SO_PRIORITY
6358 PyModule_AddIntMacro(m, SO_PRIORITY);
6359#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006360#ifdef SO_MARK
6361 PyModule_AddIntMacro(m, SO_MARK);
6362#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364 /* Maximum number of connections for "listen" */
6365#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006366 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006367#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006369#endif
6370
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006371 /* Ancilliary message types */
6372#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006374#endif
6375#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006377#endif
6378#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006380#endif
6381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 /* Flags for send, recv */
6383#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006384 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006387 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006390 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006393 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006396 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006399 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006402 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006412#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006413#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006414 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006415#endif
6416#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006417 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006418#endif
6419#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006420 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006421#endif
6422#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006424#endif
6425#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006426 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006427#endif
6428#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006429 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006430#endif
6431#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006433#endif
6434#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006435 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006436#endif
6437#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006439#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006440#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006442#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444 /* Protocol level and numbers, usable for [gs]etsockopt */
6445#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006446 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006449 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006450#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006469 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006470#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006477#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006478#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006480#endif
6481#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6483 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006484#endif
6485#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6487 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6488 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006489
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6491 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6492 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006493#endif
6494#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6496 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6497 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6498 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006499#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006500#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006502 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6503 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6504 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6505 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6506 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6507 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6508 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6509 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6510 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6511 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6512 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6513 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6514#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006515#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006517#endif
6518#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006520#endif
6521#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006523#endif
6524#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006526#endif
6527#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006529#endif
6530#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006532#endif
6533#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006537 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006538#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006542 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006545 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006546#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006566#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006581 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006584 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006591#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006592#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006639#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006640#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006645#endif
6646/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006649#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006651#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006652#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006654#endif
6655
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006656#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006658#endif
6659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 /* Some port configuration */
6661#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006663#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006668#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006670#endif
6671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* Some reserved IP v.4 addresses */
6673#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006675#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006680#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006688#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef INADDR_ALLHOSTS_GROUP
6694 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6695 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006701#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006707 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006708#endif
6709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710 /* IPv4 [gs]etsockopt options */
6711#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006726#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006729#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006732#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006744#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006754 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006758#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006759#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006761#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6764#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006779#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006783#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006787#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006789#endif
6790#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006792#endif
6793#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006795#endif
6796#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006798#endif
6799#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006801#endif
6802#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006804#endif
6805#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006807#endif
6808#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006810#endif
6811#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006813#endif
6814#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006816#endif
6817#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006818 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006819#endif
6820#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006821 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006822#endif
6823#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006825#endif
6826#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006828#endif
6829#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006831#endif
6832#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006834#endif
6835#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006837#endif
6838#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006840#endif
6841#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006843#endif
6844#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006846#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848 /* TCP options */
6849#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006856 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006858#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006859 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006879#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006884#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006885#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006887#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889 /* IPX options */
6890#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006892#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006893
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006894/* Reliable Datagram Sockets */
6895#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006897#endif
6898#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006900#endif
6901#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006903#endif
6904#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006906#endif
6907#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006909#endif
6910#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006912#endif
6913#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006915#endif
6916#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006918#endif
6919#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006921#endif
6922#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006924#endif
6925#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006927#endif
6928#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006930#endif
6931
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006933#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006935#endif
6936#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006938#endif
6939#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006941#endif
6942#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006944#endif
6945#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006947#endif
6948#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006950#endif
6951#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006953#endif
6954#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006956#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006957#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006959#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006960#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006962#endif
6963#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006965#endif
6966#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006968#endif
6969#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006971#endif
6972#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006974#endif
6975#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006977#endif
6978#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006980#endif
6981#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006983#endif
6984#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006986#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006987#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006989#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006990#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006992#endif
6993#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006995#endif
6996#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006998#endif
6999#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007001#endif
7002#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007004#endif
7005#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007007#endif
7008#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007010#endif
7011#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007013#endif
7014#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007016#endif
7017#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007019#endif
7020#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007022#endif
7023#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007025#endif
7026#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007028#endif
7029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007030 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007031#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007033#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007034 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007035#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007037#endif
7038#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007039 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007040#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007041 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007042#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007044#endif
7045#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007047#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007048 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007049#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007050 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007051#endif
7052
Christian Heimesfaf2f632008-01-06 16:59:19 +00007053#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054 {
7055 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7056 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7057 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007058 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007059 PyObject *tmp;
7060 tmp = PyLong_FromUnsignedLong(codes[i]);
7061 if (tmp == NULL)
7062 return NULL;
7063 PyModule_AddObject(m, names[i], tmp);
7064 }
7065 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, RCVALL_OFF);
7067 PyModule_AddIntMacro(m, RCVALL_ON);
7068 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007069#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007071#endif
7072#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007074#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007075#endif /* _MSTCPIP_ */
7076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007077 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007078#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007079 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007081 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007082}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007083
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007084
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007085#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007086#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007087
7088/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007089/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007090
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007091int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007092inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007095#if (SIZEOF_INT != 4)
7096#error "Not sure if in_addr_t exists and int is not 32-bits."
7097#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007098 unsigned int packed_addr;
7099 packed_addr = inet_addr(src);
7100 if (packed_addr == INADDR_NONE)
7101 return 0;
7102 memcpy(dst, &packed_addr, 4);
7103 return 1;
7104 }
7105 /* Should set errno to EAFNOSUPPORT */
7106 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007107}
7108
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007109const char *
7110inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007112 if (af == AF_INET) {
7113 struct in_addr packed_addr;
7114 if (size < 16)
7115 /* Should set errno to ENOSPC. */
7116 return NULL;
7117 memcpy(&packed_addr, src, sizeof(packed_addr));
7118 return strncpy(dst, inet_ntoa(packed_addr), size);
7119 }
7120 /* Should set errno to EAFNOSUPPORT */
7121 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007122}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007123
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007124#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007125#endif