blob: 8cf6140145c1d7db006b71c33800bdd4e7af856d [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. */
463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.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
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000600internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000601{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 /* Nothing to do unless we're in timeout mode (not non-blocking) */
605 if (s->sock_timeout <= 0.0)
606 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000607
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 /* Guard against closed socket */
609 if (s->sock_fd < 0)
610 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000611
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000612 /* Handling this condition here simplifies the select loops */
613 if (interval < 0.0)
614 return 1;
615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 /* Prefer poll, if available, since you can poll() any fd
617 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000618#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 {
620 struct pollfd pollfd;
621 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 pollfd.fd = s->sock_fd;
624 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000627 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 n = poll(&pollfd, 1, timeout);
629 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000630#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 {
632 /* Construct the arguments to select */
633 fd_set fds;
634 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000635 tv.tv_sec = (int)interval;
636 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 FD_ZERO(&fds);
638 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 /* See if the socket is ready */
641 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000642 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
643 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000645 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
646 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000648#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 if (n < 0)
651 return -1;
652 if (n == 0)
653 return 1;
654 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655}
656
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000657static int
658internal_select(PySocketSockObject *s, int writing)
659{
660 return internal_select_ex(s, writing, s->sock_timeout);
661}
662
663/*
664 Two macros for automatic retry of select() in case of false positives
665 (for example, select() could indicate a socket is ready for reading
666 but the data then discarded by the OS because of a wrong checksum).
667 Here is an example of use:
668
669 BEGIN_SELECT_LOOP(s)
670 Py_BEGIN_ALLOW_THREADS
671 timeout = internal_select_ex(s, 0, interval);
672 if (!timeout)
673 outlen = recv(s->sock_fd, cbuf, len, flags);
674 Py_END_ALLOW_THREADS
675 if (timeout == 1) {
676 PyErr_SetString(socket_timeout, "timed out");
677 return -1;
678 }
679 END_SELECT_LOOP(s)
680*/
681
682#define BEGIN_SELECT_LOOP(s) \
683 { \
684 _PyTime_timeval now, deadline = {0, 0}; \
685 double interval = s->sock_timeout; \
686 int has_timeout = s->sock_timeout > 0.0; \
687 if (has_timeout) { \
Victor Stinnerae586492014-09-02 23:18:25 +0200688 _PyTime_monotonic(&now); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000689 deadline = now; \
Victor Stinner9a8089b2015-03-20 01:42:20 +0100690 _PyTime_AddDouble(&deadline, s->sock_timeout, _PyTime_ROUND_UP); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000691 } \
692 while (1) { \
693 errno = 0; \
694
695#define END_SELECT_LOOP(s) \
696 if (!has_timeout || \
697 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
698 break; \
Victor Stinnerae586492014-09-02 23:18:25 +0200699 _PyTime_monotonic(&now); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000700 interval = _PyTime_INTERVAL(now, deadline); \
701 } \
702 } \
703
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000704/* Initialize a new socket object. */
705
Tim Petersa12b4cf2002-07-18 22:38:44 +0000706static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000707
Martin v. Löwis1a214512008-06-11 05:26:20 +0000708static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000709init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 s->sock_fd = fd;
713 s->sock_family = family;
714 s->sock_type = type;
715 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000717 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000718#ifdef SOCK_NONBLOCK
719 if (type & SOCK_NONBLOCK)
720 s->sock_timeout = 0.0;
721 else
722#endif
723 {
724 s->sock_timeout = defaulttimeout;
725 if (defaulttimeout >= 0.0)
726 internal_setblocking(s, 0);
727 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000728
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000729}
730
731
Guido van Rossum30a685f1991-06-27 15:51:29 +0000732/* Create a new socket object.
733 This just creates the object and initializes it.
734 If the creation fails, return NULL and set an exception (implicit
735 in NEWOBJ()). */
736
Guido van Rossum73624e91994-10-10 17:59:00 +0000737static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000738new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 PySocketSockObject *s;
741 s = (PySocketSockObject *)
742 PyType_GenericNew(&sock_type, NULL, NULL);
743 if (s != NULL)
744 init_sockobject(s, fd, family, type, proto);
745 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000746}
747
Guido van Rossum30a685f1991-06-27 15:51:29 +0000748
Guido van Rossum48a680c2001-03-02 06:34:14 +0000749/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000750 thread to be in gethostbyname or getaddrinfo */
751#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200752static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000753#endif
754
755
Guido van Rossum30a685f1991-06-27 15:51:29 +0000756/* Convert a string specifying a host name or one of a few symbolic
757 names to a numeric IP address. This usually calls gethostbyname()
758 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000759 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000760 an error occurred; then an exception is raised. */
761
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000763setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000765 struct addrinfo hints, *res;
766 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000768 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
769 if (name[0] == '\0') {
770 int siz;
771 memset(&hints, 0, sizeof(hints));
772 hints.ai_family = af;
773 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
774 hints.ai_flags = AI_PASSIVE;
775 Py_BEGIN_ALLOW_THREADS
776 ACQUIRE_GETADDRINFO_LOCK
777 error = getaddrinfo(NULL, "0", &hints, &res);
778 Py_END_ALLOW_THREADS
779 /* We assume that those thread-unsafe getaddrinfo() versions
780 *are* safe regarding their return value, ie. that a
781 subsequent call to getaddrinfo() does not destroy the
782 outcome of the first call. */
783 RELEASE_GETADDRINFO_LOCK
784 if (error) {
785 set_gaierror(error);
786 return -1;
787 }
788 switch (res->ai_family) {
789 case AF_INET:
790 siz = 4;
791 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000792#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 case AF_INET6:
794 siz = 16;
795 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 default:
798 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200799 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 "unsupported address family");
801 return -1;
802 }
803 if (res->ai_next) {
804 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200805 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 "wildcard resolved to multiple address");
807 return -1;
808 }
809 if (res->ai_addrlen < addr_ret_size)
810 addr_ret_size = res->ai_addrlen;
811 memcpy(addr_ret, res->ai_addr, addr_ret_size);
812 freeaddrinfo(res);
813 return siz;
814 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200815 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100816 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200817 if (strcmp(name, "255.255.255.255") == 0 ||
818 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 struct sockaddr_in *sin;
820 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200821 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 "address family mismatched");
823 return -1;
824 }
825 sin = (struct sockaddr_in *)addr_ret;
826 memset((void *) sin, '\0', sizeof(*sin));
827 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000828#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000831 sin->sin_addr.s_addr = INADDR_BROADCAST;
832 return sizeof(sin->sin_addr);
833 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200834
835 /* avoid a name resolution in case of numeric address */
836#ifdef HAVE_INET_PTON
837 /* check for an IPv4 address */
838 if (af == AF_UNSPEC || af == AF_INET) {
839 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
840 memset(sin, 0, sizeof(*sin));
841 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
842 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000843#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200844 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000845#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200846 return 4;
847 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200849#ifdef ENABLE_IPV6
850 /* check for an IPv6 address - if the address contains a scope ID, we
851 * fallback to getaddrinfo(), which can handle translation from interface
852 * name to interface index */
853 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
854 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
855 memset(sin, 0, sizeof(*sin));
856 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
857 sin->sin6_family = AF_INET6;
858#ifdef HAVE_SOCKADDR_SA_LEN
859 sin->sin6_len = sizeof(*sin);
860#endif
861 return 16;
862 }
863 }
864#endif /* ENABLE_IPV6 */
865#else /* HAVE_INET_PTON */
866 /* check for an IPv4 address */
867 if (af == AF_INET || af == AF_UNSPEC) {
868 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
869 memset(sin, 0, sizeof(*sin));
870 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
871 sin->sin_family = AF_INET;
872#ifdef HAVE_SOCKADDR_SA_LEN
873 sin->sin_len = sizeof(*sin);
874#endif
875 return 4;
876 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100877 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200878#endif /* HAVE_INET_PTON */
879
880 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 memset(&hints, 0, sizeof(hints));
882 hints.ai_family = af;
883 Py_BEGIN_ALLOW_THREADS
884 ACQUIRE_GETADDRINFO_LOCK
885 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000886#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 if (error == EAI_NONAME && af == AF_UNSPEC) {
888 /* On Tru64 V5.1, numeric-to-addr conversion fails
889 if no address family is given. Assume IPv4 for now.*/
890 hints.ai_family = AF_INET;
891 error = getaddrinfo(name, NULL, &hints, &res);
892 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000894 Py_END_ALLOW_THREADS
895 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
896 if (error) {
897 set_gaierror(error);
898 return -1;
899 }
900 if (res->ai_addrlen < addr_ret_size)
901 addr_ret_size = res->ai_addrlen;
902 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
903 freeaddrinfo(res);
904 switch (addr_ret->sa_family) {
905 case AF_INET:
906 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000907#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 case AF_INET6:
909 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000910#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200912 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 return -1;
914 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000915}
916
Guido van Rossum30a685f1991-06-27 15:51:29 +0000917
Guido van Rossum30a685f1991-06-27 15:51:29 +0000918/* Create a string object representing an IP address.
919 This is always a string of the form 'dd.dd.dd.dd' (with variable
920 size numbers). */
921
Guido van Rossum73624e91994-10-10 17:59:00 +0000922static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 char buf[NI_MAXHOST];
926 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
929 NI_NUMERICHOST);
930 if (error) {
931 set_gaierror(error);
932 return NULL;
933 }
934 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000935}
936
937
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000938#ifdef USE_BLUETOOTH
939/* Convert a string representation of a Bluetooth address into a numeric
940 address. Returns the length (6), or raises an exception and returns -1 if
941 an error occurred. */
942
943static int
944setbdaddr(char *name, bdaddr_t *bdaddr)
945{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 unsigned int b0, b1, b2, b3, b4, b5;
947 char ch;
948 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
951 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
952 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
953 bdaddr->b[0] = b0;
954 bdaddr->b[1] = b1;
955 bdaddr->b[2] = b2;
956 bdaddr->b[3] = b3;
957 bdaddr->b[4] = b4;
958 bdaddr->b[5] = b5;
959 return 6;
960 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200961 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 return -1;
963 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000964}
965
966/* Create a string representation of the Bluetooth address. This is always a
967 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
968 value (zero padded if necessary). */
969
970static PyObject *
971makebdaddr(bdaddr_t *bdaddr)
972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
976 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
977 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
978 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000979}
980#endif
981
982
Guido van Rossum30a685f1991-06-27 15:51:29 +0000983/* Create an object representing the given socket address,
984 suitable for passing it back to bind(), connect() etc.
985 The family field of the sockaddr structure is inspected
986 to determine what kind of address it really is. */
987
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000988/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000989static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000990makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 if (addrlen == 0) {
993 /* No address -- may be recvfrom() from known socket */
994 Py_INCREF(Py_None);
995 return Py_None;
996 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 case AF_INET:
1001 {
1002 struct sockaddr_in *a;
1003 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1004 PyObject *ret = NULL;
1005 if (addrobj) {
1006 a = (struct sockaddr_in *)addr;
1007 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1008 Py_DECREF(addrobj);
1009 }
1010 return ret;
1011 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001012
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001013#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 case AF_UNIX:
1015 {
1016 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001017#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1019 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001020 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 }
1022 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001023#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001024 {
1025 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001026 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 }
1028 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001029#endif /* AF_UNIX */
1030
Martin v. Löwis11017b12006-01-14 18:12:57 +00001031#if defined(AF_NETLINK)
1032 case AF_NETLINK:
1033 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1035 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001036 }
1037#endif /* AF_NETLINK */
1038
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001039#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 case AF_INET6:
1041 {
1042 struct sockaddr_in6 *a;
1043 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1044 PyObject *ret = NULL;
1045 if (addrobj) {
1046 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001047 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 addrobj,
1049 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001050 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 a->sin6_scope_id);
1052 Py_DECREF(addrobj);
1053 }
1054 return ret;
1055 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001056#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001057
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001058#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 case AF_BLUETOOTH:
1060 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 case BTPROTO_L2CAP:
1063 {
1064 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1065 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1066 PyObject *ret = NULL;
1067 if (addrobj) {
1068 ret = Py_BuildValue("Oi",
1069 addrobj,
1070 _BT_L2_MEMB(a, psm));
1071 Py_DECREF(addrobj);
1072 }
1073 return ret;
1074 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001076 case BTPROTO_RFCOMM:
1077 {
1078 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1079 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1080 PyObject *ret = NULL;
1081 if (addrobj) {
1082 ret = Py_BuildValue("Oi",
1083 addrobj,
1084 _BT_RC_MEMB(a, channel));
1085 Py_DECREF(addrobj);
1086 }
1087 return ret;
1088 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 case BTPROTO_HCI:
1091 {
1092 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001093#if defined(__NetBSD__) || defined(__DragonFly__)
1094 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1095#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 PyObject *ret = NULL;
1097 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1098 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001099#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001100 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001101
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001102#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 case BTPROTO_SCO:
1104 {
1105 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1106 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1107 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001108#endif
1109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 default:
1111 PyErr_SetString(PyExc_ValueError,
1112 "Unknown Bluetooth protocol");
1113 return NULL;
1114 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001115#endif
1116
Antoine Pitroub156a462010-10-27 20:13:57 +00001117#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 case AF_PACKET:
1119 {
1120 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1121 char *ifname = "";
1122 struct ifreq ifr;
1123 /* need to look up interface name give index */
1124 if (a->sll_ifindex) {
1125 ifr.ifr_ifindex = a->sll_ifindex;
1126 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1127 ifname = ifr.ifr_name;
1128 }
1129 return Py_BuildValue("shbhy#",
1130 ifname,
1131 ntohs(a->sll_protocol),
1132 a->sll_pkttype,
1133 a->sll_hatype,
1134 a->sll_addr,
1135 a->sll_halen);
1136 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001137#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001138
Christian Heimes043d6f62008-01-07 17:19:16 +00001139#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 case AF_TIPC:
1141 {
1142 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1143 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1144 return Py_BuildValue("IIIII",
1145 a->addrtype,
1146 a->addr.nameseq.type,
1147 a->addr.nameseq.lower,
1148 a->addr.nameseq.upper,
1149 a->scope);
1150 } else if (a->addrtype == TIPC_ADDR_NAME) {
1151 return Py_BuildValue("IIIII",
1152 a->addrtype,
1153 a->addr.name.name.type,
1154 a->addr.name.name.instance,
1155 a->addr.name.name.instance,
1156 a->scope);
1157 } else if (a->addrtype == TIPC_ADDR_ID) {
1158 return Py_BuildValue("IIIII",
1159 a->addrtype,
1160 a->addr.id.node,
1161 a->addr.id.ref,
1162 0,
1163 a->scope);
1164 } else {
1165 PyErr_SetString(PyExc_ValueError,
1166 "Invalid address type");
1167 return NULL;
1168 }
1169 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001170#endif
1171
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001172#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001173 case AF_CAN:
1174 {
1175 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1176 char *ifname = "";
1177 struct ifreq ifr;
1178 /* need to look up interface name given index */
1179 if (a->can_ifindex) {
1180 ifr.ifr_ifindex = a->can_ifindex;
1181 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1182 ifname = ifr.ifr_name;
1183 }
1184
1185 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1186 ifname,
1187 a->can_family);
1188 }
1189#endif
1190
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001191#ifdef PF_SYSTEM
1192 case PF_SYSTEM:
1193 switch(proto) {
1194#ifdef SYSPROTO_CONTROL
1195 case SYSPROTO_CONTROL:
1196 {
1197 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1198 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1199 }
1200#endif
1201 default:
1202 PyErr_SetString(PyExc_ValueError,
1203 "Invalid address type");
1204 return 0;
1205 }
1206#endif
1207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001210 default:
1211 /* If we don't know the address family, don't raise an
1212 exception -- return it as an (int, bytes) tuple. */
1213 return Py_BuildValue("iy#",
1214 addr->sa_family,
1215 addr->sa_data,
1216 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001219}
1220
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001221/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1222 (in particular, numeric IP addresses). */
1223struct maybe_idna {
1224 PyObject *obj;
1225 char *buf;
1226};
1227
1228static void
1229idna_cleanup(struct maybe_idna *data)
1230{
1231 Py_CLEAR(data->obj);
1232}
1233
1234static int
1235idna_converter(PyObject *obj, struct maybe_idna *data)
1236{
1237 size_t len;
1238 PyObject *obj2, *obj3;
1239 if (obj == NULL) {
1240 idna_cleanup(data);
1241 return 1;
1242 }
1243 data->obj = NULL;
1244 len = -1;
1245 if (PyBytes_Check(obj)) {
1246 data->buf = PyBytes_AsString(obj);
1247 len = PyBytes_Size(obj);
1248 }
1249 else if (PyByteArray_Check(obj)) {
1250 data->buf = PyByteArray_AsString(obj);
1251 len = PyByteArray_Size(obj);
1252 }
1253 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1254 data->buf = PyUnicode_DATA(obj);
1255 len = PyUnicode_GET_LENGTH(obj);
1256 }
1257 else {
1258 obj2 = PyUnicode_FromObject(obj);
1259 if (!obj2) {
1260 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1261 obj->ob_type->tp_name);
1262 return 0;
1263 }
1264 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1265 Py_DECREF(obj2);
1266 if (!obj3) {
1267 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1268 return 0;
1269 }
1270 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001271 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001272 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1273 return 0;
1274 }
1275 data->obj = obj3;
1276 data->buf = PyBytes_AS_STRING(obj3);
1277 len = PyBytes_GET_SIZE(obj3);
1278 }
1279 if (strlen(data->buf) != len) {
1280 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001281 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001282 return 0;
1283 }
1284 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001285}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001286
1287/* Parse a socket address argument according to the socket object's
1288 address family. Return 1 if the address was in the proper format,
1289 0 of not. The address is returned through addr_ret, its length
1290 through len_ret. */
1291
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001292static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001293getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001296 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001297
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001298#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 case AF_UNIX:
1300 {
1301 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001302 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001303 int retval = 0;
1304
1305 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1306 allow embedded nulls on Linux. */
1307 if (PyUnicode_Check(args)) {
1308 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1309 return 0;
1310 }
1311 else
1312 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001313 if (!PyArg_Parse(args, "y*", &path)) {
1314 Py_DECREF(args);
1315 return retval;
1316 }
1317 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001319 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001320#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001321 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001322 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001323 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001324 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001325 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001326 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001327 }
1328 }
1329 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001330#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001331 {
1332 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001333 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001334 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001336 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001337 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001338 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 }
1340 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001341 memcpy(addr->sun_path, path.buf, path.len);
1342 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001343 retval = 1;
1344 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001345 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001346 Py_DECREF(args);
1347 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001348 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001349#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001350
Martin v. Löwis11017b12006-01-14 18:12:57 +00001351#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 case AF_NETLINK:
1353 {
1354 struct sockaddr_nl* addr;
1355 int pid, groups;
1356 addr = (struct sockaddr_nl *)addr_ret;
1357 if (!PyTuple_Check(args)) {
1358 PyErr_Format(
1359 PyExc_TypeError,
1360 "getsockaddrarg: "
1361 "AF_NETLINK address must be tuple, not %.500s",
1362 Py_TYPE(args)->tp_name);
1363 return 0;
1364 }
1365 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1366 return 0;
1367 addr->nl_family = AF_NETLINK;
1368 addr->nl_pid = pid;
1369 addr->nl_groups = groups;
1370 *len_ret = sizeof(*addr);
1371 return 1;
1372 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001373#endif
1374
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001375#ifdef AF_RDS
1376 case AF_RDS:
1377 /* RDS sockets use sockaddr_in: fall-through */
1378#endif
1379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 case AF_INET:
1381 {
1382 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001383 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 int port, result;
1385 if (!PyTuple_Check(args)) {
1386 PyErr_Format(
1387 PyExc_TypeError,
1388 "getsockaddrarg: "
1389 "AF_INET address must be tuple, not %.500s",
1390 Py_TYPE(args)->tp_name);
1391 return 0;
1392 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001393 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1394 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001395 return 0;
1396 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001397 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001399 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 if (result < 0)
1401 return 0;
1402 if (port < 0 || port > 0xffff) {
1403 PyErr_SetString(
1404 PyExc_OverflowError,
1405 "getsockaddrarg: port must be 0-65535.");
1406 return 0;
1407 }
1408 addr->sin_family = AF_INET;
1409 addr->sin_port = htons((short)port);
1410 *len_ret = sizeof *addr;
1411 return 1;
1412 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001413
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001414#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 case AF_INET6:
1416 {
1417 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001418 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001419 int port, result;
1420 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 flowinfo = scope_id = 0;
1422 if (!PyTuple_Check(args)) {
1423 PyErr_Format(
1424 PyExc_TypeError,
1425 "getsockaddrarg: "
1426 "AF_INET6 address must be tuple, not %.500s",
1427 Py_TYPE(args)->tp_name);
1428 return 0;
1429 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001430 if (!PyArg_ParseTuple(args, "O&i|II",
1431 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 &scope_id)) {
1433 return 0;
1434 }
1435 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001436 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001438 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001439 if (result < 0)
1440 return 0;
1441 if (port < 0 || port > 0xffff) {
1442 PyErr_SetString(
1443 PyExc_OverflowError,
1444 "getsockaddrarg: port must be 0-65535.");
1445 return 0;
1446 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001447 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001448 PyErr_SetString(
1449 PyExc_OverflowError,
1450 "getsockaddrarg: flowinfo must be 0-1048575.");
1451 return 0;
1452 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001453 addr->sin6_family = s->sock_family;
1454 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001455 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001456 addr->sin6_scope_id = scope_id;
1457 *len_ret = sizeof *addr;
1458 return 1;
1459 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001460#endif
1461
Hye-Shik Chang81268602004-02-02 06:05:24 +00001462#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 case AF_BLUETOOTH:
1464 {
1465 switch (s->sock_proto) {
1466 case BTPROTO_L2CAP:
1467 {
1468 struct sockaddr_l2 *addr;
1469 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 addr = (struct sockaddr_l2 *)addr_ret;
1472 memset(addr, 0, sizeof(struct sockaddr_l2));
1473 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1474 if (!PyArg_ParseTuple(args, "si", &straddr,
1475 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001476 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 "wrong format");
1478 return 0;
1479 }
1480 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1481 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 *len_ret = sizeof *addr;
1484 return 1;
1485 }
1486 case BTPROTO_RFCOMM:
1487 {
1488 struct sockaddr_rc *addr;
1489 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 addr = (struct sockaddr_rc *)addr_ret;
1492 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1493 if (!PyArg_ParseTuple(args, "si", &straddr,
1494 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001495 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 "wrong format");
1497 return 0;
1498 }
1499 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1500 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001502 *len_ret = sizeof *addr;
1503 return 1;
1504 }
1505 case BTPROTO_HCI:
1506 {
1507 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001508#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001509 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001510
Alexander Belopolskye239d232010-12-08 23:31:48 +00001511 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001512 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001513 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001514 "wrong format");
1515 return 0;
1516 }
1517 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1518 return 0;
1519#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1521 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001522 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 "wrong format");
1524 return 0;
1525 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 *len_ret = sizeof *addr;
1528 return 1;
1529 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001530#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 case BTPROTO_SCO:
1532 {
1533 struct sockaddr_sco *addr;
1534 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 addr = (struct sockaddr_sco *)addr_ret;
1537 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1538 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001539 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 "wrong format");
1541 return 0;
1542 }
1543 straddr = PyBytes_AS_STRING(args);
1544 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1545 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 *len_ret = sizeof *addr;
1548 return 1;
1549 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001552 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 return 0;
1554 }
1555 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001556#endif
1557
Antoine Pitroub156a462010-10-27 20:13:57 +00001558#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 case AF_PACKET:
1560 {
1561 struct sockaddr_ll* addr;
1562 struct ifreq ifr;
1563 char *interfaceName;
1564 int protoNumber;
1565 int hatype = 0;
1566 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001567 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 if (!PyTuple_Check(args)) {
1570 PyErr_Format(
1571 PyExc_TypeError,
1572 "getsockaddrarg: "
1573 "AF_PACKET address must be tuple, not %.500s",
1574 Py_TYPE(args)->tp_name);
1575 return 0;
1576 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001577 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001578 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001579 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 return 0;
1581 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1582 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1583 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1584 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001585 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 return 0;
1587 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001588 if (haddr.buf && haddr.len > 8) {
1589 PyErr_SetString(PyExc_ValueError,
1590 "Hardware address must be 8 bytes or less");
1591 PyBuffer_Release(&haddr);
1592 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001593 }
1594 if (protoNumber < 0 || protoNumber > 0xffff) {
1595 PyErr_SetString(
1596 PyExc_OverflowError,
1597 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001598 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 return 0;
1600 }
1601 addr = (struct sockaddr_ll*)addr_ret;
1602 addr->sll_family = AF_PACKET;
1603 addr->sll_protocol = htons((short)protoNumber);
1604 addr->sll_ifindex = ifr.ifr_ifindex;
1605 addr->sll_pkttype = pkttype;
1606 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001607 if (haddr.buf) {
1608 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1609 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001611 else
1612 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001614 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 return 1;
1616 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001617#endif
1618
Christian Heimes043d6f62008-01-07 17:19:16 +00001619#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 case AF_TIPC:
1621 {
1622 unsigned int atype, v1, v2, v3;
1623 unsigned int scope = TIPC_CLUSTER_SCOPE;
1624 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 if (!PyTuple_Check(args)) {
1627 PyErr_Format(
1628 PyExc_TypeError,
1629 "getsockaddrarg: "
1630 "AF_TIPC address must be tuple, not %.500s",
1631 Py_TYPE(args)->tp_name);
1632 return 0;
1633 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 if (!PyArg_ParseTuple(args,
1636 "IIII|I;Invalid TIPC address format",
1637 &atype, &v1, &v2, &v3, &scope))
1638 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 addr = (struct sockaddr_tipc *) addr_ret;
1641 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 addr->family = AF_TIPC;
1644 addr->scope = scope;
1645 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001647 if (atype == TIPC_ADDR_NAMESEQ) {
1648 addr->addr.nameseq.type = v1;
1649 addr->addr.nameseq.lower = v2;
1650 addr->addr.nameseq.upper = v3;
1651 } else if (atype == TIPC_ADDR_NAME) {
1652 addr->addr.name.name.type = v1;
1653 addr->addr.name.name.instance = v2;
1654 } else if (atype == TIPC_ADDR_ID) {
1655 addr->addr.id.node = v1;
1656 addr->addr.id.ref = v2;
1657 } else {
1658 /* Shouldn't happen */
1659 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1660 return 0;
1661 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 return 1;
1666 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001667#endif
1668
Vinay Sajiped6783f2014-03-21 11:44:32 +00001669#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001670 case AF_CAN:
1671 switch (s->sock_proto) {
1672 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001673 /* fall-through */
1674 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001675 {
1676 struct sockaddr_can *addr;
1677 PyObject *interfaceName;
1678 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001679 Py_ssize_t len;
1680
Benjamin Peterson18b71912013-05-16 15:29:44 -05001681 addr = (struct sockaddr_can *)addr_ret;
1682
Charles-François Natali47413c12011-10-06 19:47:44 +02001683 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1684 &interfaceName))
1685 return 0;
1686
1687 len = PyBytes_GET_SIZE(interfaceName);
1688
1689 if (len == 0) {
1690 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001691 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001692 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1693 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001694 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1695 s->errorhandler();
1696 Py_DECREF(interfaceName);
1697 return 0;
1698 }
1699 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001700 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001701 "AF_CAN interface name too long");
1702 Py_DECREF(interfaceName);
1703 return 0;
1704 }
1705
1706 addr->can_family = AF_CAN;
1707 addr->can_ifindex = ifr.ifr_ifindex;
1708
1709 *len_ret = sizeof(*addr);
1710 Py_DECREF(interfaceName);
1711 return 1;
1712 }
1713 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001714 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001715 "getsockaddrarg: unsupported CAN protocol");
1716 return 0;
1717 }
1718#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001719
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001720#ifdef PF_SYSTEM
1721 case PF_SYSTEM:
1722 switch (s->sock_proto) {
1723#ifdef SYSPROTO_CONTROL
1724 case SYSPROTO_CONTROL:
1725 {
1726 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001727
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001728 addr = (struct sockaddr_ctl *)addr_ret;
1729 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001730 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001731
1732 if (PyUnicode_Check(args)) {
1733 struct ctl_info info;
1734 PyObject *ctl_name;
1735
1736 if (!PyArg_Parse(args, "O&",
1737 PyUnicode_FSConverter, &ctl_name)) {
1738 return 0;
1739 }
1740
Victor Stinnerf50e1872015-03-20 11:32:24 +01001741 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001742 PyErr_SetString(PyExc_ValueError,
1743 "provided string is too long");
1744 Py_DECREF(ctl_name);
1745 return 0;
1746 }
1747 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1748 sizeof(info.ctl_name));
1749 Py_DECREF(ctl_name);
1750
1751 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1752 PyErr_SetString(PyExc_OSError,
1753 "cannot find kernel control with provided name");
1754 return 0;
1755 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001756
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001757 addr->sc_id = info.ctl_id;
1758 addr->sc_unit = 0;
1759 } else if (!PyArg_ParseTuple(args, "II",
1760 &(addr->sc_id), &(addr->sc_unit))) {
1761 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1762 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001763
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001764 return 0;
1765 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001766
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001767 *len_ret = sizeof(*addr);
1768 return 1;
1769 }
1770#endif
1771 default:
1772 PyErr_SetString(PyExc_OSError,
1773 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1774 return 0;
1775 }
1776#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001781 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001785}
1786
Guido van Rossum30a685f1991-06-27 15:51:29 +00001787
Guido van Rossum48a680c2001-03-02 06:34:14 +00001788/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001789 Return 1 if the family is known, 0 otherwise. The length is returned
1790 through len_ret. */
1791
1792static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001793getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001795 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001796
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001797#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 case AF_UNIX:
1799 {
1800 *len_ret = sizeof (struct sockaddr_un);
1801 return 1;
1802 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001803#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001804#if defined(AF_NETLINK)
1805 case AF_NETLINK:
1806 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 *len_ret = sizeof (struct sockaddr_nl);
1808 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001809 }
1810#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001811
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001812#ifdef AF_RDS
1813 case AF_RDS:
1814 /* RDS sockets use sockaddr_in: fall-through */
1815#endif
1816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 case AF_INET:
1818 {
1819 *len_ret = sizeof (struct sockaddr_in);
1820 return 1;
1821 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001822
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001823#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 case AF_INET6:
1825 {
1826 *len_ret = sizeof (struct sockaddr_in6);
1827 return 1;
1828 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001829#endif
1830
Hye-Shik Chang81268602004-02-02 06:05:24 +00001831#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001832 case AF_BLUETOOTH:
1833 {
1834 switch(s->sock_proto)
1835 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001837 case BTPROTO_L2CAP:
1838 *len_ret = sizeof (struct sockaddr_l2);
1839 return 1;
1840 case BTPROTO_RFCOMM:
1841 *len_ret = sizeof (struct sockaddr_rc);
1842 return 1;
1843 case BTPROTO_HCI:
1844 *len_ret = sizeof (struct sockaddr_hci);
1845 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001846#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001847 case BTPROTO_SCO:
1848 *len_ret = sizeof (struct sockaddr_sco);
1849 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001851 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001852 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 "unknown BT protocol");
1854 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 }
1857 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001858#endif
1859
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001860#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 case AF_PACKET:
1862 {
1863 *len_ret = sizeof (struct sockaddr_ll);
1864 return 1;
1865 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001866#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001867
Christian Heimes043d6f62008-01-07 17:19:16 +00001868#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 case AF_TIPC:
1870 {
1871 *len_ret = sizeof (struct sockaddr_tipc);
1872 return 1;
1873 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001874#endif
1875
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001876#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001877 case AF_CAN:
1878 {
1879 *len_ret = sizeof (struct sockaddr_can);
1880 return 1;
1881 }
1882#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001883
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001884#ifdef PF_SYSTEM
1885 case PF_SYSTEM:
1886 switch(s->sock_proto) {
1887#ifdef SYSPROTO_CONTROL
1888 case SYSPROTO_CONTROL:
1889 *len_ret = sizeof (struct sockaddr_ctl);
1890 return 1;
1891#endif
1892 default:
1893 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1894 "unknown PF_SYSTEM protocol");
1895 return 0;
1896 }
1897#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001899 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001901 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001902 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001903 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001905 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001906}
1907
1908
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001909/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1910 Currently, these methods are only compiled if the RFC 2292/3542
1911 CMSG_LEN() macro is available. Older systems seem to have used
1912 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1913 it may be possible to define CMSG_LEN() that way if it's not
1914 provided. Some architectures might need extra padding after the
1915 cmsghdr, however, and CMSG_LEN() would have to take account of
1916 this. */
1917#ifdef CMSG_LEN
1918/* If length is in range, set *result to CMSG_LEN(length) and return
1919 true; otherwise, return false. */
1920static int
1921get_CMSG_LEN(size_t length, size_t *result)
1922{
1923 size_t tmp;
1924
1925 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1926 return 0;
1927 tmp = CMSG_LEN(length);
1928 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1929 return 0;
1930 *result = tmp;
1931 return 1;
1932}
1933
1934#ifdef CMSG_SPACE
1935/* If length is in range, set *result to CMSG_SPACE(length) and return
1936 true; otherwise, return false. */
1937static int
1938get_CMSG_SPACE(size_t length, size_t *result)
1939{
1940 size_t tmp;
1941
1942 /* Use CMSG_SPACE(1) here in order to take account of the padding
1943 necessary before *and* after the data. */
1944 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1945 return 0;
1946 tmp = CMSG_SPACE(length);
1947 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1948 return 0;
1949 *result = tmp;
1950 return 1;
1951}
1952#endif
1953
1954/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1955 pointer in msg->msg_control with at least "space" bytes after it,
1956 and its cmsg_len member inside the buffer. */
1957static int
1958cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1959{
1960 size_t cmsg_offset;
1961 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1962 sizeof(cmsgh->cmsg_len));
1963
Charles-François Natali466517d2011-08-28 18:23:43 +02001964 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001965 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001966 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001967 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1968 annoying under OS X as it's unsigned there and so it triggers a
1969 tautological comparison warning under Clang when compared against 0.
1970 Since the check is valid on other platforms, silence the warning under
1971 Clang. */
1972 #ifdef __clang__
1973 #pragma clang diagnostic push
1974 #pragma clang diagnostic ignored "-Wtautological-compare"
1975 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02001976 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02001977 #pragma GCC diagnostic push
1978 #pragma GCC diagnostic ignored "-Wtype-limits"
1979 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05001980 if (msg->msg_controllen < 0)
1981 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02001982 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02001983 #pragma GCC diagnostic pop
1984 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05001985 #ifdef __clang__
1986 #pragma clang diagnostic pop
1987 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001988 if (space < cmsg_len_end)
1989 space = cmsg_len_end;
1990 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1991 return (cmsg_offset <= (size_t)-1 - space &&
1992 cmsg_offset + space <= msg->msg_controllen);
1993}
1994
1995/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1996 *space to number of bytes following it in the buffer and return
1997 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1998 msg->msg_controllen are valid. */
1999static int
2000get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2001{
2002 size_t data_offset;
2003 char *data_ptr;
2004
2005 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2006 return 0;
2007 data_offset = data_ptr - (char *)msg->msg_control;
2008 if (data_offset > msg->msg_controllen)
2009 return 0;
2010 *space = msg->msg_controllen - data_offset;
2011 return 1;
2012}
2013
2014/* If cmsgh is invalid or not contained in the buffer pointed to by
2015 msg->msg_control, return -1. If cmsgh is valid and its associated
2016 data is entirely contained in the buffer, set *data_len to the
2017 length of the associated data and return 0. If only part of the
2018 associated data is contained in the buffer but cmsgh is otherwise
2019 valid, set *data_len to the length contained in the buffer and
2020 return 1. */
2021static int
2022get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2023{
2024 size_t space, cmsg_data_len;
2025
2026 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2027 cmsgh->cmsg_len < CMSG_LEN(0))
2028 return -1;
2029 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2030 if (!get_cmsg_data_space(msg, cmsgh, &space))
2031 return -1;
2032 if (space >= cmsg_data_len) {
2033 *data_len = cmsg_data_len;
2034 return 0;
2035 }
2036 *data_len = space;
2037 return 1;
2038}
2039#endif /* CMSG_LEN */
2040
2041
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002042/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002043
Guido van Rossum73624e91994-10-10 17:59:00 +00002044static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002045sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 sock_addr_t addrbuf;
2048 SOCKET_T newfd = INVALID_SOCKET;
2049 socklen_t addrlen;
2050 PyObject *sock = NULL;
2051 PyObject *addr = NULL;
2052 PyObject *res = NULL;
2053 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002054 int async_err = 0;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002055#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2056 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2057 static int accept4_works = -1;
2058#endif
2059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 if (!getsockaddrlen(s, &addrlen))
2061 return NULL;
2062 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002064 if (!IS_SELECTABLE(s))
2065 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002066
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002067 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002068 do {
2069 Py_BEGIN_ALLOW_THREADS
2070 timeout = internal_select_ex(s, 0, interval);
2071 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002072#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002073 if (accept4_works != 0) {
2074 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2075 SOCK_CLOEXEC);
2076 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2077 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2078 accept4_works = (errno != ENOSYS);
2079 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002080 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002081 if (accept4_works == 0)
2082 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002083#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002084 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002085#endif
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002086 }
2087 Py_END_ALLOW_THREADS
2088 } while (newfd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 if (timeout == 1) {
2090 PyErr_SetString(socket_timeout, "timed out");
2091 return NULL;
2092 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002093 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 if (newfd == INVALID_SOCKET)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002096 return (!async_err) ? s->errorhandler() : NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00002097
Victor Stinnerdaf45552013-08-28 00:53:59 +02002098#ifdef MS_WINDOWS
2099 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2100 PyErr_SetFromWindowsErr(0);
2101 SOCKETCLOSE(newfd);
2102 goto finally;
2103 }
2104#else
2105
2106#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2107 if (!accept4_works)
2108#endif
2109 {
2110 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2111 SOCKETCLOSE(newfd);
2112 goto finally;
2113 }
2114 }
2115#endif
2116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002117 sock = PyLong_FromSocket_t(newfd);
2118 if (sock == NULL) {
2119 SOCKETCLOSE(newfd);
2120 goto finally;
2121 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002123 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2124 addrlen, s->sock_proto);
2125 if (addr == NULL)
2126 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002129
Guido van Rossum67f7a382002-06-06 21:08:16 +00002130finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 Py_XDECREF(sock);
2132 Py_XDECREF(addr);
2133 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002134}
2135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002136PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002137"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002138\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002139Wait for an incoming connection. Return a new socket file descriptor\n\
2140representing the connection, and the address of the client.\n\
2141For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002142
Guido van Rossum11ba0942002-06-13 15:07:44 +00002143/* s.setblocking(flag) method. Argument:
2144 False -- non-blocking mode; same as settimeout(0)
2145 True -- blocking mode; same as settimeout(None)
2146*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002147
Guido van Rossum73624e91994-10-10 17:59:00 +00002148static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002149sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002150{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002151 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002153 block = PyLong_AsLong(arg);
2154 if (block == -1 && PyErr_Occurred())
2155 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002157 s->sock_timeout = block ? -1.0 : 0.0;
2158 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002160 Py_INCREF(Py_None);
2161 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002162}
Guido van Rossume4485b01994-09-07 14:32:49 +00002163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002164PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002165"setblocking(flag)\n\
2166\n\
2167Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002168setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002169setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002170
Guido van Rossum11ba0942002-06-13 15:07:44 +00002171/* s.settimeout(timeout) method. Argument:
2172 None -- no timeout, blocking mode; same as setblocking(True)
2173 0.0 -- non-blocking mode; same as setblocking(False)
2174 > 0 -- timeout mode; operations time out after timeout seconds
2175 < 0 -- illegal; raises an exception
2176*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002177static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002178sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002179{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002180 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 if (arg == Py_None)
2183 timeout = -1.0;
2184 else {
2185 timeout = PyFloat_AsDouble(arg);
2186 if (timeout < 0.0) {
2187 if (!PyErr_Occurred())
2188 PyErr_SetString(PyExc_ValueError,
2189 "Timeout value out of range");
2190 return NULL;
2191 }
2192 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002193
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002194 s->sock_timeout = timeout;
2195 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002197 Py_INCREF(Py_None);
2198 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002199}
2200
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002201PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002202"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002203\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002204Set a timeout on socket operations. 'timeout' can be a float,\n\
2205giving in seconds, or None. Setting a timeout of None disables\n\
2206the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002207Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002208
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002209/* s.gettimeout() method.
2210 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002211static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002212sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002214 if (s->sock_timeout < 0.0) {
2215 Py_INCREF(Py_None);
2216 return Py_None;
2217 }
2218 else
2219 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002220}
2221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002222PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002223"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002224\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002225Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002227operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002228
Guido van Rossumaee08791992-09-08 09:05:33 +00002229/* s.setsockopt() method.
2230 With an integer third argument, sets an integer option.
2231 With a string third argument, sets an option from a buffer;
2232 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002233
Guido van Rossum73624e91994-10-10 17:59:00 +00002234static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002235sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002236{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 int level;
2238 int optname;
2239 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002240 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002242
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002243 if (PyArg_ParseTuple(args, "iii:setsockopt",
2244 &level, &optname, &flag)) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002245 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 }
2247 else {
2248 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002249 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2250 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002252 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2253 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002254 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 if (res < 0)
2256 return s->errorhandler();
2257 Py_INCREF(Py_None);
2258 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002259}
2260
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002261PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002262"setsockopt(level, option, value)\n\
2263\n\
2264Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002265The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002266
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002267
Guido van Rossumaee08791992-09-08 09:05:33 +00002268/* s.getsockopt() method.
2269 With two arguments, retrieves an integer option.
2270 With a third integer argument, retrieves a string buffer of that size;
2271 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002272
Guido van Rossum73624e91994-10-10 17:59:00 +00002273static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002274sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 int level;
2277 int optname;
2278 int res;
2279 PyObject *buf;
2280 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2283 &level, &optname, &buflen))
2284 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002286 if (buflen == 0) {
2287 int flag = 0;
2288 socklen_t flagsize = sizeof flag;
2289 res = getsockopt(s->sock_fd, level, optname,
2290 (void *)&flag, &flagsize);
2291 if (res < 0)
2292 return s->errorhandler();
2293 return PyLong_FromLong(flag);
2294 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002296 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 "getsockopt buflen out of range");
2298 return NULL;
2299 }
2300 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2301 if (buf == NULL)
2302 return NULL;
2303 res = getsockopt(s->sock_fd, level, optname,
2304 (void *)PyBytes_AS_STRING(buf), &buflen);
2305 if (res < 0) {
2306 Py_DECREF(buf);
2307 return s->errorhandler();
2308 }
2309 _PyBytes_Resize(&buf, buflen);
2310 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002311}
2312
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002313PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002314"getsockopt(level, option[, buffersize]) -> value\n\
2315\n\
2316Get a socket option. See the Unix manual for level and option.\n\
2317If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002318string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002320
Fred Drake728819a2000-07-01 03:40:12 +00002321/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002322
Guido van Rossum73624e91994-10-10 17:59:00 +00002323static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002324sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002326 sock_addr_t addrbuf;
2327 int addrlen;
2328 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2331 return NULL;
2332 Py_BEGIN_ALLOW_THREADS
2333 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2334 Py_END_ALLOW_THREADS
2335 if (res < 0)
2336 return s->errorhandler();
2337 Py_INCREF(Py_None);
2338 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002339}
2340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002341PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002342"bind(address)\n\
2343\n\
2344Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002345pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002346sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002347
Guido van Rossum30a685f1991-06-27 15:51:29 +00002348
2349/* s.close() method.
2350 Set the file descriptor to -1 so operations tried subsequently
2351 will surely fail. */
2352
Guido van Rossum73624e91994-10-10 17:59:00 +00002353static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002354sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002356 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002357
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002358 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2359 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2360 * for more details.
2361 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 if ((fd = s->sock_fd) != -1) {
2363 s->sock_fd = -1;
2364 Py_BEGIN_ALLOW_THREADS
2365 (void) SOCKETCLOSE(fd);
2366 Py_END_ALLOW_THREADS
2367 }
2368 Py_INCREF(Py_None);
2369 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002370}
2371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002372PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002373"close()\n\
2374\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002375Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002376
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002377static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002378sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002379{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002380 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002381 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002382 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002383}
2384
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002385PyDoc_STRVAR(detach_doc,
2386"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002387\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002388Close the socket object without closing the underlying file descriptor.\n\
2389The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002390can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002391
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002392static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002393internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002396 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 timeout = 0;
2399 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002400
2401#ifdef MS_WINDOWS
2402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 if (s->sock_timeout > 0.0) {
2404 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2405 IS_SELECTABLE(s)) {
2406 /* This is a mess. Best solution: trust select */
2407 fd_set fds;
2408 fd_set fds_exc;
2409 struct timeval tv;
2410 tv.tv_sec = (int)s->sock_timeout;
2411 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2412 FD_ZERO(&fds);
2413 FD_SET(s->sock_fd, &fds);
2414 FD_ZERO(&fds_exc);
2415 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002416 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2417 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002418 if (res == 0) {
2419 res = WSAEWOULDBLOCK;
2420 timeout = 1;
2421 } else if (res > 0) {
2422 if (FD_ISSET(s->sock_fd, &fds))
2423 /* The socket is in the writable set - this
2424 means connected */
2425 res = 0;
2426 else {
2427 /* As per MS docs, we need to call getsockopt()
2428 to get the underlying error */
2429 int res_size = sizeof res;
2430 /* It must be in the exception set */
2431 assert(FD_ISSET(s->sock_fd, &fds_exc));
2432 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2433 (char *)&res, &res_size))
2434 /* getsockopt also clears WSAGetLastError,
2435 so reset it back. */
2436 WSASetLastError(res);
2437 else
2438 res = WSAGetLastError();
2439 }
2440 }
2441 /* else if (res < 0) an error occurred */
2442 }
2443 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002445 if (res < 0)
2446 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002447
2448#else
2449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 if (s->sock_timeout > 0.0) {
2451 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2452 timeout = internal_select(s, 1);
2453 if (timeout == 0) {
2454 /* Bug #1019808: in case of an EINPROGRESS,
2455 use getsockopt(SO_ERROR) to get the real
2456 error. */
2457 socklen_t res_size = sizeof res;
2458 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2459 SO_ERROR, &res, &res_size);
2460 if (res == EISCONN)
2461 res = 0;
2462 errno = res;
2463 }
2464 else if (timeout == -1) {
2465 res = errno; /* had error */
2466 }
2467 else
2468 res = EWOULDBLOCK; /* timed out */
2469 }
2470 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 if (res < 0)
2473 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002474
2475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002479}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002480
Fred Drake728819a2000-07-01 03:40:12 +00002481/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002482
Guido van Rossum73624e91994-10-10 17:59:00 +00002483static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002484sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002485{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002486 sock_addr_t addrbuf;
2487 int addrlen;
2488 int res;
2489 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2492 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002494 Py_BEGIN_ALLOW_THREADS
2495 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2496 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002498 if (timeout == 1) {
2499 PyErr_SetString(socket_timeout, "timed out");
2500 return NULL;
2501 }
2502 if (res != 0)
2503 return s->errorhandler();
2504 Py_INCREF(Py_None);
2505 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002506}
2507
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002508PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002509"connect(address)\n\
2510\n\
2511Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002512is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002513
Guido van Rossum30a685f1991-06-27 15:51:29 +00002514
Fred Drake728819a2000-07-01 03:40:12 +00002515/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002516
2517static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002518sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002520 sock_addr_t addrbuf;
2521 int addrlen;
2522 int res;
2523 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002525 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2526 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528 Py_BEGIN_ALLOW_THREADS
2529 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2530 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 /* Signals are not errors (though they may raise exceptions). Adapted
2533 from PyErr_SetFromErrnoWithFilenameObject(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 if (res == EINTR && PyErr_CheckSignals())
2535 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002538}
2539
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002540PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002541"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002542\n\
2543This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002544instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002545
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002546
Guido van Rossumed233a51992-06-23 09:07:03 +00002547/* s.fileno() method */
2548
Guido van Rossum73624e91994-10-10 17:59:00 +00002549static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002550sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002553}
2554
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002555PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002556"fileno() -> integer\n\
2557\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002558Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002559
Guido van Rossumed233a51992-06-23 09:07:03 +00002560
Guido van Rossumc89705d1992-11-26 08:54:07 +00002561/* s.getsockname() method */
2562
Guido van Rossum73624e91994-10-10 17:59:00 +00002563static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002564sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002565{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 sock_addr_t addrbuf;
2567 int res;
2568 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002570 if (!getsockaddrlen(s, &addrlen))
2571 return NULL;
2572 memset(&addrbuf, 0, addrlen);
2573 Py_BEGIN_ALLOW_THREADS
2574 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2575 Py_END_ALLOW_THREADS
2576 if (res < 0)
2577 return s->errorhandler();
2578 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2579 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002580}
2581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002582PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002583"getsockname() -> address info\n\
2584\n\
2585Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002586info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002587
Guido van Rossumc89705d1992-11-26 08:54:07 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002590/* s.getpeername() method */
2591
Guido van Rossum73624e91994-10-10 17:59:00 +00002592static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002593sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 sock_addr_t addrbuf;
2596 int res;
2597 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 if (!getsockaddrlen(s, &addrlen))
2600 return NULL;
2601 memset(&addrbuf, 0, addrlen);
2602 Py_BEGIN_ALLOW_THREADS
2603 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2604 Py_END_ALLOW_THREADS
2605 if (res < 0)
2606 return s->errorhandler();
2607 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2608 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002609}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002611PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002612"getpeername() -> address info\n\
2613\n\
2614Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002615info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002616
Guido van Rossumb6775db1994-08-01 11:34:53 +00002617#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002618
2619
Guido van Rossum30a685f1991-06-27 15:51:29 +00002620/* s.listen(n) method */
2621
Guido van Rossum73624e91994-10-10 17:59:00 +00002622static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002623sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002624{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002625 /* We try to choose a default backlog high enough to avoid connection drops
2626 * for common workloads, yet not too high to limit resource usage. */
2627 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002629
Charles-François Natali644b8f52014-05-22 19:45:39 +01002630 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002634 /* To avoid problems on systems that don't allow a negative backlog
2635 * (which doesn't make sense anyway) we force a minimum value of 0. */
2636 if (backlog < 0)
2637 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 res = listen(s->sock_fd, backlog);
2639 Py_END_ALLOW_THREADS
2640 if (res < 0)
2641 return s->errorhandler();
2642 Py_INCREF(Py_None);
2643 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002644}
2645
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002646PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002647"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002648\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002649Enable a server to accept connections. If backlog is specified, it must be\n\
2650at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002651unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002652connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002653
2654
Thomas Wouters477c8d52006-05-27 19:21:47 +00002655/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002656 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002657 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002658 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002659 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002660 * also possible that we return a number of bytes smaller than the request
2661 * bytes.
2662 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002663
Antoine Pitrou19467d22010-08-17 19:33:30 +00002664static Py_ssize_t
2665sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002666{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002667 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002669 int async_err = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 if (!IS_SELECTABLE(s)) {
2672 select_error();
2673 return -1;
2674 }
2675 if (len == 0) {
2676 /* If 0 bytes were requested, do nothing. */
2677 return 0;
2678 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002679
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002680 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002681 do {
2682 Py_BEGIN_ALLOW_THREADS
2683 timeout = internal_select_ex(s, 0, interval);
2684 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002685#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002686 if (len > INT_MAX)
2687 len = INT_MAX;
2688 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002689#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002690 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002691#endif
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002692 }
2693 Py_END_ALLOW_THREADS
2694 } while (outlen < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Thomas Wouters477c8d52006-05-27 19:21:47 +00002695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 if (timeout == 1) {
2697 PyErr_SetString(socket_timeout, "timed out");
2698 return -1;
2699 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002700 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 if (outlen < 0) {
2702 /* Note: the call to errorhandler() ALWAYS indirectly returned
2703 NULL, so ignore its return value */
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002704 if (!async_err)
2705 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 return -1;
2707 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002709}
2710
Guido van Rossum48a680c2001-03-02 06:34:14 +00002711
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002712/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002713
Guido van Rossum73624e91994-10-10 17:59:00 +00002714static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002715sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002716{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002717 Py_ssize_t recvlen, outlen;
2718 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002719 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002720
Antoine Pitrou19467d22010-08-17 19:33:30 +00002721 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 if (recvlen < 0) {
2725 PyErr_SetString(PyExc_ValueError,
2726 "negative buffersize in recv");
2727 return NULL;
2728 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 /* Allocate a new string. */
2731 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2732 if (buf == NULL)
2733 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 /* Call the guts */
2736 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2737 if (outlen < 0) {
2738 /* An error occurred, release the string and return an
2739 error. */
2740 Py_DECREF(buf);
2741 return NULL;
2742 }
2743 if (outlen != recvlen) {
2744 /* We did not read as many bytes as we anticipated, resize the
2745 string if possible and be successful. */
2746 _PyBytes_Resize(&buf, outlen);
2747 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002750}
2751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753"recv(buffersize[, flags]) -> data\n\
2754\n\
2755Receive up to buffersize bytes from the socket. For the optional flags\n\
2756argument, see the Unix manual. When no data is available, block until\n\
2757at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002758the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002759
Guido van Rossum30a685f1991-06-27 15:51:29 +00002760
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002761/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002762
Thomas Wouters477c8d52006-05-27 19:21:47 +00002763static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002764sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002767
Antoine Pitrou19467d22010-08-17 19:33:30 +00002768 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 Py_buffer pbuf;
2770 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002771 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002774 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 &pbuf, &recvlen, &flags))
2776 return NULL;
2777 buf = pbuf.buf;
2778 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002780 if (recvlen < 0) {
2781 PyBuffer_Release(&pbuf);
2782 PyErr_SetString(PyExc_ValueError,
2783 "negative buffersize in recv_into");
2784 return NULL;
2785 }
2786 if (recvlen == 0) {
2787 /* If nbytes was not specified, use the buffer's length */
2788 recvlen = buflen;
2789 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 /* Check if the buffer is large enough */
2792 if (buflen < recvlen) {
2793 PyBuffer_Release(&pbuf);
2794 PyErr_SetString(PyExc_ValueError,
2795 "buffer too small for requested bytes");
2796 return NULL;
2797 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 /* Call the guts */
2800 readlen = sock_recv_guts(s, buf, recvlen, flags);
2801 if (readlen < 0) {
2802 /* Return an error. */
2803 PyBuffer_Release(&pbuf);
2804 return NULL;
2805 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 PyBuffer_Release(&pbuf);
2808 /* Return the number of bytes read. Note that we do not do anything
2809 special here in the case that readlen < recvlen. */
2810 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002811}
2812
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002813PyDoc_STRVAR(recv_into_doc,
2814"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002815\n\
2816A version of recv() that stores its data into a buffer rather than creating \n\
2817a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2818is not specified (or 0), receive up to the size available in the given buffer.\n\
2819\n\
2820See recv() for documentation about the flags.");
2821
2822
2823/*
Christian Heimes99170a52007-12-19 02:07:34 +00002824 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2825 * into a char buffer. If you have any inc/def ref to do to the objects that
2826 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002827 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002828 * that it is also possible that we return a number of bytes smaller than the
2829 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002830 *
2831 * 'addr' is a return value for the address object. Note that you must decref
2832 * it yourself.
2833 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002834static Py_ssize_t
2835sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 sock_addr_t addrbuf;
2839 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002840 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 socklen_t addrlen;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002842 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 if (!getsockaddrlen(s, &addrlen))
2847 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (!IS_SELECTABLE(s)) {
2850 select_error();
2851 return -1;
2852 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002853
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002854 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002855 do {
2856 Py_BEGIN_ALLOW_THREADS
2857 memset(&addrbuf, 0, addrlen);
2858 timeout = internal_select_ex(s, 0, interval);
2859 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002860#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002861 if (len > INT_MAX)
2862 len = INT_MAX;
2863 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
2864 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002865#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002866 n = recvfrom(s->sock_fd, cbuf, len, flags,
2867 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002868#endif
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002869 }
2870 Py_END_ALLOW_THREADS
2871 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 if (timeout == 1) {
2874 PyErr_SetString(socket_timeout, "timed out");
2875 return -1;
2876 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002877 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 if (n < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002879 if (!async_err)
2880 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 return -1;
2882 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2885 addrlen, s->sock_proto)))
2886 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002889}
2890
2891/* s.recvfrom(nbytes [,flags]) method */
2892
2893static PyObject *
2894sock_recvfrom(PySocketSockObject *s, PyObject *args)
2895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 PyObject *buf = NULL;
2897 PyObject *addr = NULL;
2898 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002899 int flags = 0;
2900 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002901
Antoine Pitrou19467d22010-08-17 19:33:30 +00002902 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 if (recvlen < 0) {
2906 PyErr_SetString(PyExc_ValueError,
2907 "negative buffersize in recvfrom");
2908 return NULL;
2909 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2912 if (buf == NULL)
2913 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2916 recvlen, flags, &addr);
2917 if (outlen < 0) {
2918 goto finally;
2919 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 if (outlen != recvlen) {
2922 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002923 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002925 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 goto finally;
2927 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002930
2931finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 Py_XDECREF(buf);
2933 Py_XDECREF(addr);
2934 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002935}
2936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002937PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002938"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2939\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002940Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002941
Thomas Wouters477c8d52006-05-27 19:21:47 +00002942
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002943/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002944
2945static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002946sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002947{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002949
Antoine Pitrou19467d22010-08-17 19:33:30 +00002950 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 Py_buffer pbuf;
2952 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002953 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956
Antoine Pitrou19467d22010-08-17 19:33:30 +00002957 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 kwlist, &pbuf,
2959 &recvlen, &flags))
2960 return NULL;
2961 buf = pbuf.buf;
2962 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 if (recvlen < 0) {
2965 PyBuffer_Release(&pbuf);
2966 PyErr_SetString(PyExc_ValueError,
2967 "negative buffersize in recvfrom_into");
2968 return NULL;
2969 }
2970 if (recvlen == 0) {
2971 /* If nbytes was not specified, use the buffer's length */
2972 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05002973 } else if (recvlen > buflen) {
2974 PyBuffer_Release(&pbuf);
2975 PyErr_SetString(PyExc_ValueError,
2976 "nbytes is greater than the length of the buffer");
2977 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002979
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002980 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2981 if (readlen < 0) {
2982 PyBuffer_Release(&pbuf);
2983 /* Return an error */
2984 Py_XDECREF(addr);
2985 return NULL;
2986 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 PyBuffer_Release(&pbuf);
2989 /* Return the number of bytes read and the address. Note that we do
2990 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002991 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002992}
2993
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002994PyDoc_STRVAR(recvfrom_into_doc,
2995"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002996\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002997Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002998
2999
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003000/* The sendmsg() and recvmsg[_into]() methods require a working
3001 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3002#ifdef CMSG_LEN
3003/*
3004 * Call recvmsg() with the supplied iovec structures, flags, and
3005 * ancillary data buffer size (controllen). Returns the tuple return
3006 * value for recvmsg() or recvmsg_into(), with the first item provided
3007 * by the supplied makeval() function. makeval() will be called with
3008 * the length read and makeval_data as arguments, and must return a
3009 * new reference (which will be decrefed if there is a subsequent
3010 * error). On error, closes any file descriptors received via
3011 * SCM_RIGHTS.
3012 */
3013static PyObject *
3014sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3015 int flags, Py_ssize_t controllen,
3016 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3017{
3018 ssize_t bytes_received = -1;
3019 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003020 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003021 sock_addr_t addrbuf;
3022 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003023 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003024 PyObject *cmsg_list = NULL, *retval = NULL;
3025 void *controlbuf = NULL;
3026 struct cmsghdr *cmsgh;
3027 size_t cmsgdatalen = 0;
3028 int cmsg_status;
3029
3030 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3031 ignored" when the socket is connected (Linux fills them in
3032 anyway for AF_UNIX sockets at least). Normally msg_namelen
3033 seems to be set to 0 if there's no address, but try to
3034 initialize msg_name to something that won't be mistaken for a
3035 real address if that doesn't happen. */
3036 if (!getsockaddrlen(s, &addrbuflen))
3037 return NULL;
3038 memset(&addrbuf, 0, addrbuflen);
3039 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3040
3041 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3042 PyErr_SetString(PyExc_ValueError,
3043 "invalid ancillary data buffer length");
3044 return NULL;
3045 }
3046 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3047 return PyErr_NoMemory();
3048
3049 /* Make the system call. */
3050 if (!IS_SELECTABLE(s)) {
3051 select_error();
3052 goto finally;
3053 }
3054
3055 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003056 do {
3057 Py_BEGIN_ALLOW_THREADS;
3058 msg.msg_name = SAS2SA(&addrbuf);
3059 msg.msg_namelen = addrbuflen;
3060 msg.msg_iov = iov;
3061 msg.msg_iovlen = iovlen;
3062 msg.msg_control = controlbuf;
3063 msg.msg_controllen = controllen;
3064 timeout = internal_select_ex(s, 0, interval);
3065 if (!timeout)
3066 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3067 Py_END_ALLOW_THREADS;
3068 if (timeout == 1) {
3069 PyErr_SetString(socket_timeout, "timed out");
3070 goto finally;
3071 }
3072 } while (bytes_received < 0 && errno == EINTR &&
3073 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003074 END_SELECT_LOOP(s)
3075
3076 if (bytes_received < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003077 if (!async_err)
3078 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003079 goto finally;
3080 }
3081
3082 /* Make list of (level, type, data) tuples from control messages. */
3083 if ((cmsg_list = PyList_New(0)) == NULL)
3084 goto err_closefds;
3085 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3086 implementations didn't do so. */
3087 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3088 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3089 PyObject *bytes, *tuple;
3090 int tmp;
3091
3092 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3093 if (cmsg_status != 0) {
3094 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3095 "received malformed or improperly-truncated "
3096 "ancillary data", 1) == -1)
3097 goto err_closefds;
3098 }
3099 if (cmsg_status < 0)
3100 break;
3101 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003102 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003103 goto err_closefds;
3104 }
3105
3106 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3107 cmsgdatalen);
3108 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3109 (int)cmsgh->cmsg_type, bytes);
3110 if (tuple == NULL)
3111 goto err_closefds;
3112 tmp = PyList_Append(cmsg_list, tuple);
3113 Py_DECREF(tuple);
3114 if (tmp != 0)
3115 goto err_closefds;
3116
3117 if (cmsg_status != 0)
3118 break;
3119 }
3120
3121 retval = Py_BuildValue("NOiN",
3122 (*makeval)(bytes_received, makeval_data),
3123 cmsg_list,
3124 (int)msg.msg_flags,
3125 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3126 ((msg.msg_namelen > addrbuflen) ?
3127 addrbuflen : msg.msg_namelen),
3128 s->sock_proto));
3129 if (retval == NULL)
3130 goto err_closefds;
3131
3132finally:
3133 Py_XDECREF(cmsg_list);
3134 PyMem_Free(controlbuf);
3135 return retval;
3136
3137err_closefds:
3138#ifdef SCM_RIGHTS
3139 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3140 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3141 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3142 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3143 if (cmsg_status < 0)
3144 break;
3145 if (cmsgh->cmsg_level == SOL_SOCKET &&
3146 cmsgh->cmsg_type == SCM_RIGHTS) {
3147 size_t numfds;
3148 int *fdp;
3149
3150 numfds = cmsgdatalen / sizeof(int);
3151 fdp = (int *)CMSG_DATA(cmsgh);
3152 while (numfds-- > 0)
3153 close(*fdp++);
3154 }
3155 if (cmsg_status != 0)
3156 break;
3157 }
3158#endif /* SCM_RIGHTS */
3159 goto finally;
3160}
3161
3162
3163static PyObject *
3164makeval_recvmsg(ssize_t received, void *data)
3165{
3166 PyObject **buf = data;
3167
3168 if (received < PyBytes_GET_SIZE(*buf))
3169 _PyBytes_Resize(buf, received);
3170 Py_XINCREF(*buf);
3171 return *buf;
3172}
3173
3174/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3175
3176static PyObject *
3177sock_recvmsg(PySocketSockObject *s, PyObject *args)
3178{
3179 Py_ssize_t bufsize, ancbufsize = 0;
3180 int flags = 0;
3181 struct iovec iov;
3182 PyObject *buf = NULL, *retval = NULL;
3183
3184 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3185 return NULL;
3186
3187 if (bufsize < 0) {
3188 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3189 return NULL;
3190 }
3191 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3192 return NULL;
3193 iov.iov_base = PyBytes_AS_STRING(buf);
3194 iov.iov_len = bufsize;
3195
3196 /* Note that we're passing a pointer to *our pointer* to the bytes
3197 object here (&buf); makeval_recvmsg() may incref the object, or
3198 deallocate it and set our pointer to NULL. */
3199 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3200 &makeval_recvmsg, &buf);
3201 Py_XDECREF(buf);
3202 return retval;
3203}
3204
3205PyDoc_STRVAR(recvmsg_doc,
3206"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3207\n\
3208Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3209socket. The ancbufsize argument sets the size in bytes of the\n\
3210internal buffer used to receive the ancillary data; it defaults to 0,\n\
3211meaning that no ancillary data will be received. Appropriate buffer\n\
3212sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3213CMSG_LEN(), and items which do not fit into the buffer might be\n\
3214truncated or discarded. The flags argument defaults to 0 and has the\n\
3215same meaning as for recv().\n\
3216\n\
3217The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3218The data item is a bytes object holding the non-ancillary data\n\
3219received. The ancdata item is a list of zero or more tuples\n\
3220(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3221(control messages) received: cmsg_level and cmsg_type are integers\n\
3222specifying the protocol level and protocol-specific type respectively,\n\
3223and cmsg_data is a bytes object holding the associated data. The\n\
3224msg_flags item is the bitwise OR of various flags indicating\n\
3225conditions on the received message; see your system documentation for\n\
3226details. If the receiving socket is unconnected, address is the\n\
3227address of the sending socket, if available; otherwise, its value is\n\
3228unspecified.\n\
3229\n\
3230If recvmsg() raises an exception after the system call returns, it\n\
3231will first attempt to close any file descriptors received via the\n\
3232SCM_RIGHTS mechanism.");
3233
3234
3235static PyObject *
3236makeval_recvmsg_into(ssize_t received, void *data)
3237{
3238 return PyLong_FromSsize_t(received);
3239}
3240
3241/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3242
3243static PyObject *
3244sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3245{
3246 Py_ssize_t ancbufsize = 0;
3247 int flags = 0;
3248 struct iovec *iovs = NULL;
3249 Py_ssize_t i, nitems, nbufs = 0;
3250 Py_buffer *bufs = NULL;
3251 PyObject *buffers_arg, *fast, *retval = NULL;
3252
3253 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3254 &buffers_arg, &ancbufsize, &flags))
3255 return NULL;
3256
3257 if ((fast = PySequence_Fast(buffers_arg,
3258 "recvmsg_into() argument 1 must be an "
3259 "iterable")) == NULL)
3260 return NULL;
3261 nitems = PySequence_Fast_GET_SIZE(fast);
3262 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003263 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003264 goto finally;
3265 }
3266
3267 /* Fill in an iovec for each item, and save the Py_buffer
3268 structs to release afterwards. */
3269 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3270 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3271 PyErr_NoMemory();
3272 goto finally;
3273 }
3274 for (; nbufs < nitems; nbufs++) {
3275 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3276 "w*;recvmsg_into() argument 1 must be an iterable "
3277 "of single-segment read-write buffers",
3278 &bufs[nbufs]))
3279 goto finally;
3280 iovs[nbufs].iov_base = bufs[nbufs].buf;
3281 iovs[nbufs].iov_len = bufs[nbufs].len;
3282 }
3283
3284 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3285 &makeval_recvmsg_into, NULL);
3286finally:
3287 for (i = 0; i < nbufs; i++)
3288 PyBuffer_Release(&bufs[i]);
3289 PyMem_Free(bufs);
3290 PyMem_Free(iovs);
3291 Py_DECREF(fast);
3292 return retval;
3293}
3294
3295PyDoc_STRVAR(recvmsg_into_doc,
3296"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3297\n\
3298Receive normal data and ancillary data from the socket, scattering the\n\
3299non-ancillary data into a series of buffers. The buffers argument\n\
3300must be an iterable of objects that export writable buffers\n\
3301(e.g. bytearray objects); these will be filled with successive chunks\n\
3302of the non-ancillary data until it has all been written or there are\n\
3303no more buffers. The ancbufsize argument sets the size in bytes of\n\
3304the internal buffer used to receive the ancillary data; it defaults to\n\
33050, meaning that no ancillary data will be received. Appropriate\n\
3306buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3307or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3308truncated or discarded. The flags argument defaults to 0 and has the\n\
3309same meaning as for recv().\n\
3310\n\
3311The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3312The nbytes item is the total number of bytes of non-ancillary data\n\
3313written into the buffers. The ancdata item is a list of zero or more\n\
3314tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3315data (control messages) received: cmsg_level and cmsg_type are\n\
3316integers specifying the protocol level and protocol-specific type\n\
3317respectively, and cmsg_data is a bytes object holding the associated\n\
3318data. The msg_flags item is the bitwise OR of various flags\n\
3319indicating conditions on the received message; see your system\n\
3320documentation for details. If the receiving socket is unconnected,\n\
3321address is the address of the sending socket, if available; otherwise,\n\
3322its value is unspecified.\n\
3323\n\
3324If recvmsg_into() raises an exception after the system call returns,\n\
3325it will first attempt to close any file descriptors received via the\n\
3326SCM_RIGHTS mechanism.");
3327#endif /* CMSG_LEN */
3328
3329
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003330/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003331
Guido van Rossum73624e91994-10-10 17:59:00 +00003332static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003333sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003335 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003336 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003337 int async_err = 0;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003338 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003339 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3342 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003344 if (!IS_SELECTABLE(s)) {
3345 PyBuffer_Release(&pbuf);
3346 return select_error();
3347 }
3348 buf = pbuf.buf;
3349 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003350
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003351 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003352 do {
3353 Py_BEGIN_ALLOW_THREADS
3354 timeout = internal_select_ex(s, 1, interval);
3355 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003356#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003357 if (len > INT_MAX)
3358 len = INT_MAX;
3359 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003360#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003361 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003362#endif
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003363 }
3364 Py_END_ALLOW_THREADS
3365 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003367 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 PyErr_SetString(socket_timeout, "timed out");
3369 return NULL;
3370 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003371 END_SELECT_LOOP(s)
3372
3373 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003374 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003375 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003376 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003377}
3378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003379PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003380"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003381\n\
3382Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003383argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003384sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003385
3386
3387/* s.sendall(data [,flags]) method */
3388
3389static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003390sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003391{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003392 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003393 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003394 int async_err = 0;
3395 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003396 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003398 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3399 return NULL;
3400 buf = pbuf.buf;
3401 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 if (!IS_SELECTABLE(s)) {
3404 PyBuffer_Release(&pbuf);
3405 return select_error();
3406 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003409 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003410 timeout = internal_select(s, 1);
3411 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003412 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003413#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003414 if (len > INT_MAX)
3415 len = INT_MAX;
3416 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003417#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003418 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003419#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003420 }
3421 Py_END_ALLOW_THREADS
3422 if (timeout == 1) {
3423 PyBuffer_Release(&pbuf);
3424 PyErr_SetString(socket_timeout, "timed out");
3425 return NULL;
3426 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003427 if (n >= 0) {
3428 buf += n;
3429 len -= n;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003430 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003431 } while (len > 0 && (n >= 0 || errno == EINTR) &&
3432 !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003433 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003434
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003435 if (n < 0 || async_err)
3436 return (!async_err) ? s->errorhandler() : NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 Py_INCREF(Py_None);
3439 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003440}
3441
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003442PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003443"sendall(data[, flags])\n\
3444\n\
3445Send a data string to the socket. For the optional flags\n\
3446argument, see the Unix manual. This calls send() repeatedly\n\
3447until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003448to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003449
Guido van Rossum30a685f1991-06-27 15:51:29 +00003450
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003451/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003452
Guido van Rossum73624e91994-10-10 17:59:00 +00003453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003454sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 Py_buffer pbuf;
3457 PyObject *addro;
3458 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003459 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 sock_addr_t addrbuf;
3461 int addrlen, n = -1, flags, timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003462 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003465 arglen = PyTuple_Size(args);
3466 switch (arglen) {
3467 case 2:
3468 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3469 break;
3470 case 3:
3471 PyArg_ParseTuple(args, "y*iO:sendto",
3472 &pbuf, &flags, &addro);
3473 break;
3474 default:
3475 PyErr_Format(PyExc_TypeError,
3476 "sendto() takes 2 or 3 arguments (%d given)",
3477 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003478 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003480 if (PyErr_Occurred())
3481 return NULL;
3482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 buf = pbuf.buf;
3484 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003486 if (!IS_SELECTABLE(s)) {
3487 PyBuffer_Release(&pbuf);
3488 return select_error();
3489 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3492 PyBuffer_Release(&pbuf);
3493 return NULL;
3494 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003495
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003496 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003497 do {
3498 Py_BEGIN_ALLOW_THREADS
3499 timeout = internal_select_ex(s, 1, interval);
3500 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003501#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003502 if (len > INT_MAX)
3503 len = INT_MAX;
3504 n = sendto(s->sock_fd, buf, (int)len, flags,
3505 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003506#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003507 n = sendto(s->sock_fd, buf, len, flags,
3508 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003509#endif
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003510 }
3511 Py_END_ALLOW_THREADS
3512 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003515 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 PyErr_SetString(socket_timeout, "timed out");
3517 return NULL;
3518 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003519 END_SELECT_LOOP(s)
3520 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003521 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003522 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003523 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003524}
3525
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003526PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003527"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003528\n\
3529Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003530For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003531
Guido van Rossum30a685f1991-06-27 15:51:29 +00003532
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003533/* The sendmsg() and recvmsg[_into]() methods require a working
3534 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3535#ifdef CMSG_LEN
3536/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3537
3538static PyObject *
3539sock_sendmsg(PySocketSockObject *s, PyObject *args)
3540{
3541 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3542 Py_buffer *databufs = NULL;
3543 struct iovec *iovs = NULL;
3544 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003545 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003546 struct cmsginfo {
3547 int level;
3548 int type;
3549 Py_buffer data;
3550 } *cmsgs = NULL;
3551 void *controlbuf = NULL;
3552 size_t controllen, controllen_last;
3553 ssize_t bytes_sent = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003554 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003555 int addrlen, timeout, flags = 0;
3556 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3557 *cmsg_fast = NULL, *retval = NULL;
3558
3559 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3560 &data_arg, &cmsg_arg, &flags, &addr_arg))
3561 return NULL;
3562
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003563 /* Parse destination address. */
3564 if (addr_arg != NULL && addr_arg != Py_None) {
3565 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3566 goto finally;
3567 msg.msg_name = &addrbuf;
3568 msg.msg_namelen = addrlen;
3569 }
3570
3571 /* Fill in an iovec for each message part, and save the Py_buffer
3572 structs to release afterwards. */
3573 if ((data_fast = PySequence_Fast(data_arg,
3574 "sendmsg() argument 1 must be an "
3575 "iterable")) == NULL)
3576 goto finally;
3577 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3578 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003579 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003580 goto finally;
3581 }
3582 msg.msg_iovlen = ndataparts;
3583 if (ndataparts > 0 &&
3584 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3585 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3586 PyErr_NoMemory();
3587 goto finally;
3588 }
3589 for (; ndatabufs < ndataparts; ndatabufs++) {
3590 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3591 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003592 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003593 &databufs[ndatabufs]))
3594 goto finally;
3595 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3596 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3597 }
3598
3599 if (cmsg_arg == NULL)
3600 ncmsgs = 0;
3601 else {
3602 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3603 "sendmsg() argument 2 must be an "
3604 "iterable")) == NULL)
3605 goto finally;
3606 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3607 }
3608
3609#ifndef CMSG_SPACE
3610 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003611 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003612 "sending multiple control messages is not supported "
3613 "on this system");
3614 goto finally;
3615 }
3616#endif
3617 /* Save level, type and Py_buffer for each control message,
3618 and calculate total size. */
3619 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3620 PyErr_NoMemory();
3621 goto finally;
3622 }
3623 controllen = controllen_last = 0;
3624 while (ncmsgbufs < ncmsgs) {
3625 size_t bufsize, space;
3626
3627 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3628 "(iiy*):[sendmsg() ancillary data items]",
3629 &cmsgs[ncmsgbufs].level,
3630 &cmsgs[ncmsgbufs].type,
3631 &cmsgs[ncmsgbufs].data))
3632 goto finally;
3633 bufsize = cmsgs[ncmsgbufs++].data.len;
3634
3635#ifdef CMSG_SPACE
3636 if (!get_CMSG_SPACE(bufsize, &space)) {
3637#else
3638 if (!get_CMSG_LEN(bufsize, &space)) {
3639#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003640 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003641 goto finally;
3642 }
3643 controllen += space;
3644 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003645 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003646 goto finally;
3647 }
3648 controllen_last = controllen;
3649 }
3650
3651 /* Construct ancillary data block from control message info. */
3652 if (ncmsgbufs > 0) {
3653 struct cmsghdr *cmsgh = NULL;
3654
3655 if ((msg.msg_control = controlbuf =
3656 PyMem_Malloc(controllen)) == NULL) {
3657 PyErr_NoMemory();
3658 goto finally;
3659 }
3660 msg.msg_controllen = controllen;
3661
3662 /* Need to zero out the buffer as a workaround for glibc's
3663 CMSG_NXTHDR() implementation. After getting the pointer to
3664 the next header, it checks its (uninitialized) cmsg_len
3665 member to see if the "message" fits in the buffer, and
3666 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003667 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003668 memset(controlbuf, 0, controllen);
3669
3670 for (i = 0; i < ncmsgbufs; i++) {
3671 size_t msg_len, data_len = cmsgs[i].data.len;
3672 int enough_space = 0;
3673
3674 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3675 if (cmsgh == NULL) {
3676 PyErr_Format(PyExc_RuntimeError,
3677 "unexpected NULL result from %s()",
3678 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3679 goto finally;
3680 }
3681 if (!get_CMSG_LEN(data_len, &msg_len)) {
3682 PyErr_SetString(PyExc_RuntimeError,
3683 "item size out of range for CMSG_LEN()");
3684 goto finally;
3685 }
3686 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3687 size_t space;
3688
3689 cmsgh->cmsg_len = msg_len;
3690 if (get_cmsg_data_space(&msg, cmsgh, &space))
3691 enough_space = (space >= data_len);
3692 }
3693 if (!enough_space) {
3694 PyErr_SetString(PyExc_RuntimeError,
3695 "ancillary data does not fit in calculated "
3696 "space");
3697 goto finally;
3698 }
3699 cmsgh->cmsg_level = cmsgs[i].level;
3700 cmsgh->cmsg_type = cmsgs[i].type;
3701 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3702 }
3703 }
3704
3705 /* Make the system call. */
3706 if (!IS_SELECTABLE(s)) {
3707 select_error();
3708 goto finally;
3709 }
3710
3711 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003712 do {
3713 Py_BEGIN_ALLOW_THREADS;
3714 timeout = internal_select_ex(s, 1, interval);
3715 if (!timeout)
3716 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3717 Py_END_ALLOW_THREADS;
3718 if (timeout == 1) {
3719 PyErr_SetString(socket_timeout, "timed out");
3720 goto finally;
3721 }
3722 } while (bytes_sent < 0 && errno == EINTR &&
3723 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003724 END_SELECT_LOOP(s)
3725
3726 if (bytes_sent < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003727 if (!async_err)
3728 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003729 goto finally;
3730 }
3731 retval = PyLong_FromSsize_t(bytes_sent);
3732
3733finally:
3734 PyMem_Free(controlbuf);
3735 for (i = 0; i < ncmsgbufs; i++)
3736 PyBuffer_Release(&cmsgs[i].data);
3737 PyMem_Free(cmsgs);
3738 Py_XDECREF(cmsg_fast);
3739 for (i = 0; i < ndatabufs; i++)
3740 PyBuffer_Release(&databufs[i]);
3741 PyMem_Free(databufs);
3742 PyMem_Free(iovs);
3743 Py_XDECREF(data_fast);
3744 return retval;
3745}
3746
3747PyDoc_STRVAR(sendmsg_doc,
3748"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3749\n\
3750Send normal and ancillary data to the socket, gathering the\n\
3751non-ancillary data from a series of buffers and concatenating it into\n\
3752a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003753data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003754The ancdata argument specifies the ancillary data (control messages)\n\
3755as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3756cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3757protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003758is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003759argument defaults to 0 and has the same meaning as for send(). If\n\
3760address is supplied and not None, it sets a destination address for\n\
3761the message. The return value is the number of bytes of non-ancillary\n\
3762data sent.");
3763#endif /* CMSG_LEN */
3764
3765
Guido van Rossum30a685f1991-06-27 15:51:29 +00003766/* s.shutdown(how) method */
3767
Guido van Rossum73624e91994-10-10 17:59:00 +00003768static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003769sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003770{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003771 int how;
3772 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003773
Serhiy Storchaka78980432013-01-15 01:12:17 +02003774 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 if (how == -1 && PyErr_Occurred())
3776 return NULL;
3777 Py_BEGIN_ALLOW_THREADS
3778 res = shutdown(s->sock_fd, how);
3779 Py_END_ALLOW_THREADS
3780 if (res < 0)
3781 return s->errorhandler();
3782 Py_INCREF(Py_None);
3783 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003784}
3785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003786PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003787"shutdown(flag)\n\
3788\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003789Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3790of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003791
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003792#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003793static PyObject*
3794sock_ioctl(PySocketSockObject *s, PyObject *arg)
3795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003796 unsigned long cmd = SIO_RCVALL;
3797 PyObject *argO;
3798 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003800 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3801 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003803 switch (cmd) {
3804 case SIO_RCVALL: {
3805 unsigned int option = RCVALL_ON;
3806 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3807 return NULL;
3808 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3809 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3810 return set_error();
3811 }
3812 return PyLong_FromUnsignedLong(recv); }
3813 case SIO_KEEPALIVE_VALS: {
3814 struct tcp_keepalive ka;
3815 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3816 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3817 return NULL;
3818 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3819 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3820 return set_error();
3821 }
3822 return PyLong_FromUnsignedLong(recv); }
3823 default:
3824 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3825 return NULL;
3826 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003827}
3828PyDoc_STRVAR(sock_ioctl_doc,
3829"ioctl(cmd, option) -> long\n\
3830\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003831Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3832SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3833SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003834#endif
3835
3836#if defined(MS_WINDOWS)
3837static PyObject*
3838sock_share(PySocketSockObject *s, PyObject *arg)
3839{
3840 WSAPROTOCOL_INFO info;
3841 DWORD processId;
3842 int result;
3843
3844 if (!PyArg_ParseTuple(arg, "I", &processId))
3845 return NULL;
3846
3847 Py_BEGIN_ALLOW_THREADS
3848 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3849 Py_END_ALLOW_THREADS
3850 if (result == SOCKET_ERROR)
3851 return set_error();
3852 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3853}
3854PyDoc_STRVAR(sock_share_doc,
3855"share(process_id) -> bytes\n\
3856\n\
3857Share the socket with another process. The target process id\n\
3858must be provided and the resulting bytes object passed to the target\n\
3859process. There the shared socket can be instantiated by calling\n\
3860socket.fromshare().");
3861
Christian Heimesfaf2f632008-01-06 16:59:19 +00003862
3863#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003864
3865/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003866
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003867static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3869 accept_doc},
3870 {"bind", (PyCFunction)sock_bind, METH_O,
3871 bind_doc},
3872 {"close", (PyCFunction)sock_close, METH_NOARGS,
3873 close_doc},
3874 {"connect", (PyCFunction)sock_connect, METH_O,
3875 connect_doc},
3876 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3877 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003878 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3879 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003880 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3881 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003882#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003883 {"getpeername", (PyCFunction)sock_getpeername,
3884 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003886 {"getsockname", (PyCFunction)sock_getsockname,
3887 METH_NOARGS, getsockname_doc},
3888 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3889 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003890#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3892 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003893#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003894#if defined(MS_WINDOWS)
3895 {"share", (PyCFunction)sock_share, METH_VARARGS,
3896 sock_share_doc},
3897#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003898 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 listen_doc},
3900 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3901 recv_doc},
3902 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3903 recv_into_doc},
3904 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3905 recvfrom_doc},
3906 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3907 recvfrom_into_doc},
3908 {"send", (PyCFunction)sock_send, METH_VARARGS,
3909 send_doc},
3910 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3911 sendall_doc},
3912 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3913 sendto_doc},
3914 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3915 setblocking_doc},
3916 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3917 settimeout_doc},
3918 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3919 gettimeout_doc},
3920 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3921 setsockopt_doc},
3922 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3923 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003924#ifdef CMSG_LEN
3925 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3926 recvmsg_doc},
3927 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3928 recvmsg_into_doc,},
3929 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3930 sendmsg_doc},
3931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003932 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003933};
3934
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003935/* SockObject members */
3936static PyMemberDef sock_memberlist[] = {
3937 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3938 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3939 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3940 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3941 {0},
3942};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003943
Guido van Rossum73624e91994-10-10 17:59:00 +00003944/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003945 First close the file description. */
3946
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003947static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003948sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003949{
Antoine Pitroue033e062010-10-29 10:38:18 +00003950 if (s->sock_fd != -1) {
3951 PyObject *exc, *val, *tb;
3952 Py_ssize_t old_refcount = Py_REFCNT(s);
3953 ++Py_REFCNT(s);
3954 PyErr_Fetch(&exc, &val, &tb);
3955 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3956 "unclosed %R", s))
3957 /* Spurious errors can appear at shutdown */
3958 if (PyErr_ExceptionMatches(PyExc_Warning))
3959 PyErr_WriteUnraisable((PyObject *) s);
3960 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003962 Py_REFCNT(s) = old_refcount;
3963 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003965}
3966
Guido van Rossum30a685f1991-06-27 15:51:29 +00003967
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003968static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003969sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003970{
Victor Stinnere254e532014-07-26 14:36:55 +02003971 long sock_fd;
3972 /* On Windows, this test is needed because SOCKET_T is unsigned */
3973 if (s->sock_fd == INVALID_SOCKET) {
3974 sock_fd = -1;
3975 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003976#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02003977 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 /* this can occur on Win64, and actually there is a special
3979 ugly printf formatter for decimal pointer length integer
3980 printing, only bother if necessary*/
3981 PyErr_SetString(PyExc_OverflowError,
3982 "no printf formatter to display "
3983 "the socket descriptor in decimal");
3984 return NULL;
3985 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003986#endif
Victor Stinnere254e532014-07-26 14:36:55 +02003987 else
3988 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 return PyUnicode_FromFormat(
3990 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02003991 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003992 s->sock_type,
3993 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003994}
3995
3996
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003997/* Create a new, uninitialized socket object. */
3998
3999static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004000sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004002 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 new = type->tp_alloc(type, 0);
4005 if (new != NULL) {
4006 ((PySocketSockObject *)new)->sock_fd = -1;
4007 ((PySocketSockObject *)new)->sock_timeout = -1.0;
4008 ((PySocketSockObject *)new)->errorhandler = &set_error;
4009 }
4010 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004011}
4012
4013
4014/* Initialize a new socket object. */
4015
Victor Stinnerdaf45552013-08-28 00:53:59 +02004016#ifdef SOCK_CLOEXEC
4017/* socket() and socketpair() fail with EINVAL on Linux kernel older
4018 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4019static int sock_cloexec_works = -1;
4020#endif
4021
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004022/*ARGSUSED*/
4023static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004024sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004025{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004026 PySocketSockObject *s = (PySocketSockObject *)self;
4027 PyObject *fdobj = NULL;
4028 SOCKET_T fd = INVALID_SOCKET;
4029 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4030 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004031#ifndef MS_WINDOWS
4032#ifdef SOCK_CLOEXEC
4033 int *atomic_flag_works = &sock_cloexec_works;
4034#else
4035 int *atomic_flag_works = NULL;
4036#endif
4037#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004039 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4040 "|iiiO:socket", keywords,
4041 &family, &type, &proto, &fdobj))
4042 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004045#ifdef MS_WINDOWS
4046 /* recreate a socket that was duplicated */
4047 if (PyBytes_Check(fdobj)) {
4048 WSAPROTOCOL_INFO info;
4049 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4050 PyErr_Format(PyExc_ValueError,
4051 "socket descriptor string has wrong size, "
4052 "should be %zu bytes.", sizeof(info));
4053 return -1;
4054 }
4055 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4056 Py_BEGIN_ALLOW_THREADS
4057 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4058 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4059 Py_END_ALLOW_THREADS
4060 if (fd == INVALID_SOCKET) {
4061 set_error();
4062 return -1;
4063 }
4064 family = info.iAddressFamily;
4065 type = info.iSocketType;
4066 proto = info.iProtocol;
4067 }
4068 else
4069#endif
4070 {
4071 fd = PyLong_AsSocket_t(fdobj);
4072 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4073 return -1;
4074 if (fd == INVALID_SOCKET) {
4075 PyErr_SetString(PyExc_ValueError,
4076 "can't use invalid socket value");
4077 return -1;
4078 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 }
4080 }
4081 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004082#ifdef MS_WINDOWS
4083 /* Windows implementation */
4084#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4085#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4086#endif
4087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004089 if (support_wsa_no_inherit) {
4090 fd = WSASocket(family, type, proto,
4091 NULL, 0,
4092 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4093 if (fd == INVALID_SOCKET) {
4094 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4095 support_wsa_no_inherit = 0;
4096 fd = socket(family, type, proto);
4097 }
4098 }
4099 else {
4100 fd = socket(family, type, proto);
4101 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004102 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 if (fd == INVALID_SOCKET) {
4105 set_error();
4106 return -1;
4107 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004108
4109 if (!support_wsa_no_inherit) {
4110 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4111 closesocket(fd);
4112 PyErr_SetFromWindowsErr(0);
4113 return -1;
4114 }
4115 }
4116#else
4117 /* UNIX */
4118 Py_BEGIN_ALLOW_THREADS
4119#ifdef SOCK_CLOEXEC
4120 if (sock_cloexec_works != 0) {
4121 fd = socket(family, type | SOCK_CLOEXEC, proto);
4122 if (sock_cloexec_works == -1) {
4123 if (fd >= 0) {
4124 sock_cloexec_works = 1;
4125 }
4126 else if (errno == EINVAL) {
4127 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4128 sock_cloexec_works = 0;
4129 fd = socket(family, type, proto);
4130 }
4131 }
4132 }
4133 else
4134#endif
4135 {
4136 fd = socket(family, type, proto);
4137 }
4138 Py_END_ALLOW_THREADS
4139
4140 if (fd == INVALID_SOCKET) {
4141 set_error();
4142 return -1;
4143 }
4144
4145 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4146 SOCKETCLOSE(fd);
4147 return -1;
4148 }
4149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 }
4151 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004154
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004155}
4156
4157
Guido van Rossumb6775db1994-08-01 11:34:53 +00004158/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004159
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004160static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4162 "_socket.socket", /* tp_name */
4163 sizeof(PySocketSockObject), /* tp_basicsize */
4164 0, /* tp_itemsize */
4165 (destructor)sock_dealloc, /* tp_dealloc */
4166 0, /* tp_print */
4167 0, /* tp_getattr */
4168 0, /* tp_setattr */
4169 0, /* tp_reserved */
4170 (reprfunc)sock_repr, /* tp_repr */
4171 0, /* tp_as_number */
4172 0, /* tp_as_sequence */
4173 0, /* tp_as_mapping */
4174 0, /* tp_hash */
4175 0, /* tp_call */
4176 0, /* tp_str */
4177 PyObject_GenericGetAttr, /* tp_getattro */
4178 0, /* tp_setattro */
4179 0, /* tp_as_buffer */
4180 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4181 sock_doc, /* tp_doc */
4182 0, /* tp_traverse */
4183 0, /* tp_clear */
4184 0, /* tp_richcompare */
4185 0, /* tp_weaklistoffset */
4186 0, /* tp_iter */
4187 0, /* tp_iternext */
4188 sock_methods, /* tp_methods */
4189 sock_memberlist, /* tp_members */
4190 0, /* tp_getset */
4191 0, /* tp_base */
4192 0, /* tp_dict */
4193 0, /* tp_descr_get */
4194 0, /* tp_descr_set */
4195 0, /* tp_dictoffset */
4196 sock_initobj, /* tp_init */
4197 PyType_GenericAlloc, /* tp_alloc */
4198 sock_new, /* tp_new */
4199 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004200};
4201
Guido van Rossum30a685f1991-06-27 15:51:29 +00004202
Guido van Rossum81194471991-07-27 21:42:02 +00004203/* Python interface to gethostname(). */
4204
4205/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004206static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004207socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004208{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004209#ifdef MS_WINDOWS
4210 /* Don't use winsock's gethostname, as this returns the ANSI
4211 version of the hostname, whereas we need a Unicode string.
4212 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004213 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004214 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004215 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004216 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004217
4218 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004219 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004220
4221 if (GetLastError() != ERROR_MORE_DATA)
4222 return PyErr_SetFromWindowsErr(0);
4223
4224 if (size == 0)
4225 return PyUnicode_New(0, 0);
4226
4227 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4228 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004229 name = PyMem_New(wchar_t, size);
4230 if (!name) {
4231 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004232 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004233 }
Victor Stinner74168972011-11-17 01:11:36 +01004234 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4235 name,
4236 &size))
4237 {
4238 PyMem_Free(name);
4239 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004240 }
Victor Stinner74168972011-11-17 01:11:36 +01004241
4242 result = PyUnicode_FromWideChar(name, size);
4243 PyMem_Free(name);
4244 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004245#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 char buf[1024];
4247 int res;
4248 Py_BEGIN_ALLOW_THREADS
4249 res = gethostname(buf, (int) sizeof buf - 1);
4250 Py_END_ALLOW_THREADS
4251 if (res < 0)
4252 return set_error();
4253 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004254 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004255#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004256}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004257
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004258PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004259"gethostname() -> string\n\
4260\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004261Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004262
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004263#ifdef HAVE_SETHOSTNAME
4264PyDoc_STRVAR(sethostname_doc,
4265"sethostname(name)\n\n\
4266Sets the hostname to name.");
4267
4268static PyObject *
4269socket_sethostname(PyObject *self, PyObject *args)
4270{
4271 PyObject *hnobj;
4272 Py_buffer buf;
4273 int res, flag = 0;
4274
Christian Heimesd2774c72013-06-19 02:06:29 +02004275#ifdef _AIX
4276/* issue #18259, not declared in any useful header file */
4277extern int sethostname(const char *, size_t);
4278#endif
4279
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004280 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4281 PyErr_Clear();
4282 if (!PyArg_ParseTuple(args, "O&:sethostname",
4283 PyUnicode_FSConverter, &hnobj))
4284 return NULL;
4285 flag = 1;
4286 }
4287 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4288 if (!res) {
4289 res = sethostname(buf.buf, buf.len);
4290 PyBuffer_Release(&buf);
4291 }
4292 if (flag)
4293 Py_DECREF(hnobj);
4294 if (res)
4295 return set_error();
4296 Py_RETURN_NONE;
4297}
4298#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004299
Guido van Rossum30a685f1991-06-27 15:51:29 +00004300/* Python interface to gethostbyname(name). */
4301
4302/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004303static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004304socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 char *name;
4307 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004308 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004309
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004310 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 return NULL;
4312 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004313 goto finally;
4314 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4315finally:
4316 PyMem_Free(name);
4317 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004318}
4319
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004320PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004321"gethostbyname(host) -> address\n\
4322\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004323Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004324
4325
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004326/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4327
4328static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004329gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 char **pch;
4332 PyObject *rtn_tuple = (PyObject *)NULL;
4333 PyObject *name_list = (PyObject *)NULL;
4334 PyObject *addr_list = (PyObject *)NULL;
4335 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004337 if (h == NULL) {
4338 /* Let's get real error message to return */
4339 set_herror(h_errno);
4340 return NULL;
4341 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 if (h->h_addrtype != af) {
4344 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004345 errno = EAFNOSUPPORT;
4346 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 return NULL;
4348 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 case AF_INET:
4353 if (alen < sizeof(struct sockaddr_in))
4354 return NULL;
4355 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004356
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004357#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 case AF_INET6:
4359 if (alen < sizeof(struct sockaddr_in6))
4360 return NULL;
4361 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004362#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 if ((name_list = PyList_New(0)) == NULL)
4367 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 if ((addr_list = PyList_New(0)) == NULL)
4370 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004372 /* SF #1511317: h_aliases can be NULL */
4373 if (h->h_aliases) {
4374 for (pch = h->h_aliases; *pch != NULL; pch++) {
4375 int status;
4376 tmp = PyUnicode_FromString(*pch);
4377 if (tmp == NULL)
4378 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 status = PyList_Append(name_list, tmp);
4381 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 if (status)
4384 goto err;
4385 }
4386 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4389 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 case AF_INET:
4394 {
4395 struct sockaddr_in sin;
4396 memset(&sin, 0, sizeof(sin));
4397 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004398#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4402 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 if (pch == h->h_addr_list && alen >= sizeof(sin))
4405 memcpy((char *) addr, &sin, sizeof(sin));
4406 break;
4407 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004408
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004409#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 case AF_INET6:
4411 {
4412 struct sockaddr_in6 sin6;
4413 memset(&sin6, 0, sizeof(sin6));
4414 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004415#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004416 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004418 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4419 tmp = makeipaddr((struct sockaddr *)&sin6,
4420 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4423 memcpy((char *) addr, &sin6, sizeof(sin6));
4424 break;
4425 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004426#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004429 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 "unsupported address family");
4431 return NULL;
4432 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 if (tmp == NULL)
4435 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 status = PyList_Append(addr_list, tmp);
4438 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004440 if (status)
4441 goto err;
4442 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004445
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004446 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 Py_XDECREF(name_list);
4448 Py_XDECREF(addr_list);
4449 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004450}
4451
4452
4453/* Python interface to gethostbyname_ex(name). */
4454
4455/*ARGSUSED*/
4456static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004457socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 char *name;
4460 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004461 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004463 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004464#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004465 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004466#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004467 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004468#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 char buf[16384];
4470 int buf_len = (sizeof buf) - 1;
4471 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004472#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004473#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004475#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004476#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004477
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004478 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004480 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004481 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004483#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004484#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004485 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004487#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004489#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 memset((void *) &data, '\0', sizeof(data));
4491 result = gethostbyname_r(name, &hp_allocated, &data);
4492 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004493#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004494#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004495#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004499#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 Py_END_ALLOW_THREADS
4501 /* Some C libraries would require addr.__ss_family instead of
4502 addr.ss_family.
4503 Therefore, we cast the sockaddr_storage into sockaddr to
4504 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004505 sa = SAS2SA(&addr);
4506 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004508#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004509 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004510#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004511finally:
4512 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004514}
4515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004516PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004517"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4518\n\
4519Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004520for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004521
4522
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004523/* Python interface to gethostbyaddr(IP). */
4524
4525/*ARGSUSED*/
4526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004527socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004528{
Charles-François Natali8b759652011-12-23 16:44:51 +01004529 sock_addr_t addr;
4530 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 char *ip_num;
4532 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004533 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +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 /* glibcs up to 2.10 assume that the buf argument to
4540 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4541 does not ensure. The attribute below instructs the compiler
4542 to maintain this alignment. */
4543 char buf[16384] Py_ALIGNED(8);
4544 int buf_len = (sizeof buf) - 1;
4545 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004546#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004547#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004549#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004550#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 char *ap;
4552 int al;
4553 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004554
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004555 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 return NULL;
4557 af = AF_UNSPEC;
4558 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004559 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 af = sa->sa_family;
4561 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004562 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 switch (af) {
4564 case AF_INET:
4565 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4566 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4567 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004568#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 case AF_INET6:
4570 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4571 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4572 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004575 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004576 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 }
4578 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004579#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004580#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004581 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 &hp_allocated, buf, buf_len,
4583 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004584#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004585 h = gethostbyaddr_r(ap, al, af,
4586 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004587#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 memset((void *) &data, '\0', sizeof(data));
4589 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4590 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004591#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004592#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004593#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004594 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004597#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004599 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004600#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004602#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004603finally:
4604 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004606}
4607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004608PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004609"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4610\n\
4611Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004612for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004613
Guido van Rossum30a685f1991-06-27 15:51:29 +00004614
4615/* Python interface to getservbyname(name).
4616 This only returns the port number, since the other info is already
4617 known or not useful (like the list of aliases). */
4618
4619/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004620static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004621socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 char *name, *proto=NULL;
4624 struct servent *sp;
4625 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4626 return NULL;
4627 Py_BEGIN_ALLOW_THREADS
4628 sp = getservbyname(name, proto);
4629 Py_END_ALLOW_THREADS
4630 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004631 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 return NULL;
4633 }
4634 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004635}
4636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004637PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004638"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004639\n\
4640Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004641The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4642otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004643
Guido van Rossum30a685f1991-06-27 15:51:29 +00004644
Barry Warsaw11b91a02004-06-28 00:50:43 +00004645/* Python interface to getservbyport(port).
4646 This only returns the service name, since the other info is already
4647 known or not useful (like the list of aliases). */
4648
4649/*ARGSUSED*/
4650static PyObject *
4651socket_getservbyport(PyObject *self, PyObject *args)
4652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 int port;
4654 char *proto=NULL;
4655 struct servent *sp;
4656 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4657 return NULL;
4658 if (port < 0 || port > 0xffff) {
4659 PyErr_SetString(
4660 PyExc_OverflowError,
4661 "getservbyport: port must be 0-65535.");
4662 return NULL;
4663 }
4664 Py_BEGIN_ALLOW_THREADS
4665 sp = getservbyport(htons((short)port), proto);
4666 Py_END_ALLOW_THREADS
4667 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004668 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 return NULL;
4670 }
4671 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004672}
4673
4674PyDoc_STRVAR(getservbyport_doc,
4675"getservbyport(port[, protocolname]) -> string\n\
4676\n\
4677Return the service name from a port number and protocol name.\n\
4678The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4679otherwise any protocol will match.");
4680
Guido van Rossum3901d851996-12-19 16:35:04 +00004681/* Python interface to getprotobyname(name).
4682 This only returns the protocol number, since the other info is
4683 already known or not useful (like the list of aliases). */
4684
4685/*ARGSUSED*/
4686static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004687socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004688{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 char *name;
4690 struct protoent *sp;
4691 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4692 return NULL;
4693 Py_BEGIN_ALLOW_THREADS
4694 sp = getprotobyname(name);
4695 Py_END_ALLOW_THREADS
4696 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004697 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 return NULL;
4699 }
4700 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004701}
4702
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004703PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004704"getprotobyname(name) -> integer\n\
4705\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004706Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004707
Guido van Rossum3901d851996-12-19 16:35:04 +00004708
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004709#ifndef NO_DUP
4710/* dup() function for socket fds */
4711
4712static PyObject *
4713socket_dup(PyObject *self, PyObject *fdobj)
4714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 SOCKET_T fd, newfd;
4716 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004717#ifdef MS_WINDOWS
4718 WSAPROTOCOL_INFO info;
4719#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004720
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 fd = PyLong_AsSocket_t(fdobj);
4722 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4723 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004724
Victor Stinnerdaf45552013-08-28 00:53:59 +02004725#ifdef MS_WINDOWS
4726 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4727 return set_error();
4728
4729 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4730 FROM_PROTOCOL_INFO,
4731 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 if (newfd == INVALID_SOCKET)
4733 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004734
Victor Stinnerdaf45552013-08-28 00:53:59 +02004735 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4736 closesocket(newfd);
4737 PyErr_SetFromWindowsErr(0);
4738 return NULL;
4739 }
4740#else
4741 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4742 newfd = _Py_dup(fd);
4743 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004744 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004745#endif
4746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 newfdobj = PyLong_FromSocket_t(newfd);
4748 if (newfdobj == NULL)
4749 SOCKETCLOSE(newfd);
4750 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004751}
4752
4753PyDoc_STRVAR(dup_doc,
4754"dup(integer) -> integer\n\
4755\n\
4756Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4757sockets; on some platforms os.dup() won't work for socket file descriptors.");
4758#endif
4759
4760
Dave Cole331708b2004-08-09 04:51:41 +00004761#ifdef HAVE_SOCKETPAIR
4762/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004763 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004764 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004765
4766/*ARGSUSED*/
4767static PyObject *
4768socket_socketpair(PyObject *self, PyObject *args)
4769{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004770 PySocketSockObject *s0 = NULL, *s1 = NULL;
4771 SOCKET_T sv[2];
4772 int family, type = SOCK_STREAM, proto = 0;
4773 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004774#ifdef SOCK_CLOEXEC
4775 int *atomic_flag_works = &sock_cloexec_works;
4776#else
4777 int *atomic_flag_works = NULL;
4778#endif
4779 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004780
4781#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004783#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004786 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4787 &family, &type, &proto))
4788 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004791 Py_BEGIN_ALLOW_THREADS
4792#ifdef SOCK_CLOEXEC
4793 if (sock_cloexec_works != 0) {
4794 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4795 if (sock_cloexec_works == -1) {
4796 if (ret >= 0) {
4797 sock_cloexec_works = 1;
4798 }
4799 else if (errno == EINVAL) {
4800 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4801 sock_cloexec_works = 0;
4802 ret = socketpair(family, type, proto, sv);
4803 }
4804 }
4805 }
4806 else
4807#endif
4808 {
4809 ret = socketpair(family, type, proto, sv);
4810 }
4811 Py_END_ALLOW_THREADS
4812
4813 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004815
4816 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4817 goto finally;
4818 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4819 goto finally;
4820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 s0 = new_sockobject(sv[0], family, type, proto);
4822 if (s0 == NULL)
4823 goto finally;
4824 s1 = new_sockobject(sv[1], family, type, proto);
4825 if (s1 == NULL)
4826 goto finally;
4827 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004828
4829finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830 if (res == NULL) {
4831 if (s0 == NULL)
4832 SOCKETCLOSE(sv[0]);
4833 if (s1 == NULL)
4834 SOCKETCLOSE(sv[1]);
4835 }
4836 Py_XDECREF(s0);
4837 Py_XDECREF(s1);
4838 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004839}
4840
4841PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004842"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004843\n\
4844Create a pair of socket objects from the sockets returned by the platform\n\
4845socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004846The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004847AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004848
4849#endif /* HAVE_SOCKETPAIR */
4850
4851
Guido van Rossum006bf911996-06-12 04:04:55 +00004852static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004853socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4858 return NULL;
4859 }
4860 if (x1 < 0) {
4861 PyErr_SetString(PyExc_OverflowError,
4862 "can't convert negative number to unsigned long");
4863 return NULL;
4864 }
4865 x2 = (unsigned int)ntohs((unsigned short)x1);
4866 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004867}
4868
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004869PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004870"ntohs(integer) -> integer\n\
4871\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004872Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004873
4874
Guido van Rossum006bf911996-06-12 04:04:55 +00004875static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004876socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004880 if (PyLong_Check(arg)) {
4881 x = PyLong_AsUnsignedLong(arg);
4882 if (x == (unsigned long) -1 && PyErr_Occurred())
4883 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004884#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 {
4886 unsigned long y;
4887 /* only want the trailing 32 bits */
4888 y = x & 0xFFFFFFFFUL;
4889 if (y ^ x)
4890 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004891 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004892 x = y;
4893 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004895 }
4896 else
4897 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004898 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004901}
4902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004903PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004904"ntohl(integer) -> integer\n\
4905\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004906Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004907
4908
Guido van Rossum006bf911996-06-12 04:04:55 +00004909static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004910socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004911{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004914 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4915 return NULL;
4916 }
4917 if (x1 < 0) {
4918 PyErr_SetString(PyExc_OverflowError,
4919 "can't convert negative number to unsigned long");
4920 return NULL;
4921 }
4922 x2 = (unsigned int)htons((unsigned short)x1);
4923 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004924}
4925
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004926PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004927"htons(integer) -> integer\n\
4928\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004929Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004930
4931
Guido van Rossum006bf911996-06-12 04:04:55 +00004932static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004933socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 if (PyLong_Check(arg)) {
4938 x = PyLong_AsUnsignedLong(arg);
4939 if (x == (unsigned long) -1 && PyErr_Occurred())
4940 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004941#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 {
4943 unsigned long y;
4944 /* only want the trailing 32 bits */
4945 y = x & 0xFFFFFFFFUL;
4946 if (y ^ x)
4947 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004948 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004949 x = y;
4950 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 }
4953 else
4954 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004955 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004956 Py_TYPE(arg)->tp_name);
4957 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004958}
4959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004960PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004961"htonl(integer) -> integer\n\
4962\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004963Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004964
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004965/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004967PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004968"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004969\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004970Convert 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 +00004971binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004972
4973static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004974socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004975{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004976#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004978#endif
4979
4980#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004981#if (SIZEOF_INT != 4)
4982#error "Not sure if in_addr_t exists and int is not 32-bits."
4983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 /* Have to use inet_addr() instead */
4985 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4990 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004991
Tim Peters1df9fdd2003-02-13 03:13:40 +00004992
4993#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004994
4995#ifdef USE_INET_ATON_WEAKLINK
4996 if (inet_aton != NULL) {
4997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004998 if (inet_aton(ip_addr, &buf))
4999 return PyBytes_FromStringAndSize((char *)(&buf),
5000 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005001
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005002 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 "illegal IP address string passed to inet_aton");
5004 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005005
Thomas Wouters477c8d52006-05-27 19:21:47 +00005006#ifdef USE_INET_ATON_WEAKLINK
5007 } else {
5008#endif
5009
5010#endif
5011
5012#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 /* special-case this address as inet_addr might return INADDR_NONE
5015 * for this */
5016 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005017 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005023 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 "illegal IP address string passed to inet_aton");
5025 return NULL;
5026 }
5027 }
5028 return PyBytes_FromStringAndSize((char *) &packed_addr,
5029 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005030
5031#ifdef USE_INET_ATON_WEAKLINK
5032 }
5033#endif
5034
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005035#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005036}
5037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005038PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005039"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005040\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005041Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005042
5043static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005044socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005045{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005046 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005048
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005049 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 return NULL;
5051 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005052
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005053 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005054 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005055 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005056 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 return NULL;
5058 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005059
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005060 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5061 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005064}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005065
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005066#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005067
5068PyDoc_STRVAR(inet_pton_doc,
5069"inet_pton(af, ip) -> packed IP address string\n\
5070\n\
5071Convert an IP address from string format to a packed string suitable\n\
5072for use with low-level network functions.");
5073
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005074#endif
5075
5076#ifdef HAVE_INET_PTON
5077
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005078static PyObject *
5079socket_inet_pton(PyObject *self, PyObject *args)
5080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 int af;
5082 char* ip;
5083 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005084#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005085 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005086#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005088#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5090 return NULL;
5091 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005092
Martin v. Löwis04697e82004-06-02 12:35:29 +00005093#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005095 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005096 "can't use AF_INET6, IPv6 is disabled");
5097 return NULL;
5098 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005099#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 retval = inet_pton(af, ip, packed);
5102 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005103 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 return NULL;
5105 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005106 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 "illegal IP address string passed to inet_pton");
5108 return NULL;
5109 } else if (af == AF_INET) {
5110 return PyBytes_FromStringAndSize(packed,
5111 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005112#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 } else if (af == AF_INET6) {
5114 return PyBytes_FromStringAndSize(packed,
5115 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005117 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005118 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 return NULL;
5120 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005121}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005122#elif defined(MS_WINDOWS)
5123
5124static PyObject *
5125socket_inet_pton(PyObject *self, PyObject *args)
5126{
5127 int af;
5128 char* ip;
5129 struct sockaddr_in6 addr;
5130 INT ret, size;
5131
5132 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5133 return NULL;
5134 }
5135
Victor Stinnere990c6e2013-11-16 00:18:58 +01005136 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005137 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5138
5139 if (ret) {
5140 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5141 return NULL;
5142 } else if(af == AF_INET) {
5143 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005144 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005145 sizeof(addr4->sin_addr));
5146 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005147 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005148 sizeof(addr.sin6_addr));
5149 } else {
5150 PyErr_SetString(PyExc_OSError, "unknown address family");
5151 return NULL;
5152 }
5153}
5154
5155#endif
5156
5157#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005158
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005159PyDoc_STRVAR(inet_ntop_doc,
5160"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5161\n\
5162Convert a packed IP address of the given family to string format.");
5163
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005164#endif
5165
5166
5167#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005168static PyObject *
5169socket_inet_ntop(PyObject *self, PyObject *args)
5170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005172 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005174#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005175 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005176#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005178#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5181 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005182
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005183 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 return NULL;
5185 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005188 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005189 PyErr_SetString(PyExc_ValueError,
5190 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005191 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 return NULL;
5193 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005194#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005196 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 PyErr_SetString(PyExc_ValueError,
5198 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005199 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 return NULL;
5201 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 } else {
5204 PyErr_Format(PyExc_ValueError,
5205 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005206 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 return NULL;
5208 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005209
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005210 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5211 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005212 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005213 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005214 return NULL;
5215 } else {
5216 return PyUnicode_FromString(retval);
5217 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005219 /* NOTREACHED */
5220 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5221 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005222}
5223
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005224#elif defined(MS_WINDOWS)
5225
5226static PyObject *
5227socket_inet_ntop(PyObject *self, PyObject *args)
5228{
5229 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005230 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005231 struct sockaddr_in6 addr;
5232 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005233#ifdef ENABLE_IPV6
5234 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5235#else
5236 char ip[INET_ADDRSTRLEN + 1];
5237#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005238
5239 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5240 memset((void *) &ip[0], '\0', sizeof(ip));
5241
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005242 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005243 return NULL;
5244 }
5245
5246 if (af == AF_INET) {
5247 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5248
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005249 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005250 PyErr_SetString(PyExc_ValueError,
5251 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005252 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005253 return NULL;
5254 }
5255 memset(addr4, 0, sizeof(struct sockaddr_in));
5256 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005257 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005258 addrlen = sizeof(struct sockaddr_in);
5259 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005260 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005261 PyErr_SetString(PyExc_ValueError,
5262 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005263 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005264 return NULL;
5265 }
5266
5267 memset(&addr, 0, sizeof(addr));
5268 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005269 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005270 addrlen = sizeof(addr);
5271 } else {
5272 PyErr_Format(PyExc_ValueError,
5273 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005274 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005275 return NULL;
5276 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005277 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005278
5279 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005280 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005281 ip, &retlen);
5282
5283 if (ret) {
5284 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5285 return NULL;
5286 } else {
5287 return PyUnicode_FromString(ip);
5288 }
5289}
5290
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005291#endif /* HAVE_INET_PTON */
5292
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005293/* Python interface to getaddrinfo(host, port). */
5294
5295/*ARGSUSED*/
5296static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005297socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005298{
Victor Stinner77af1722011-05-26 14:05:59 +02005299 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005300 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 struct addrinfo hints, *res;
5302 struct addrinfo *res0 = NULL;
5303 PyObject *hobj = NULL;
5304 PyObject *pobj = (PyObject *)NULL;
5305 char pbuf[30];
5306 char *hptr, *pptr;
5307 int family, socktype, protocol, flags;
5308 int error;
5309 PyObject *all = (PyObject *)NULL;
5310 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005311
Georg Brandl6083a4b2013-10-14 06:51:46 +02005312 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005314 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005315 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 &protocol, &flags)) {
5317 return NULL;
5318 }
5319 if (hobj == Py_None) {
5320 hptr = NULL;
5321 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005322 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005323
5324 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 if (!idna)
5326 return NULL;
5327 assert(PyBytes_Check(idna));
5328 hptr = PyBytes_AS_STRING(idna);
5329 } else if (PyBytes_Check(hobj)) {
5330 hptr = PyBytes_AsString(hobj);
5331 } else {
5332 PyErr_SetString(PyExc_TypeError,
5333 "getaddrinfo() argument 1 must be string or None");
5334 return NULL;
5335 }
5336 if (PyLong_CheckExact(pobj)) {
5337 long value = PyLong_AsLong(pobj);
5338 if (value == -1 && PyErr_Occurred())
5339 goto err;
5340 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5341 pptr = pbuf;
5342 } else if (PyUnicode_Check(pobj)) {
5343 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005344 if (pptr == NULL)
5345 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005347 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 } else if (pobj == Py_None) {
5349 pptr = (char *)NULL;
5350 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005351 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005352 goto err;
5353 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005354#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005355 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5356 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005357 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5358 * This workaround avoids a segfault in libsystem.
5359 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005360 pptr = "00";
5361 }
5362#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 memset(&hints, 0, sizeof(hints));
5364 hints.ai_family = family;
5365 hints.ai_socktype = socktype;
5366 hints.ai_protocol = protocol;
5367 hints.ai_flags = flags;
5368 Py_BEGIN_ALLOW_THREADS
5369 ACQUIRE_GETADDRINFO_LOCK
5370 error = getaddrinfo(hptr, pptr, &hints, &res0);
5371 Py_END_ALLOW_THREADS
5372 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5373 if (error) {
5374 set_gaierror(error);
5375 goto err;
5376 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 if ((all = PyList_New(0)) == NULL)
5379 goto err;
5380 for (res = res0; res; res = res->ai_next) {
5381 PyObject *single;
5382 PyObject *addr =
5383 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5384 if (addr == NULL)
5385 goto err;
5386 single = Py_BuildValue("iiisO", res->ai_family,
5387 res->ai_socktype, res->ai_protocol,
5388 res->ai_canonname ? res->ai_canonname : "",
5389 addr);
5390 Py_DECREF(addr);
5391 if (single == NULL)
5392 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005394 if (PyList_Append(all, single))
5395 goto err;
5396 Py_XDECREF(single);
5397 }
5398 Py_XDECREF(idna);
5399 if (res0)
5400 freeaddrinfo(res0);
5401 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005402 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 Py_XDECREF(all);
5404 Py_XDECREF(idna);
5405 if (res0)
5406 freeaddrinfo(res0);
5407 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005408}
5409
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005410PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005411"getaddrinfo(host, port [, family, type, proto, flags])\n\
5412 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005413\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005414Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005415
5416/* Python interface to getnameinfo(sa, flags). */
5417
5418/*ARGSUSED*/
5419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005420socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 PyObject *sa = (PyObject *)NULL;
5423 int flags;
5424 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005425 int port;
5426 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5428 struct addrinfo hints, *res = NULL;
5429 int error;
5430 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 flags = flowinfo = scope_id = 0;
5433 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5434 return NULL;
5435 if (!PyTuple_Check(sa)) {
5436 PyErr_SetString(PyExc_TypeError,
5437 "getnameinfo() argument 1 must be a tuple");
5438 return NULL;
5439 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005440 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 &hostp, &port, &flowinfo, &scope_id))
5442 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005443 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005444 PyErr_SetString(PyExc_OverflowError,
5445 "getsockaddrarg: flowinfo must be 0-1048575.");
5446 return NULL;
5447 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005448 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5449 memset(&hints, 0, sizeof(hints));
5450 hints.ai_family = AF_UNSPEC;
5451 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005452 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 Py_BEGIN_ALLOW_THREADS
5454 ACQUIRE_GETADDRINFO_LOCK
5455 error = getaddrinfo(hostp, pbuf, &hints, &res);
5456 Py_END_ALLOW_THREADS
5457 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5458 if (error) {
5459 set_gaierror(error);
5460 goto fail;
5461 }
5462 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005463 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005464 "sockaddr resolved to multiple addresses");
5465 goto fail;
5466 }
5467 switch (res->ai_family) {
5468 case AF_INET:
5469 {
5470 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005471 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005472 "IPv4 sockaddr must be 2 tuple");
5473 goto fail;
5474 }
5475 break;
5476 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005477#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005478 case AF_INET6:
5479 {
5480 struct sockaddr_in6 *sin6;
5481 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005482 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 sin6->sin6_scope_id = scope_id;
5484 break;
5485 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005488 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5490 if (error) {
5491 set_gaierror(error);
5492 goto fail;
5493 }
5494 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005495
5496fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005497 if (res)
5498 freeaddrinfo(res);
5499 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005500}
5501
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005502PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005503"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005504\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005505Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005506
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005507
5508/* Python API to getting and setting the default timeout value. */
5509
5510static PyObject *
5511socket_getdefaulttimeout(PyObject *self)
5512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005513 if (defaulttimeout < 0.0) {
5514 Py_INCREF(Py_None);
5515 return Py_None;
5516 }
5517 else
5518 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005519}
5520
5521PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005522"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005523\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005524Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005525A value of None indicates that new socket objects have no timeout.\n\
5526When the socket module is first imported, the default is None.");
5527
5528static PyObject *
5529socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 if (arg == Py_None)
5534 timeout = -1.0;
5535 else {
5536 timeout = PyFloat_AsDouble(arg);
5537 if (timeout < 0.0) {
5538 if (!PyErr_Occurred())
5539 PyErr_SetString(PyExc_ValueError,
5540 "Timeout value out of range");
5541 return NULL;
5542 }
5543 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 Py_INCREF(Py_None);
5548 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005549}
5550
5551PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005552"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005553\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005554Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005555A value of None indicates that new socket objects have no timeout.\n\
5556When the socket module is first imported, the default is None.");
5557
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005558#ifdef HAVE_IF_NAMEINDEX
5559/* Python API for getting interface indices and names */
5560
5561static PyObject *
5562socket_if_nameindex(PyObject *self, PyObject *arg)
5563{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005564 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005565 int i;
5566 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005567
Charles-François Natali60713592011-05-20 16:55:06 +02005568 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005569 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005570 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005571 return NULL;
5572 }
5573
5574 list = PyList_New(0);
5575 if (list == NULL) {
5576 if_freenameindex(ni);
5577 return NULL;
5578 }
5579
Charles-François Natali60713592011-05-20 16:55:06 +02005580 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5581 PyObject *ni_tuple = Py_BuildValue("IO&",
5582 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005583
5584 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5585 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005586 Py_DECREF(list);
5587 if_freenameindex(ni);
5588 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005589 }
5590 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005591 }
5592
5593 if_freenameindex(ni);
5594 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005595}
5596
5597PyDoc_STRVAR(if_nameindex_doc,
5598"if_nameindex()\n\
5599\n\
5600Returns a list of network interface information (index, name) tuples.");
5601
Charles-François Natali60713592011-05-20 16:55:06 +02005602static PyObject *
5603socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005604{
Charles-François Natali60713592011-05-20 16:55:06 +02005605 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005606 unsigned long index;
5607
Charles-François Natali60713592011-05-20 16:55:06 +02005608 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5609 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005610 return NULL;
5611
Charles-François Natali60713592011-05-20 16:55:06 +02005612 index = if_nametoindex(PyBytes_AS_STRING(oname));
5613 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005614 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005615 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005616 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005617 return NULL;
5618 }
5619
5620 return PyLong_FromUnsignedLong(index);
5621}
5622
5623PyDoc_STRVAR(if_nametoindex_doc,
5624"if_nametoindex(if_name)\n\
5625\n\
5626Returns the interface index corresponding to the interface name if_name.");
5627
Charles-François Natali60713592011-05-20 16:55:06 +02005628static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005629socket_if_indextoname(PyObject *self, PyObject *arg)
5630{
Charles-François Natali60713592011-05-20 16:55:06 +02005631 unsigned long index;
5632 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005633
Charles-François Natali60713592011-05-20 16:55:06 +02005634 index = PyLong_AsUnsignedLong(arg);
5635 if (index == (unsigned long) -1)
5636 return NULL;
5637
5638 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005639 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005640 return NULL;
5641 }
5642
Charles-François Natali60713592011-05-20 16:55:06 +02005643 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005644}
5645
5646PyDoc_STRVAR(if_indextoname_doc,
5647"if_indextoname(if_index)\n\
5648\n\
5649Returns the interface name corresponding to the interface index if_index.");
5650
5651#endif /* HAVE_IF_NAMEINDEX */
5652
5653
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005654#ifdef CMSG_LEN
5655/* Python interface to CMSG_LEN(length). */
5656
5657static PyObject *
5658socket_CMSG_LEN(PyObject *self, PyObject *args)
5659{
5660 Py_ssize_t length;
5661 size_t result;
5662
5663 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5664 return NULL;
5665 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5666 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5667 return NULL;
5668 }
5669 return PyLong_FromSize_t(result);
5670}
5671
5672PyDoc_STRVAR(CMSG_LEN_doc,
5673"CMSG_LEN(length) -> control message length\n\
5674\n\
5675Return the total length, without trailing padding, of an ancillary\n\
5676data item with associated data of the given length. This value can\n\
5677often be used as the buffer size for recvmsg() to receive a single\n\
5678item of ancillary data, but RFC 3542 requires portable applications to\n\
5679use CMSG_SPACE() and thus include space for padding, even when the\n\
5680item will be the last in the buffer. Raises OverflowError if length\n\
5681is outside the permissible range of values.");
5682
5683
5684#ifdef CMSG_SPACE
5685/* Python interface to CMSG_SPACE(length). */
5686
5687static PyObject *
5688socket_CMSG_SPACE(PyObject *self, PyObject *args)
5689{
5690 Py_ssize_t length;
5691 size_t result;
5692
5693 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5694 return NULL;
5695 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5696 PyErr_SetString(PyExc_OverflowError,
5697 "CMSG_SPACE() argument out of range");
5698 return NULL;
5699 }
5700 return PyLong_FromSize_t(result);
5701}
5702
5703PyDoc_STRVAR(CMSG_SPACE_doc,
5704"CMSG_SPACE(length) -> buffer size\n\
5705\n\
5706Return the buffer size needed for recvmsg() to receive an ancillary\n\
5707data item with associated data of the given length, along with any\n\
5708trailing padding. The buffer space needed to receive multiple items\n\
5709is the sum of the CMSG_SPACE() values for their associated data\n\
5710lengths. Raises OverflowError if length is outside the permissible\n\
5711range of values.");
5712#endif /* CMSG_SPACE */
5713#endif /* CMSG_LEN */
5714
5715
Guido van Rossum30a685f1991-06-27 15:51:29 +00005716/* List of functions exported by this module. */
5717
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005718static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 {"gethostbyname", socket_gethostbyname,
5720 METH_VARARGS, gethostbyname_doc},
5721 {"gethostbyname_ex", socket_gethostbyname_ex,
5722 METH_VARARGS, ghbn_ex_doc},
5723 {"gethostbyaddr", socket_gethostbyaddr,
5724 METH_VARARGS, gethostbyaddr_doc},
5725 {"gethostname", socket_gethostname,
5726 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005727#ifdef HAVE_SETHOSTNAME
5728 {"sethostname", socket_sethostname,
5729 METH_VARARGS, sethostname_doc},
5730#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 {"getservbyname", socket_getservbyname,
5732 METH_VARARGS, getservbyname_doc},
5733 {"getservbyport", socket_getservbyport,
5734 METH_VARARGS, getservbyport_doc},
5735 {"getprotobyname", socket_getprotobyname,
5736 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005737#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005738 {"dup", socket_dup,
5739 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005740#endif
Dave Cole331708b2004-08-09 04:51:41 +00005741#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 {"socketpair", socket_socketpair,
5743 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005745 {"ntohs", socket_ntohs,
5746 METH_VARARGS, ntohs_doc},
5747 {"ntohl", socket_ntohl,
5748 METH_O, ntohl_doc},
5749 {"htons", socket_htons,
5750 METH_VARARGS, htons_doc},
5751 {"htonl", socket_htonl,
5752 METH_O, htonl_doc},
5753 {"inet_aton", socket_inet_aton,
5754 METH_VARARGS, inet_aton_doc},
5755 {"inet_ntoa", socket_inet_ntoa,
5756 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005757#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 {"inet_pton", socket_inet_pton,
5759 METH_VARARGS, inet_pton_doc},
5760 {"inet_ntop", socket_inet_ntop,
5761 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005762#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005763 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5764 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005765 {"getnameinfo", socket_getnameinfo,
5766 METH_VARARGS, getnameinfo_doc},
5767 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5768 METH_NOARGS, getdefaulttimeout_doc},
5769 {"setdefaulttimeout", socket_setdefaulttimeout,
5770 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005771#ifdef HAVE_IF_NAMEINDEX
5772 {"if_nameindex", socket_if_nameindex,
5773 METH_NOARGS, if_nameindex_doc},
5774 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005775 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005776 {"if_indextoname", socket_if_indextoname,
5777 METH_O, if_indextoname_doc},
5778#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005779#ifdef CMSG_LEN
5780 {"CMSG_LEN", socket_CMSG_LEN,
5781 METH_VARARGS, CMSG_LEN_doc},
5782#ifdef CMSG_SPACE
5783 {"CMSG_SPACE", socket_CMSG_SPACE,
5784 METH_VARARGS, CMSG_SPACE_doc},
5785#endif
5786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005788};
5789
Guido van Rossum30a685f1991-06-27 15:51:29 +00005790
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005791#ifdef MS_WINDOWS
5792#define OS_INIT_DEFINED
5793
5794/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005795
5796static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005797os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005798{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005799 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005800}
5801
5802static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005803os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005804{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 WSADATA WSAData;
5806 int ret;
5807 ret = WSAStartup(0x0101, &WSAData);
5808 switch (ret) {
5809 case 0: /* No error */
5810 Py_AtExit(os_cleanup);
5811 return 1; /* Success */
5812 case WSASYSNOTREADY:
5813 PyErr_SetString(PyExc_ImportError,
5814 "WSAStartup failed: network not ready");
5815 break;
5816 case WSAVERNOTSUPPORTED:
5817 case WSAEINVAL:
5818 PyErr_SetString(
5819 PyExc_ImportError,
5820 "WSAStartup failed: requested version not supported");
5821 break;
5822 default:
5823 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5824 break;
5825 }
5826 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005827}
5828
Guido van Rossum8d665e61996-06-26 18:22:49 +00005829#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005830
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005831
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005832
5833#ifndef OS_INIT_DEFINED
5834static int
5835os_init(void)
5836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005838}
5839#endif
5840
5841
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005842/* C API table - always add new things to the end for binary
5843 compatibility. */
5844static
5845PySocketModule_APIObject PySocketModuleAPI =
5846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005847 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005848 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005849 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005850};
5851
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005852
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005853/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005854
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005855 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005856 "socket.py" which implements some additional functionality.
5857 The import of "_socket" may fail with an ImportError exception if
5858 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005859 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005860 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005861*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005862
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005863PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005864"Implementation module for socket operations.\n\
5865\n\
5866See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005867
Martin v. Löwis1a214512008-06-11 05:26:20 +00005868static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 PyModuleDef_HEAD_INIT,
5870 PySocket_MODULE_NAME,
5871 socket_doc,
5872 -1,
5873 socket_methods,
5874 NULL,
5875 NULL,
5876 NULL,
5877 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005878};
5879
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005880PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005881PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005882{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 if (!os_init())
5886 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005887
Victor Stinnerdaf45552013-08-28 00:53:59 +02005888#ifdef MS_WINDOWS
5889 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08005890#if defined(_MSC_VER) && _MSC_VER >= 1800
5891 support_wsa_no_inherit = IsWindows7SP1OrGreater();
5892#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02005893 DWORD version = GetVersion();
5894 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5895 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5896 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08005897 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
5898#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02005899 }
5900#endif
5901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 Py_TYPE(&sock_type) = &PyType_Type;
5903 m = PyModule_Create(&socketmodule);
5904 if (m == NULL)
5905 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005906
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005907 Py_INCREF(PyExc_OSError);
5908 PySocketModuleAPI.error = PyExc_OSError;
5909 Py_INCREF(PyExc_OSError);
5910 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005911 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005912 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 if (socket_herror == NULL)
5914 return NULL;
5915 Py_INCREF(socket_herror);
5916 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005917 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 NULL);
5919 if (socket_gaierror == NULL)
5920 return NULL;
5921 Py_INCREF(socket_gaierror);
5922 PyModule_AddObject(m, "gaierror", socket_gaierror);
5923 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005924 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 if (socket_timeout == NULL)
5926 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005927 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 Py_INCREF(socket_timeout);
5929 PyModule_AddObject(m, "timeout", socket_timeout);
5930 Py_INCREF((PyObject *)&sock_type);
5931 if (PyModule_AddObject(m, "SocketType",
5932 (PyObject *)&sock_type) != 0)
5933 return NULL;
5934 Py_INCREF((PyObject *)&sock_type);
5935 if (PyModule_AddObject(m, "socket",
5936 (PyObject *)&sock_type) != 0)
5937 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005938
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005939#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 Py_INCREF(has_ipv6);
5945 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 /* Export C API */
5948 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5949 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5950 ) != 0)
5951 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005954#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005955 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005956#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005957 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005958#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005959 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005960#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005961#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005962 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005963#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005964#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005966 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005967#endif
5968#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005969 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005970#endif
5971#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005973 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005974#endif
5975#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005977 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005978#endif
5979#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005980 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005982#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005983#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005985 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005986#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005987#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005989 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005990#endif
5991#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005992 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005993 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005994#endif
5995#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005996 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005997#endif
5998#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006000 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006001#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006002#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006003 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006004 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006005#endif
6006#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006008 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006009#endif
6010#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006012 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006013#endif
6014#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006016 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006017#endif
6018#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006020 PyModule_AddIntMacro(m, AF_NETLINK);
6021 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006022#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006023 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006024#endif
6025#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006026 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006027#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006028 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6029 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006030#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006031 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006032#endif
6033#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006034 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006035#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006036#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006037 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006038#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006039#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006040 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006041#endif
6042#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006043 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006044#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006045 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006046#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006047 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006048#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006049#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006050 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006051#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006052#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006053#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006055 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006056#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006057#ifdef AF_LINK
6058 PyModule_AddIntMacro(m, AF_LINK);
6059#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006060#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006062 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006063#endif
6064#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006066 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006067#endif
6068#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006070 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006071#endif
6072#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006075#endif
6076#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006078 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006079#endif
6080#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006081 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006082 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006083#endif
6084#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006086 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006087#endif
6088#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006089 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006090 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006091#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006092
Hye-Shik Chang81268602004-02-02 06:05:24 +00006093#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006094 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6095 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6096 PyModule_AddIntMacro(m, BTPROTO_HCI);
6097 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006098#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006099 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006100#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006101#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006102#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006103 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006104#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006105 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6106 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006107#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006108 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6110 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006111#endif
6112
Charles-François Natali47413c12011-10-06 19:47:44 +02006113#ifdef AF_CAN
6114 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006115 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006116#endif
6117#ifdef PF_CAN
6118 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006119 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006120#endif
6121
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006122/* Reliable Datagram Sockets */
6123#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006124 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006125#endif
6126#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006127 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006128#endif
6129
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006130/* Kernel event messages */
6131#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006132 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006133#endif
6134#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006135 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006136#endif
6137
Antoine Pitroub156a462010-10-27 20:13:57 +00006138#ifdef AF_PACKET
6139 PyModule_AddIntMacro(m, AF_PACKET);
6140#endif
6141#ifdef PF_PACKET
6142 PyModule_AddIntMacro(m, PF_PACKET);
6143#endif
6144#ifdef PACKET_HOST
6145 PyModule_AddIntMacro(m, PACKET_HOST);
6146#endif
6147#ifdef PACKET_BROADCAST
6148 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6149#endif
6150#ifdef PACKET_MULTICAST
6151 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6152#endif
6153#ifdef PACKET_OTHERHOST
6154 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6155#endif
6156#ifdef PACKET_OUTGOING
6157 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6158#endif
6159#ifdef PACKET_LOOPBACK
6160 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6161#endif
6162#ifdef PACKET_FASTROUTE
6163 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006164#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006165
Christian Heimes043d6f62008-01-07 17:19:16 +00006166#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006168
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6171 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6172 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006173
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006174 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6175 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6176 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, SOL_TIPC);
6180 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6181 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6182 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6183 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006184
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6186 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6187 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6188 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006189
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6192 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006193#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006196#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6198 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6199 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6200 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6201 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6202 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006203#endif
6204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, SOCK_STREAM);
6207 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006208/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, SOCK_RAW);
6210 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006211#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006212 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006213#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006214#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006215 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006216#endif
6217#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006219#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006225 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006229#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006230#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006231 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006232#endif
6233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006234#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006235 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006236#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006239#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006241 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006242#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006244 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006245#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006250 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006251#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006256 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006257#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006259 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006260#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006263#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006268 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006274 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006277 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006281#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006282#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006284#endif
6285#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006287#endif
6288#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006290#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006291#ifdef SO_BINDTODEVICE
6292 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6293#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006294#ifdef SO_PRIORITY
6295 PyModule_AddIntMacro(m, SO_PRIORITY);
6296#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006297#ifdef SO_MARK
6298 PyModule_AddIntMacro(m, SO_MARK);
6299#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301 /* Maximum number of connections for "listen" */
6302#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006303 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006304#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006306#endif
6307
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006308 /* Ancilliary message types */
6309#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006311#endif
6312#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006314#endif
6315#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006317#endif
6318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 /* Flags for send, recv */
6320#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006321 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006323#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006324 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006326#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006327 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006330 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006331#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006333 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006336 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006337#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006338#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006339 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006340#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006341#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006342 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006343#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006345 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006346#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006347#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006348 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006349#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006350#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006351 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006352#endif
6353#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006354 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006355#endif
6356#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006357 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006358#endif
6359#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006361#endif
6362#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006363 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006364#endif
6365#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006366 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006367#endif
6368#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006369 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006370#endif
6371#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006372 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006373#endif
6374#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006375 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006376#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006377#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006378 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006379#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 /* Protocol level and numbers, usable for [gs]etsockopt */
6382#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006387#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006389#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006391 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006392#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006393#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006394 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006407#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006412#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006414#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006415#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006417#endif
6418#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006419 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6420 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006421#endif
6422#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6424 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6425 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006426
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6428 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6429 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006430#endif
6431#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6433 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6434 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6435 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006436#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006437#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006439 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6440 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6441 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6442 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6443 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6444 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6445 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6446 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6447 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6448 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6449 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6450 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6451#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006452#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006454#endif
6455#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006457#endif
6458#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006460#endif
6461#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006463#endif
6464#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006465 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006466#endif
6467#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006468 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006469#endif
6470#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006475#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006483#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006492#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006503#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006514#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006521 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006524 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006526#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006527 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006530 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006531#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006532#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006533 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006535#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006536 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006542 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006544#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006545 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006549#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006551 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006554 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006557 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006569 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006576#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006577#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006581 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006582#endif
6583/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006585 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006586#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006591#endif
6592
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006593#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006595#endif
6596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 /* Some port configuration */
6598#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006600#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006605#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006607#endif
6608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 /* Some reserved IP v.4 addresses */
6610#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006612#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006615#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006616 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006617#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006622#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006627#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630#ifdef INADDR_ALLHOSTS_GROUP
6631 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6632 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006633#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006636#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006638#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006643#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006645#endif
6646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647 /* IPv4 [gs]etsockopt options */
6648#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006690#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006695#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006696#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006698#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006700 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6701#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006706#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006707#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006709#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006712#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006713#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006715#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006716#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006719 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006720#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006724#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006726#endif
6727#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006729#endif
6730#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006732#endif
6733#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006735#endif
6736#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006738#endif
6739#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006741#endif
6742#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006744#endif
6745#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006747#endif
6748#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006750#endif
6751#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006753#endif
6754#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006756#endif
6757#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006759#endif
6760#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006762#endif
6763#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006765#endif
6766#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006768#endif
6769#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006771#endif
6772#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006774#endif
6775#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006777#endif
6778#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006780#endif
6781#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006783#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 /* TCP options */
6786#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006800#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006801#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006804#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006809#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006821#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006822#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006824#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826 /* IPX options */
6827#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006829#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006830
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006831/* Reliable Datagram Sockets */
6832#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006834#endif
6835#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006837#endif
6838#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006840#endif
6841#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006843#endif
6844#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006846#endif
6847#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006849#endif
6850#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006852#endif
6853#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006855#endif
6856#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006858#endif
6859#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006861#endif
6862#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006864#endif
6865#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006867#endif
6868
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006869 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006870#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006872#endif
6873#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006875#endif
6876#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006878#endif
6879#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006881#endif
6882#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006884#endif
6885#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006887#endif
6888#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006890#endif
6891#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006893#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006894#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006896#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006897#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006899#endif
6900#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006902#endif
6903#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006905#endif
6906#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006908#endif
6909#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006911#endif
6912#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006914#endif
6915#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006917#endif
6918#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006920#endif
6921#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006923#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006924#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006926#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006927#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006929#endif
6930#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006932#endif
6933#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006935#endif
6936#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006938#endif
6939#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006941#endif
6942#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006944#endif
6945#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006947#endif
6948#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006950#endif
6951#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006953#endif
6954#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006955 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006956#endif
6957#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006958 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006959#endif
6960#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006961 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006962#endif
6963#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006965#endif
6966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006968#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006970#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006972#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006973 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006974#endif
6975#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006977#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006979#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006981#endif
6982#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006984#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006986#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006987 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006988#endif
6989
Christian Heimesfaf2f632008-01-06 16:59:19 +00006990#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006991 {
6992 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6993 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6994 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006995 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006996 PyObject *tmp;
6997 tmp = PyLong_FromUnsignedLong(codes[i]);
6998 if (tmp == NULL)
6999 return NULL;
7000 PyModule_AddObject(m, names[i], tmp);
7001 }
7002 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, RCVALL_OFF);
7004 PyModule_AddIntMacro(m, RCVALL_ON);
7005 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007006#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007008#endif
7009#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007011#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007012#endif /* _MSTCPIP_ */
7013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007015#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007016 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007017#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007018 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007019}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007020
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007021
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007022#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007023#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007024
7025/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007026/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007027
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007028int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007029inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007031 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007032#if (SIZEOF_INT != 4)
7033#error "Not sure if in_addr_t exists and int is not 32-bits."
7034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007035 unsigned int packed_addr;
7036 packed_addr = inet_addr(src);
7037 if (packed_addr == INADDR_NONE)
7038 return 0;
7039 memcpy(dst, &packed_addr, 4);
7040 return 1;
7041 }
7042 /* Should set errno to EAFNOSUPPORT */
7043 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007044}
7045
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007046const char *
7047inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007048{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049 if (af == AF_INET) {
7050 struct in_addr packed_addr;
7051 if (size < 16)
7052 /* Should set errno to ENOSPC. */
7053 return NULL;
7054 memcpy(&packed_addr, src, sizeof(packed_addr));
7055 return strncpy(dst, inet_ntoa(packed_addr), size);
7056 }
7057 /* Should set errno to EAFNOSUPPORT */
7058 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007059}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007060
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007061#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007062#endif