blob: 94cf7738e48224cf83ca9aaad1fa620088f2d363 [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; \
690 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
691 } \
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;
1302 char *path;
1303 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001304 int retval = 0;
1305
1306 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1307 allow embedded nulls on Linux. */
1308 if (PyUnicode_Check(args)) {
1309 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1310 return 0;
1311 }
1312 else
1313 Py_INCREF(args);
1314 if (!PyArg_Parse(args, "y#", &path, &len))
1315 goto unix_out;
Victor Stinner1a62a682014-08-17 19:33:28 +02001316 assert(len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001319#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 if (len > 0 && path[0] == 0) {
1321 /* Linux abstract namespace extension */
Victor Stinner1a62a682014-08-17 19:33:28 +02001322 if ((size_t)len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001323 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001325 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 }
1327 }
1328 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001329#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 {
1331 /* regular NULL-terminated string */
Victor Stinner1a62a682014-08-17 19:33:28 +02001332 if ((size_t)len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001333 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001334 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001335 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001336 }
1337 addr->sun_path[len] = 0;
1338 }
1339 addr->sun_family = s->sock_family;
1340 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001342 retval = 1;
1343 unix_out:
1344 Py_DECREF(args);
1345 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001347#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001348
Martin v. Löwis11017b12006-01-14 18:12:57 +00001349#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 case AF_NETLINK:
1351 {
1352 struct sockaddr_nl* addr;
1353 int pid, groups;
1354 addr = (struct sockaddr_nl *)addr_ret;
1355 if (!PyTuple_Check(args)) {
1356 PyErr_Format(
1357 PyExc_TypeError,
1358 "getsockaddrarg: "
1359 "AF_NETLINK address must be tuple, not %.500s",
1360 Py_TYPE(args)->tp_name);
1361 return 0;
1362 }
1363 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1364 return 0;
1365 addr->nl_family = AF_NETLINK;
1366 addr->nl_pid = pid;
1367 addr->nl_groups = groups;
1368 *len_ret = sizeof(*addr);
1369 return 1;
1370 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001371#endif
1372
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001373#ifdef AF_RDS
1374 case AF_RDS:
1375 /* RDS sockets use sockaddr_in: fall-through */
1376#endif
1377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001378 case AF_INET:
1379 {
1380 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001381 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 int port, result;
1383 if (!PyTuple_Check(args)) {
1384 PyErr_Format(
1385 PyExc_TypeError,
1386 "getsockaddrarg: "
1387 "AF_INET address must be tuple, not %.500s",
1388 Py_TYPE(args)->tp_name);
1389 return 0;
1390 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001391 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1392 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 return 0;
1394 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001395 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001396 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001397 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 if (result < 0)
1399 return 0;
1400 if (port < 0 || port > 0xffff) {
1401 PyErr_SetString(
1402 PyExc_OverflowError,
1403 "getsockaddrarg: port must be 0-65535.");
1404 return 0;
1405 }
1406 addr->sin_family = AF_INET;
1407 addr->sin_port = htons((short)port);
1408 *len_ret = sizeof *addr;
1409 return 1;
1410 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001411
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001412#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 case AF_INET6:
1414 {
1415 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001416 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001417 int port, result;
1418 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 flowinfo = scope_id = 0;
1420 if (!PyTuple_Check(args)) {
1421 PyErr_Format(
1422 PyExc_TypeError,
1423 "getsockaddrarg: "
1424 "AF_INET6 address must be tuple, not %.500s",
1425 Py_TYPE(args)->tp_name);
1426 return 0;
1427 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001428 if (!PyArg_ParseTuple(args, "O&i|II",
1429 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 &scope_id)) {
1431 return 0;
1432 }
1433 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001434 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001436 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 if (result < 0)
1438 return 0;
1439 if (port < 0 || port > 0xffff) {
1440 PyErr_SetString(
1441 PyExc_OverflowError,
1442 "getsockaddrarg: port must be 0-65535.");
1443 return 0;
1444 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001445 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001446 PyErr_SetString(
1447 PyExc_OverflowError,
1448 "getsockaddrarg: flowinfo must be 0-1048575.");
1449 return 0;
1450 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 addr->sin6_family = s->sock_family;
1452 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001453 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 addr->sin6_scope_id = scope_id;
1455 *len_ret = sizeof *addr;
1456 return 1;
1457 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001458#endif
1459
Hye-Shik Chang81268602004-02-02 06:05:24 +00001460#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 case AF_BLUETOOTH:
1462 {
1463 switch (s->sock_proto) {
1464 case BTPROTO_L2CAP:
1465 {
1466 struct sockaddr_l2 *addr;
1467 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 addr = (struct sockaddr_l2 *)addr_ret;
1470 memset(addr, 0, sizeof(struct sockaddr_l2));
1471 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1472 if (!PyArg_ParseTuple(args, "si", &straddr,
1473 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001474 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 "wrong format");
1476 return 0;
1477 }
1478 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1479 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 *len_ret = sizeof *addr;
1482 return 1;
1483 }
1484 case BTPROTO_RFCOMM:
1485 {
1486 struct sockaddr_rc *addr;
1487 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001489 addr = (struct sockaddr_rc *)addr_ret;
1490 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1491 if (!PyArg_ParseTuple(args, "si", &straddr,
1492 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001493 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 "wrong format");
1495 return 0;
1496 }
1497 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1498 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001499
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001500 *len_ret = sizeof *addr;
1501 return 1;
1502 }
1503 case BTPROTO_HCI:
1504 {
1505 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001506#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001507 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001508
Alexander Belopolskye239d232010-12-08 23:31:48 +00001509 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001510 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001511 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001512 "wrong format");
1513 return 0;
1514 }
1515 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1516 return 0;
1517#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1519 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001520 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 "wrong format");
1522 return 0;
1523 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001525 *len_ret = sizeof *addr;
1526 return 1;
1527 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001528#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 case BTPROTO_SCO:
1530 {
1531 struct sockaddr_sco *addr;
1532 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 addr = (struct sockaddr_sco *)addr_ret;
1535 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1536 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001537 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001538 "wrong format");
1539 return 0;
1540 }
1541 straddr = PyBytes_AS_STRING(args);
1542 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1543 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 *len_ret = sizeof *addr;
1546 return 1;
1547 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001550 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 return 0;
1552 }
1553 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001554#endif
1555
Antoine Pitroub156a462010-10-27 20:13:57 +00001556#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 case AF_PACKET:
1558 {
1559 struct sockaddr_ll* addr;
1560 struct ifreq ifr;
1561 char *interfaceName;
1562 int protoNumber;
1563 int hatype = 0;
1564 int pkttype = 0;
1565 char *haddr = NULL;
1566 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 if (!PyTuple_Check(args)) {
1569 PyErr_Format(
1570 PyExc_TypeError,
1571 "getsockaddrarg: "
1572 "AF_PACKET address must be tuple, not %.500s",
1573 Py_TYPE(args)->tp_name);
1574 return 0;
1575 }
1576 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1577 &protoNumber, &pkttype, &hatype,
1578 &haddr, &halen))
1579 return 0;
1580 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1581 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1582 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1583 s->errorhandler();
1584 return 0;
1585 }
1586 if (halen > 8) {
1587 PyErr_SetString(PyExc_ValueError,
1588 "Hardware address must be 8 bytes or less");
1589 return 0;
1590 }
1591 if (protoNumber < 0 || protoNumber > 0xffff) {
1592 PyErr_SetString(
1593 PyExc_OverflowError,
1594 "getsockaddrarg: protoNumber must be 0-65535.");
1595 return 0;
1596 }
1597 addr = (struct sockaddr_ll*)addr_ret;
1598 addr->sll_family = AF_PACKET;
1599 addr->sll_protocol = htons((short)protoNumber);
1600 addr->sll_ifindex = ifr.ifr_ifindex;
1601 addr->sll_pkttype = pkttype;
1602 addr->sll_hatype = hatype;
1603 if (halen != 0) {
1604 memcpy(&addr->sll_addr, haddr, halen);
1605 }
1606 addr->sll_halen = halen;
1607 *len_ret = sizeof *addr;
1608 return 1;
1609 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001610#endif
1611
Christian Heimes043d6f62008-01-07 17:19:16 +00001612#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 case AF_TIPC:
1614 {
1615 unsigned int atype, v1, v2, v3;
1616 unsigned int scope = TIPC_CLUSTER_SCOPE;
1617 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 if (!PyTuple_Check(args)) {
1620 PyErr_Format(
1621 PyExc_TypeError,
1622 "getsockaddrarg: "
1623 "AF_TIPC address must be tuple, not %.500s",
1624 Py_TYPE(args)->tp_name);
1625 return 0;
1626 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001628 if (!PyArg_ParseTuple(args,
1629 "IIII|I;Invalid TIPC address format",
1630 &atype, &v1, &v2, &v3, &scope))
1631 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 addr = (struct sockaddr_tipc *) addr_ret;
1634 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001636 addr->family = AF_TIPC;
1637 addr->scope = scope;
1638 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 if (atype == TIPC_ADDR_NAMESEQ) {
1641 addr->addr.nameseq.type = v1;
1642 addr->addr.nameseq.lower = v2;
1643 addr->addr.nameseq.upper = v3;
1644 } else if (atype == TIPC_ADDR_NAME) {
1645 addr->addr.name.name.type = v1;
1646 addr->addr.name.name.instance = v2;
1647 } else if (atype == TIPC_ADDR_ID) {
1648 addr->addr.id.node = v1;
1649 addr->addr.id.ref = v2;
1650 } else {
1651 /* Shouldn't happen */
1652 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1653 return 0;
1654 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 return 1;
1659 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001660#endif
1661
Vinay Sajiped6783f2014-03-21 11:44:32 +00001662#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001663 case AF_CAN:
1664 switch (s->sock_proto) {
1665 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001666 /* fall-through */
1667 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001668 {
1669 struct sockaddr_can *addr;
1670 PyObject *interfaceName;
1671 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001672 Py_ssize_t len;
1673
Benjamin Peterson18b71912013-05-16 15:29:44 -05001674 addr = (struct sockaddr_can *)addr_ret;
1675
Charles-François Natali47413c12011-10-06 19:47:44 +02001676 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1677 &interfaceName))
1678 return 0;
1679
1680 len = PyBytes_GET_SIZE(interfaceName);
1681
1682 if (len == 0) {
1683 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001684 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001685 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1686 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001687 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1688 s->errorhandler();
1689 Py_DECREF(interfaceName);
1690 return 0;
1691 }
1692 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001693 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001694 "AF_CAN interface name too long");
1695 Py_DECREF(interfaceName);
1696 return 0;
1697 }
1698
1699 addr->can_family = AF_CAN;
1700 addr->can_ifindex = ifr.ifr_ifindex;
1701
1702 *len_ret = sizeof(*addr);
1703 Py_DECREF(interfaceName);
1704 return 1;
1705 }
1706 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001707 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001708 "getsockaddrarg: unsupported CAN protocol");
1709 return 0;
1710 }
1711#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001712
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001713#ifdef PF_SYSTEM
1714 case PF_SYSTEM:
1715 switch (s->sock_proto) {
1716#ifdef SYSPROTO_CONTROL
1717 case SYSPROTO_CONTROL:
1718 {
1719 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001720
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001721 addr = (struct sockaddr_ctl *)addr_ret;
1722 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001723 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001724
1725 if (PyUnicode_Check(args)) {
1726 struct ctl_info info;
1727 PyObject *ctl_name;
1728
1729 if (!PyArg_Parse(args, "O&",
1730 PyUnicode_FSConverter, &ctl_name)) {
1731 return 0;
1732 }
1733
1734 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1735 PyErr_SetString(PyExc_ValueError,
1736 "provided string is too long");
1737 Py_DECREF(ctl_name);
1738 return 0;
1739 }
1740 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1741 sizeof(info.ctl_name));
1742 Py_DECREF(ctl_name);
1743
1744 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1745 PyErr_SetString(PyExc_OSError,
1746 "cannot find kernel control with provided name");
1747 return 0;
1748 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001749
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001750 addr->sc_id = info.ctl_id;
1751 addr->sc_unit = 0;
1752 } else if (!PyArg_ParseTuple(args, "II",
1753 &(addr->sc_id), &(addr->sc_unit))) {
1754 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1755 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001756
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001757 return 0;
1758 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001759
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001760 *len_ret = sizeof(*addr);
1761 return 1;
1762 }
1763#endif
1764 default:
1765 PyErr_SetString(PyExc_OSError,
1766 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1767 return 0;
1768 }
1769#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001774 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001778}
1779
Guido van Rossum30a685f1991-06-27 15:51:29 +00001780
Guido van Rossum48a680c2001-03-02 06:34:14 +00001781/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001782 Return 1 if the family is known, 0 otherwise. The length is returned
1783 through len_ret. */
1784
1785static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001786getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001789
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001790#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 case AF_UNIX:
1792 {
1793 *len_ret = sizeof (struct sockaddr_un);
1794 return 1;
1795 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001796#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001797#if defined(AF_NETLINK)
1798 case AF_NETLINK:
1799 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 *len_ret = sizeof (struct sockaddr_nl);
1801 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001802 }
1803#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001804
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001805#ifdef AF_RDS
1806 case AF_RDS:
1807 /* RDS sockets use sockaddr_in: fall-through */
1808#endif
1809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 case AF_INET:
1811 {
1812 *len_ret = sizeof (struct sockaddr_in);
1813 return 1;
1814 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001815
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001816#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 case AF_INET6:
1818 {
1819 *len_ret = sizeof (struct sockaddr_in6);
1820 return 1;
1821 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001822#endif
1823
Hye-Shik Chang81268602004-02-02 06:05:24 +00001824#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 case AF_BLUETOOTH:
1826 {
1827 switch(s->sock_proto)
1828 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001830 case BTPROTO_L2CAP:
1831 *len_ret = sizeof (struct sockaddr_l2);
1832 return 1;
1833 case BTPROTO_RFCOMM:
1834 *len_ret = sizeof (struct sockaddr_rc);
1835 return 1;
1836 case BTPROTO_HCI:
1837 *len_ret = sizeof (struct sockaddr_hci);
1838 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001839#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 case BTPROTO_SCO:
1841 *len_ret = sizeof (struct sockaddr_sco);
1842 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001843#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001844 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001845 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 "unknown BT protocol");
1847 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001849 }
1850 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001851#endif
1852
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001853#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 case AF_PACKET:
1855 {
1856 *len_ret = sizeof (struct sockaddr_ll);
1857 return 1;
1858 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001859#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001860
Christian Heimes043d6f62008-01-07 17:19:16 +00001861#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001862 case AF_TIPC:
1863 {
1864 *len_ret = sizeof (struct sockaddr_tipc);
1865 return 1;
1866 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001867#endif
1868
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001869#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001870 case AF_CAN:
1871 {
1872 *len_ret = sizeof (struct sockaddr_can);
1873 return 1;
1874 }
1875#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001876
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001877#ifdef PF_SYSTEM
1878 case PF_SYSTEM:
1879 switch(s->sock_proto) {
1880#ifdef SYSPROTO_CONTROL
1881 case SYSPROTO_CONTROL:
1882 *len_ret = sizeof (struct sockaddr_ctl);
1883 return 1;
1884#endif
1885 default:
1886 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1887 "unknown PF_SYSTEM protocol");
1888 return 0;
1889 }
1890#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001894 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001895 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001896 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001899}
1900
1901
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001902/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1903 Currently, these methods are only compiled if the RFC 2292/3542
1904 CMSG_LEN() macro is available. Older systems seem to have used
1905 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1906 it may be possible to define CMSG_LEN() that way if it's not
1907 provided. Some architectures might need extra padding after the
1908 cmsghdr, however, and CMSG_LEN() would have to take account of
1909 this. */
1910#ifdef CMSG_LEN
1911/* If length is in range, set *result to CMSG_LEN(length) and return
1912 true; otherwise, return false. */
1913static int
1914get_CMSG_LEN(size_t length, size_t *result)
1915{
1916 size_t tmp;
1917
1918 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1919 return 0;
1920 tmp = CMSG_LEN(length);
1921 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1922 return 0;
1923 *result = tmp;
1924 return 1;
1925}
1926
1927#ifdef CMSG_SPACE
1928/* If length is in range, set *result to CMSG_SPACE(length) and return
1929 true; otherwise, return false. */
1930static int
1931get_CMSG_SPACE(size_t length, size_t *result)
1932{
1933 size_t tmp;
1934
1935 /* Use CMSG_SPACE(1) here in order to take account of the padding
1936 necessary before *and* after the data. */
1937 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1938 return 0;
1939 tmp = CMSG_SPACE(length);
1940 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1941 return 0;
1942 *result = tmp;
1943 return 1;
1944}
1945#endif
1946
1947/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1948 pointer in msg->msg_control with at least "space" bytes after it,
1949 and its cmsg_len member inside the buffer. */
1950static int
1951cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1952{
1953 size_t cmsg_offset;
1954 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1955 sizeof(cmsgh->cmsg_len));
1956
Charles-François Natali466517d2011-08-28 18:23:43 +02001957 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001958 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001959 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001960 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1961 annoying under OS X as it's unsigned there and so it triggers a
1962 tautological comparison warning under Clang when compared against 0.
1963 Since the check is valid on other platforms, silence the warning under
1964 Clang. */
1965 #ifdef __clang__
1966 #pragma clang diagnostic push
1967 #pragma clang diagnostic ignored "-Wtautological-compare"
1968 #endif
1969 if (msg->msg_controllen < 0)
1970 return 0;
1971 #ifdef __clang__
1972 #pragma clang diagnostic pop
1973 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001974 if (space < cmsg_len_end)
1975 space = cmsg_len_end;
1976 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1977 return (cmsg_offset <= (size_t)-1 - space &&
1978 cmsg_offset + space <= msg->msg_controllen);
1979}
1980
1981/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1982 *space to number of bytes following it in the buffer and return
1983 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1984 msg->msg_controllen are valid. */
1985static int
1986get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1987{
1988 size_t data_offset;
1989 char *data_ptr;
1990
1991 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1992 return 0;
1993 data_offset = data_ptr - (char *)msg->msg_control;
1994 if (data_offset > msg->msg_controllen)
1995 return 0;
1996 *space = msg->msg_controllen - data_offset;
1997 return 1;
1998}
1999
2000/* If cmsgh is invalid or not contained in the buffer pointed to by
2001 msg->msg_control, return -1. If cmsgh is valid and its associated
2002 data is entirely contained in the buffer, set *data_len to the
2003 length of the associated data and return 0. If only part of the
2004 associated data is contained in the buffer but cmsgh is otherwise
2005 valid, set *data_len to the length contained in the buffer and
2006 return 1. */
2007static int
2008get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2009{
2010 size_t space, cmsg_data_len;
2011
2012 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2013 cmsgh->cmsg_len < CMSG_LEN(0))
2014 return -1;
2015 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2016 if (!get_cmsg_data_space(msg, cmsgh, &space))
2017 return -1;
2018 if (space >= cmsg_data_len) {
2019 *data_len = cmsg_data_len;
2020 return 0;
2021 }
2022 *data_len = space;
2023 return 1;
2024}
2025#endif /* CMSG_LEN */
2026
2027
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002028/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002029
Guido van Rossum73624e91994-10-10 17:59:00 +00002030static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002031sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002033 sock_addr_t addrbuf;
2034 SOCKET_T newfd = INVALID_SOCKET;
2035 socklen_t addrlen;
2036 PyObject *sock = NULL;
2037 PyObject *addr = NULL;
2038 PyObject *res = NULL;
2039 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002040#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2041 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2042 static int accept4_works = -1;
2043#endif
2044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 if (!getsockaddrlen(s, &addrlen))
2046 return NULL;
2047 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 if (!IS_SELECTABLE(s))
2050 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002051
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002052 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002055 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002056 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002057#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2058 if (accept4_works != 0) {
2059 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2060 SOCK_CLOEXEC);
2061 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2062 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2063 accept4_works = (errno != ENOSYS);
2064 }
2065 }
2066 if (accept4_works == 0)
2067 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2068#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002070#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002071 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 if (timeout == 1) {
2075 PyErr_SetString(socket_timeout, "timed out");
2076 return NULL;
2077 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002078 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002080 if (newfd == INVALID_SOCKET)
2081 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002082
Victor Stinnerdaf45552013-08-28 00:53:59 +02002083#ifdef MS_WINDOWS
2084 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2085 PyErr_SetFromWindowsErr(0);
2086 SOCKETCLOSE(newfd);
2087 goto finally;
2088 }
2089#else
2090
2091#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2092 if (!accept4_works)
2093#endif
2094 {
2095 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2096 SOCKETCLOSE(newfd);
2097 goto finally;
2098 }
2099 }
2100#endif
2101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 sock = PyLong_FromSocket_t(newfd);
2103 if (sock == NULL) {
2104 SOCKETCLOSE(newfd);
2105 goto finally;
2106 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002108 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2109 addrlen, s->sock_proto);
2110 if (addr == NULL)
2111 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002113 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002114
Guido van Rossum67f7a382002-06-06 21:08:16 +00002115finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 Py_XDECREF(sock);
2117 Py_XDECREF(addr);
2118 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002119}
2120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002121PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002122"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002123\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002124Wait for an incoming connection. Return a new socket file descriptor\n\
2125representing the connection, and the address of the client.\n\
2126For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002127
Guido van Rossum11ba0942002-06-13 15:07:44 +00002128/* s.setblocking(flag) method. Argument:
2129 False -- non-blocking mode; same as settimeout(0)
2130 True -- blocking mode; same as settimeout(None)
2131*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002132
Guido van Rossum73624e91994-10-10 17:59:00 +00002133static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002134sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002135{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002136 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002138 block = PyLong_AsLong(arg);
2139 if (block == -1 && PyErr_Occurred())
2140 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002142 s->sock_timeout = block ? -1.0 : 0.0;
2143 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 Py_INCREF(Py_None);
2146 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002147}
Guido van Rossume4485b01994-09-07 14:32:49 +00002148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002149PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002150"setblocking(flag)\n\
2151\n\
2152Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002153setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002154setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002155
Guido van Rossum11ba0942002-06-13 15:07:44 +00002156/* s.settimeout(timeout) method. Argument:
2157 None -- no timeout, blocking mode; same as setblocking(True)
2158 0.0 -- non-blocking mode; same as setblocking(False)
2159 > 0 -- timeout mode; operations time out after timeout seconds
2160 < 0 -- illegal; raises an exception
2161*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002162static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002163sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002165 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002167 if (arg == Py_None)
2168 timeout = -1.0;
2169 else {
2170 timeout = PyFloat_AsDouble(arg);
2171 if (timeout < 0.0) {
2172 if (!PyErr_Occurred())
2173 PyErr_SetString(PyExc_ValueError,
2174 "Timeout value out of range");
2175 return NULL;
2176 }
2177 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002179 s->sock_timeout = timeout;
2180 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 Py_INCREF(Py_None);
2183 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002184}
2185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002186PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002187"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002188\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002189Set a timeout on socket operations. 'timeout' can be a float,\n\
2190giving in seconds, or None. Setting a timeout of None disables\n\
2191the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002193
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002194/* s.gettimeout() method.
2195 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002196static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002197sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002199 if (s->sock_timeout < 0.0) {
2200 Py_INCREF(Py_None);
2201 return Py_None;
2202 }
2203 else
2204 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002205}
2206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002207PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002208"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002209\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002210Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002211operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002212operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002213
Guido van Rossumaee08791992-09-08 09:05:33 +00002214/* s.setsockopt() method.
2215 With an integer third argument, sets an integer option.
2216 With a string third argument, sets an option from a buffer;
2217 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002218
Guido van Rossum73624e91994-10-10 17:59:00 +00002219static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002220sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 int level;
2223 int optname;
2224 int res;
2225 char *buf;
2226 int buflen;
2227 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 if (PyArg_ParseTuple(args, "iii:setsockopt",
2230 &level, &optname, &flag)) {
2231 buf = (char *) &flag;
2232 buflen = sizeof flag;
2233 }
2234 else {
2235 PyErr_Clear();
2236 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2237 &level, &optname, &buf, &buflen))
2238 return NULL;
2239 }
2240 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2241 if (res < 0)
2242 return s->errorhandler();
2243 Py_INCREF(Py_None);
2244 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002245}
2246
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002247PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002248"setsockopt(level, option, value)\n\
2249\n\
2250Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002251The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002252
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002253
Guido van Rossumaee08791992-09-08 09:05:33 +00002254/* s.getsockopt() method.
2255 With two arguments, retrieves an integer option.
2256 With a third integer argument, retrieves a string buffer of that size;
2257 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002258
Guido van Rossum73624e91994-10-10 17:59:00 +00002259static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002260sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 int level;
2263 int optname;
2264 int res;
2265 PyObject *buf;
2266 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2269 &level, &optname, &buflen))
2270 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 if (buflen == 0) {
2273 int flag = 0;
2274 socklen_t flagsize = sizeof flag;
2275 res = getsockopt(s->sock_fd, level, optname,
2276 (void *)&flag, &flagsize);
2277 if (res < 0)
2278 return s->errorhandler();
2279 return PyLong_FromLong(flag);
2280 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002281 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002282 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 "getsockopt buflen out of range");
2284 return NULL;
2285 }
2286 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2287 if (buf == NULL)
2288 return NULL;
2289 res = getsockopt(s->sock_fd, level, optname,
2290 (void *)PyBytes_AS_STRING(buf), &buflen);
2291 if (res < 0) {
2292 Py_DECREF(buf);
2293 return s->errorhandler();
2294 }
2295 _PyBytes_Resize(&buf, buflen);
2296 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002297}
2298
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002299PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002300"getsockopt(level, option[, buffersize]) -> value\n\
2301\n\
2302Get a socket option. See the Unix manual for level and option.\n\
2303If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002304string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002305
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002306
Fred Drake728819a2000-07-01 03:40:12 +00002307/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002308
Guido van Rossum73624e91994-10-10 17:59:00 +00002309static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002310sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 sock_addr_t addrbuf;
2313 int addrlen;
2314 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002316 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2317 return NULL;
2318 Py_BEGIN_ALLOW_THREADS
2319 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2320 Py_END_ALLOW_THREADS
2321 if (res < 0)
2322 return s->errorhandler();
2323 Py_INCREF(Py_None);
2324 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002325}
2326
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002327PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002328"bind(address)\n\
2329\n\
2330Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002331pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002333
Guido van Rossum30a685f1991-06-27 15:51:29 +00002334
2335/* s.close() method.
2336 Set the file descriptor to -1 so operations tried subsequently
2337 will surely fail. */
2338
Guido van Rossum73624e91994-10-10 17:59:00 +00002339static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002340sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002341{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002342 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 if ((fd = s->sock_fd) != -1) {
2345 s->sock_fd = -1;
2346 Py_BEGIN_ALLOW_THREADS
2347 (void) SOCKETCLOSE(fd);
2348 Py_END_ALLOW_THREADS
2349 }
2350 Py_INCREF(Py_None);
2351 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002352}
2353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002354PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002355"close()\n\
2356\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002357Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002358
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002359static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002360sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002361{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002362 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002363 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002364 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002365}
2366
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002367PyDoc_STRVAR(detach_doc,
2368"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002369\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002370Close the socket object without closing the underlying file descriptor.\n\
2371The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002372can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002373
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002374static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002375internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 timeout = 0;
2381 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002382
2383#ifdef MS_WINDOWS
2384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 if (s->sock_timeout > 0.0) {
2386 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2387 IS_SELECTABLE(s)) {
2388 /* This is a mess. Best solution: trust select */
2389 fd_set fds;
2390 fd_set fds_exc;
2391 struct timeval tv;
2392 tv.tv_sec = (int)s->sock_timeout;
2393 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2394 FD_ZERO(&fds);
2395 FD_SET(s->sock_fd, &fds);
2396 FD_ZERO(&fds_exc);
2397 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002398 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2399 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002400 if (res == 0) {
2401 res = WSAEWOULDBLOCK;
2402 timeout = 1;
2403 } else if (res > 0) {
2404 if (FD_ISSET(s->sock_fd, &fds))
2405 /* The socket is in the writable set - this
2406 means connected */
2407 res = 0;
2408 else {
2409 /* As per MS docs, we need to call getsockopt()
2410 to get the underlying error */
2411 int res_size = sizeof res;
2412 /* It must be in the exception set */
2413 assert(FD_ISSET(s->sock_fd, &fds_exc));
2414 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2415 (char *)&res, &res_size))
2416 /* getsockopt also clears WSAGetLastError,
2417 so reset it back. */
2418 WSASetLastError(res);
2419 else
2420 res = WSAGetLastError();
2421 }
2422 }
2423 /* else if (res < 0) an error occurred */
2424 }
2425 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002426
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 if (res < 0)
2428 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002429
2430#else
2431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 if (s->sock_timeout > 0.0) {
2433 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2434 timeout = internal_select(s, 1);
2435 if (timeout == 0) {
2436 /* Bug #1019808: in case of an EINPROGRESS,
2437 use getsockopt(SO_ERROR) to get the real
2438 error. */
2439 socklen_t res_size = sizeof res;
2440 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2441 SO_ERROR, &res, &res_size);
2442 if (res == EISCONN)
2443 res = 0;
2444 errno = res;
2445 }
2446 else if (timeout == -1) {
2447 res = errno; /* had error */
2448 }
2449 else
2450 res = EWOULDBLOCK; /* timed out */
2451 }
2452 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 if (res < 0)
2455 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002456
2457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002461}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002462
Fred Drake728819a2000-07-01 03:40:12 +00002463/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002464
Guido van Rossum73624e91994-10-10 17:59:00 +00002465static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002466sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002467{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 sock_addr_t addrbuf;
2469 int addrlen;
2470 int res;
2471 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2474 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 Py_BEGIN_ALLOW_THREADS
2477 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2478 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 if (timeout == 1) {
2481 PyErr_SetString(socket_timeout, "timed out");
2482 return NULL;
2483 }
2484 if (res != 0)
2485 return s->errorhandler();
2486 Py_INCREF(Py_None);
2487 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002488}
2489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002490PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002491"connect(address)\n\
2492\n\
2493Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002494is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002495
Guido van Rossum30a685f1991-06-27 15:51:29 +00002496
Fred Drake728819a2000-07-01 03:40:12 +00002497/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002498
2499static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002500sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 sock_addr_t addrbuf;
2503 int addrlen;
2504 int res;
2505 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2508 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 Py_BEGIN_ALLOW_THREADS
2511 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2512 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002514 /* Signals are not errors (though they may raise exceptions). Adapted
2515 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002516#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (res == EINTR && PyErr_CheckSignals())
2518 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002519#endif
2520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002521 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002522}
2523
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002525"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526\n\
2527This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002528instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002529
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002530
Guido van Rossumed233a51992-06-23 09:07:03 +00002531/* s.fileno() method */
2532
Guido van Rossum73624e91994-10-10 17:59:00 +00002533static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002534sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002537}
2538
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002539PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002540"fileno() -> integer\n\
2541\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002542Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002543
Guido van Rossumed233a51992-06-23 09:07:03 +00002544
Guido van Rossumc89705d1992-11-26 08:54:07 +00002545/* s.getsockname() method */
2546
Guido van Rossum73624e91994-10-10 17:59:00 +00002547static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002548sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 sock_addr_t addrbuf;
2551 int res;
2552 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 if (!getsockaddrlen(s, &addrlen))
2555 return NULL;
2556 memset(&addrbuf, 0, addrlen);
2557 Py_BEGIN_ALLOW_THREADS
2558 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2559 Py_END_ALLOW_THREADS
2560 if (res < 0)
2561 return s->errorhandler();
2562 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2563 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002564}
2565
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002566PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002567"getsockname() -> address info\n\
2568\n\
2569Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002570info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002571
Guido van Rossumc89705d1992-11-26 08:54:07 +00002572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002574/* s.getpeername() method */
2575
Guido van Rossum73624e91994-10-10 17:59:00 +00002576static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002577sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 sock_addr_t addrbuf;
2580 int res;
2581 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002583 if (!getsockaddrlen(s, &addrlen))
2584 return NULL;
2585 memset(&addrbuf, 0, addrlen);
2586 Py_BEGIN_ALLOW_THREADS
2587 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2588 Py_END_ALLOW_THREADS
2589 if (res < 0)
2590 return s->errorhandler();
2591 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2592 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002593}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002594
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002595PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002596"getpeername() -> address info\n\
2597\n\
2598Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002599info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002600
Guido van Rossumb6775db1994-08-01 11:34:53 +00002601#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002602
2603
Guido van Rossum30a685f1991-06-27 15:51:29 +00002604/* s.listen(n) method */
2605
Guido van Rossum73624e91994-10-10 17:59:00 +00002606static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002607sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002608{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002609 /* We try to choose a default backlog high enough to avoid connection drops
2610 * for common workloads, yet not too high to limit resource usage. */
2611 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002612 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002613
Charles-François Natali644b8f52014-05-22 19:45:39 +01002614 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002615 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002618 /* To avoid problems on systems that don't allow a negative backlog
2619 * (which doesn't make sense anyway) we force a minimum value of 0. */
2620 if (backlog < 0)
2621 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 res = listen(s->sock_fd, backlog);
2623 Py_END_ALLOW_THREADS
2624 if (res < 0)
2625 return s->errorhandler();
2626 Py_INCREF(Py_None);
2627 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002628}
2629
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002630PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002631"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002632\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002633Enable a server to accept connections. If backlog is specified, it must be\n\
2634at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002635unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002636connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002637
2638
Thomas Wouters477c8d52006-05-27 19:21:47 +00002639/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002640 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002641 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002642 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002643 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002644 * also possible that we return a number of bytes smaller than the request
2645 * bytes.
2646 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002647
Antoine Pitrou19467d22010-08-17 19:33:30 +00002648static Py_ssize_t
2649sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002650{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002651 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002652 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654 if (!IS_SELECTABLE(s)) {
2655 select_error();
2656 return -1;
2657 }
2658 if (len == 0) {
2659 /* If 0 bytes were requested, do nothing. */
2660 return 0;
2661 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002662
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002663 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002665 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002666 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002667#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002668 if (len > INT_MAX)
2669 len = INT_MAX;
2670 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2671#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002672 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002673#endif
2674 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 if (timeout == 1) {
2678 PyErr_SetString(socket_timeout, "timed out");
2679 return -1;
2680 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002681 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 if (outlen < 0) {
2683 /* Note: the call to errorhandler() ALWAYS indirectly returned
2684 NULL, so ignore its return value */
2685 s->errorhandler();
2686 return -1;
2687 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002689}
2690
Guido van Rossum48a680c2001-03-02 06:34:14 +00002691
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002692/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002693
Guido van Rossum73624e91994-10-10 17:59:00 +00002694static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002695sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002696{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002697 Py_ssize_t recvlen, outlen;
2698 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002700
Antoine Pitrou19467d22010-08-17 19:33:30 +00002701 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 if (recvlen < 0) {
2705 PyErr_SetString(PyExc_ValueError,
2706 "negative buffersize in recv");
2707 return NULL;
2708 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 /* Allocate a new string. */
2711 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2712 if (buf == NULL)
2713 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 /* Call the guts */
2716 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2717 if (outlen < 0) {
2718 /* An error occurred, release the string and return an
2719 error. */
2720 Py_DECREF(buf);
2721 return NULL;
2722 }
2723 if (outlen != recvlen) {
2724 /* We did not read as many bytes as we anticipated, resize the
2725 string if possible and be successful. */
2726 _PyBytes_Resize(&buf, outlen);
2727 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002729 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002730}
2731
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002732PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002733"recv(buffersize[, flags]) -> data\n\
2734\n\
2735Receive up to buffersize bytes from the socket. For the optional flags\n\
2736argument, see the Unix manual. When no data is available, block until\n\
2737at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002738the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002739
Guido van Rossum30a685f1991-06-27 15:51:29 +00002740
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002741/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002742
Thomas Wouters477c8d52006-05-27 19:21:47 +00002743static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002744sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002747
Antoine Pitrou19467d22010-08-17 19:33:30 +00002748 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 Py_buffer pbuf;
2750 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002751 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002754 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002755 &pbuf, &recvlen, &flags))
2756 return NULL;
2757 buf = pbuf.buf;
2758 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760 if (recvlen < 0) {
2761 PyBuffer_Release(&pbuf);
2762 PyErr_SetString(PyExc_ValueError,
2763 "negative buffersize in recv_into");
2764 return NULL;
2765 }
2766 if (recvlen == 0) {
2767 /* If nbytes was not specified, use the buffer's length */
2768 recvlen = buflen;
2769 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002771 /* Check if the buffer is large enough */
2772 if (buflen < recvlen) {
2773 PyBuffer_Release(&pbuf);
2774 PyErr_SetString(PyExc_ValueError,
2775 "buffer too small for requested bytes");
2776 return NULL;
2777 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002779 /* Call the guts */
2780 readlen = sock_recv_guts(s, buf, recvlen, flags);
2781 if (readlen < 0) {
2782 /* Return an error. */
2783 PyBuffer_Release(&pbuf);
2784 return NULL;
2785 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002787 PyBuffer_Release(&pbuf);
2788 /* Return the number of bytes read. Note that we do not do anything
2789 special here in the case that readlen < recvlen. */
2790 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002791}
2792
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002793PyDoc_STRVAR(recv_into_doc,
2794"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002795\n\
2796A version of recv() that stores its data into a buffer rather than creating \n\
2797a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2798is not specified (or 0), receive up to the size available in the given buffer.\n\
2799\n\
2800See recv() for documentation about the flags.");
2801
2802
2803/*
Christian Heimes99170a52007-12-19 02:07:34 +00002804 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2805 * into a char buffer. If you have any inc/def ref to do to the objects that
2806 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002807 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002808 * that it is also possible that we return a number of bytes smaller than the
2809 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002810 *
2811 * 'addr' is a return value for the address object. Note that you must decref
2812 * it yourself.
2813 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002814static Py_ssize_t
2815sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 sock_addr_t addrbuf;
2819 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002820 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 if (!getsockaddrlen(s, &addrlen))
2826 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 if (!IS_SELECTABLE(s)) {
2829 select_error();
2830 return -1;
2831 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002832
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002833 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 Py_BEGIN_ALLOW_THREADS
2835 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002836 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002838#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002839 if (len > INT_MAX)
2840 len = INT_MAX;
2841 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002843#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 n = recvfrom(s->sock_fd, cbuf, len, flags,
2845 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002846#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002847 }
2848 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002850 if (timeout == 1) {
2851 PyErr_SetString(socket_timeout, "timed out");
2852 return -1;
2853 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002854 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 if (n < 0) {
2856 s->errorhandler();
2857 return -1;
2858 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2861 addrlen, s->sock_proto)))
2862 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002863
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002864 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002865}
2866
2867/* s.recvfrom(nbytes [,flags]) method */
2868
2869static PyObject *
2870sock_recvfrom(PySocketSockObject *s, PyObject *args)
2871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 PyObject *buf = NULL;
2873 PyObject *addr = NULL;
2874 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002875 int flags = 0;
2876 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877
Antoine Pitrou19467d22010-08-17 19:33:30 +00002878 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 if (recvlen < 0) {
2882 PyErr_SetString(PyExc_ValueError,
2883 "negative buffersize in recvfrom");
2884 return NULL;
2885 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2888 if (buf == NULL)
2889 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2892 recvlen, flags, &addr);
2893 if (outlen < 0) {
2894 goto finally;
2895 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 if (outlen != recvlen) {
2898 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002899 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002901 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 goto finally;
2903 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002906
2907finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 Py_XDECREF(buf);
2909 Py_XDECREF(addr);
2910 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002911}
2912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002913PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002914"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2915\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002916Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002917
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002919/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002920
2921static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002922sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002923{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925
Antoine Pitrou19467d22010-08-17 19:33:30 +00002926 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002927 Py_buffer pbuf;
2928 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002929 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002932
Antoine Pitrou19467d22010-08-17 19:33:30 +00002933 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 kwlist, &pbuf,
2935 &recvlen, &flags))
2936 return NULL;
2937 buf = pbuf.buf;
2938 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 if (recvlen < 0) {
2941 PyBuffer_Release(&pbuf);
2942 PyErr_SetString(PyExc_ValueError,
2943 "negative buffersize in recvfrom_into");
2944 return NULL;
2945 }
2946 if (recvlen == 0) {
2947 /* If nbytes was not specified, use the buffer's length */
2948 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05002949 } else if (recvlen > buflen) {
2950 PyBuffer_Release(&pbuf);
2951 PyErr_SetString(PyExc_ValueError,
2952 "nbytes is greater than the length of the buffer");
2953 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002956 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2957 if (readlen < 0) {
2958 PyBuffer_Release(&pbuf);
2959 /* Return an error */
2960 Py_XDECREF(addr);
2961 return NULL;
2962 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002964 PyBuffer_Release(&pbuf);
2965 /* Return the number of bytes read and the address. Note that we do
2966 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002967 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002968}
2969
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002970PyDoc_STRVAR(recvfrom_into_doc,
2971"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002972\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002973Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002974
2975
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002976/* The sendmsg() and recvmsg[_into]() methods require a working
2977 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2978#ifdef CMSG_LEN
2979/*
2980 * Call recvmsg() with the supplied iovec structures, flags, and
2981 * ancillary data buffer size (controllen). Returns the tuple return
2982 * value for recvmsg() or recvmsg_into(), with the first item provided
2983 * by the supplied makeval() function. makeval() will be called with
2984 * the length read and makeval_data as arguments, and must return a
2985 * new reference (which will be decrefed if there is a subsequent
2986 * error). On error, closes any file descriptors received via
2987 * SCM_RIGHTS.
2988 */
2989static PyObject *
2990sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2991 int flags, Py_ssize_t controllen,
2992 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2993{
2994 ssize_t bytes_received = -1;
2995 int timeout;
2996 sock_addr_t addrbuf;
2997 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002998 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002999 PyObject *cmsg_list = NULL, *retval = NULL;
3000 void *controlbuf = NULL;
3001 struct cmsghdr *cmsgh;
3002 size_t cmsgdatalen = 0;
3003 int cmsg_status;
3004
3005 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3006 ignored" when the socket is connected (Linux fills them in
3007 anyway for AF_UNIX sockets at least). Normally msg_namelen
3008 seems to be set to 0 if there's no address, but try to
3009 initialize msg_name to something that won't be mistaken for a
3010 real address if that doesn't happen. */
3011 if (!getsockaddrlen(s, &addrbuflen))
3012 return NULL;
3013 memset(&addrbuf, 0, addrbuflen);
3014 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3015
3016 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3017 PyErr_SetString(PyExc_ValueError,
3018 "invalid ancillary data buffer length");
3019 return NULL;
3020 }
3021 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3022 return PyErr_NoMemory();
3023
3024 /* Make the system call. */
3025 if (!IS_SELECTABLE(s)) {
3026 select_error();
3027 goto finally;
3028 }
3029
3030 BEGIN_SELECT_LOOP(s)
3031 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003032 msg.msg_name = SAS2SA(&addrbuf);
3033 msg.msg_namelen = addrbuflen;
3034 msg.msg_iov = iov;
3035 msg.msg_iovlen = iovlen;
3036 msg.msg_control = controlbuf;
3037 msg.msg_controllen = controllen;
3038 timeout = internal_select_ex(s, 0, interval);
3039 if (!timeout)
3040 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3041 Py_END_ALLOW_THREADS;
3042 if (timeout == 1) {
3043 PyErr_SetString(socket_timeout, "timed out");
3044 goto finally;
3045 }
3046 END_SELECT_LOOP(s)
3047
3048 if (bytes_received < 0) {
3049 s->errorhandler();
3050 goto finally;
3051 }
3052
3053 /* Make list of (level, type, data) tuples from control messages. */
3054 if ((cmsg_list = PyList_New(0)) == NULL)
3055 goto err_closefds;
3056 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3057 implementations didn't do so. */
3058 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3059 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3060 PyObject *bytes, *tuple;
3061 int tmp;
3062
3063 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3064 if (cmsg_status != 0) {
3065 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3066 "received malformed or improperly-truncated "
3067 "ancillary data", 1) == -1)
3068 goto err_closefds;
3069 }
3070 if (cmsg_status < 0)
3071 break;
3072 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003073 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003074 goto err_closefds;
3075 }
3076
3077 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3078 cmsgdatalen);
3079 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3080 (int)cmsgh->cmsg_type, bytes);
3081 if (tuple == NULL)
3082 goto err_closefds;
3083 tmp = PyList_Append(cmsg_list, tuple);
3084 Py_DECREF(tuple);
3085 if (tmp != 0)
3086 goto err_closefds;
3087
3088 if (cmsg_status != 0)
3089 break;
3090 }
3091
3092 retval = Py_BuildValue("NOiN",
3093 (*makeval)(bytes_received, makeval_data),
3094 cmsg_list,
3095 (int)msg.msg_flags,
3096 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3097 ((msg.msg_namelen > addrbuflen) ?
3098 addrbuflen : msg.msg_namelen),
3099 s->sock_proto));
3100 if (retval == NULL)
3101 goto err_closefds;
3102
3103finally:
3104 Py_XDECREF(cmsg_list);
3105 PyMem_Free(controlbuf);
3106 return retval;
3107
3108err_closefds:
3109#ifdef SCM_RIGHTS
3110 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3111 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3112 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3113 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3114 if (cmsg_status < 0)
3115 break;
3116 if (cmsgh->cmsg_level == SOL_SOCKET &&
3117 cmsgh->cmsg_type == SCM_RIGHTS) {
3118 size_t numfds;
3119 int *fdp;
3120
3121 numfds = cmsgdatalen / sizeof(int);
3122 fdp = (int *)CMSG_DATA(cmsgh);
3123 while (numfds-- > 0)
3124 close(*fdp++);
3125 }
3126 if (cmsg_status != 0)
3127 break;
3128 }
3129#endif /* SCM_RIGHTS */
3130 goto finally;
3131}
3132
3133
3134static PyObject *
3135makeval_recvmsg(ssize_t received, void *data)
3136{
3137 PyObject **buf = data;
3138
3139 if (received < PyBytes_GET_SIZE(*buf))
3140 _PyBytes_Resize(buf, received);
3141 Py_XINCREF(*buf);
3142 return *buf;
3143}
3144
3145/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3146
3147static PyObject *
3148sock_recvmsg(PySocketSockObject *s, PyObject *args)
3149{
3150 Py_ssize_t bufsize, ancbufsize = 0;
3151 int flags = 0;
3152 struct iovec iov;
3153 PyObject *buf = NULL, *retval = NULL;
3154
3155 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3156 return NULL;
3157
3158 if (bufsize < 0) {
3159 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3160 return NULL;
3161 }
3162 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3163 return NULL;
3164 iov.iov_base = PyBytes_AS_STRING(buf);
3165 iov.iov_len = bufsize;
3166
3167 /* Note that we're passing a pointer to *our pointer* to the bytes
3168 object here (&buf); makeval_recvmsg() may incref the object, or
3169 deallocate it and set our pointer to NULL. */
3170 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3171 &makeval_recvmsg, &buf);
3172 Py_XDECREF(buf);
3173 return retval;
3174}
3175
3176PyDoc_STRVAR(recvmsg_doc,
3177"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3178\n\
3179Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3180socket. The ancbufsize argument sets the size in bytes of the\n\
3181internal buffer used to receive the ancillary data; it defaults to 0,\n\
3182meaning that no ancillary data will be received. Appropriate buffer\n\
3183sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3184CMSG_LEN(), and items which do not fit into the buffer might be\n\
3185truncated or discarded. The flags argument defaults to 0 and has the\n\
3186same meaning as for recv().\n\
3187\n\
3188The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3189The data item is a bytes object holding the non-ancillary data\n\
3190received. The ancdata item is a list of zero or more tuples\n\
3191(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3192(control messages) received: cmsg_level and cmsg_type are integers\n\
3193specifying the protocol level and protocol-specific type respectively,\n\
3194and cmsg_data is a bytes object holding the associated data. The\n\
3195msg_flags item is the bitwise OR of various flags indicating\n\
3196conditions on the received message; see your system documentation for\n\
3197details. If the receiving socket is unconnected, address is the\n\
3198address of the sending socket, if available; otherwise, its value is\n\
3199unspecified.\n\
3200\n\
3201If recvmsg() raises an exception after the system call returns, it\n\
3202will first attempt to close any file descriptors received via the\n\
3203SCM_RIGHTS mechanism.");
3204
3205
3206static PyObject *
3207makeval_recvmsg_into(ssize_t received, void *data)
3208{
3209 return PyLong_FromSsize_t(received);
3210}
3211
3212/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3213
3214static PyObject *
3215sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3216{
3217 Py_ssize_t ancbufsize = 0;
3218 int flags = 0;
3219 struct iovec *iovs = NULL;
3220 Py_ssize_t i, nitems, nbufs = 0;
3221 Py_buffer *bufs = NULL;
3222 PyObject *buffers_arg, *fast, *retval = NULL;
3223
3224 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3225 &buffers_arg, &ancbufsize, &flags))
3226 return NULL;
3227
3228 if ((fast = PySequence_Fast(buffers_arg,
3229 "recvmsg_into() argument 1 must be an "
3230 "iterable")) == NULL)
3231 return NULL;
3232 nitems = PySequence_Fast_GET_SIZE(fast);
3233 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003234 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003235 goto finally;
3236 }
3237
3238 /* Fill in an iovec for each item, and save the Py_buffer
3239 structs to release afterwards. */
3240 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3241 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3242 PyErr_NoMemory();
3243 goto finally;
3244 }
3245 for (; nbufs < nitems; nbufs++) {
3246 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3247 "w*;recvmsg_into() argument 1 must be an iterable "
3248 "of single-segment read-write buffers",
3249 &bufs[nbufs]))
3250 goto finally;
3251 iovs[nbufs].iov_base = bufs[nbufs].buf;
3252 iovs[nbufs].iov_len = bufs[nbufs].len;
3253 }
3254
3255 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3256 &makeval_recvmsg_into, NULL);
3257finally:
3258 for (i = 0; i < nbufs; i++)
3259 PyBuffer_Release(&bufs[i]);
3260 PyMem_Free(bufs);
3261 PyMem_Free(iovs);
3262 Py_DECREF(fast);
3263 return retval;
3264}
3265
3266PyDoc_STRVAR(recvmsg_into_doc,
3267"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3268\n\
3269Receive normal data and ancillary data from the socket, scattering the\n\
3270non-ancillary data into a series of buffers. The buffers argument\n\
3271must be an iterable of objects that export writable buffers\n\
3272(e.g. bytearray objects); these will be filled with successive chunks\n\
3273of the non-ancillary data until it has all been written or there are\n\
3274no more buffers. The ancbufsize argument sets the size in bytes of\n\
3275the internal buffer used to receive the ancillary data; it defaults to\n\
32760, meaning that no ancillary data will be received. Appropriate\n\
3277buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3278or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3279truncated or discarded. The flags argument defaults to 0 and has the\n\
3280same meaning as for recv().\n\
3281\n\
3282The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3283The nbytes item is the total number of bytes of non-ancillary data\n\
3284written into the buffers. The ancdata item is a list of zero or more\n\
3285tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3286data (control messages) received: cmsg_level and cmsg_type are\n\
3287integers specifying the protocol level and protocol-specific type\n\
3288respectively, and cmsg_data is a bytes object holding the associated\n\
3289data. The msg_flags item is the bitwise OR of various flags\n\
3290indicating conditions on the received message; see your system\n\
3291documentation for details. If the receiving socket is unconnected,\n\
3292address is the address of the sending socket, if available; otherwise,\n\
3293its value is unspecified.\n\
3294\n\
3295If recvmsg_into() raises an exception after the system call returns,\n\
3296it will first attempt to close any file descriptors received via the\n\
3297SCM_RIGHTS mechanism.");
3298#endif /* CMSG_LEN */
3299
3300
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003301/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003302
Guido van Rossum73624e91994-10-10 17:59:00 +00003303static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003304sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003306 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003307 Py_ssize_t len, n = -1;
3308 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003309 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003311 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3312 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 if (!IS_SELECTABLE(s)) {
3315 PyBuffer_Release(&pbuf);
3316 return select_error();
3317 }
3318 buf = pbuf.buf;
3319 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003320
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003321 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003323 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003324 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003325#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003326 if (len > INT_MAX)
3327 len = INT_MAX;
3328 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003329#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003331#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003332 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003333 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003335 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 PyErr_SetString(socket_timeout, "timed out");
3337 return NULL;
3338 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003339 END_SELECT_LOOP(s)
3340
3341 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003342 if (n < 0)
3343 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003344 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003345}
3346
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003347PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003348"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003349\n\
3350Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003351argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003352sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003353
3354
3355/* s.sendall(data [,flags]) method */
3356
3357static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003358sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003360 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003361 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003362 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003365 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3366 return NULL;
3367 buf = pbuf.buf;
3368 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003370 if (!IS_SELECTABLE(s)) {
3371 PyBuffer_Release(&pbuf);
3372 return select_error();
3373 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003374
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003376 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003377 timeout = internal_select(s, 1);
3378 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003379 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003380#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003381 if (len > INT_MAX)
3382 len = INT_MAX;
3383 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003384#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003385 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003386#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003387 }
3388 Py_END_ALLOW_THREADS
3389 if (timeout == 1) {
3390 PyBuffer_Release(&pbuf);
3391 PyErr_SetString(socket_timeout, "timed out");
3392 return NULL;
3393 }
3394 /* PyErr_CheckSignals() might change errno */
3395 saved_errno = errno;
3396 /* We must run our signal handlers before looping again.
3397 send() can return a successful partial write when it is
3398 interrupted, so we can't restrict ourselves to EINTR. */
3399 if (PyErr_CheckSignals()) {
3400 PyBuffer_Release(&pbuf);
3401 return NULL;
3402 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003404 /* If interrupted, try again */
3405 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003406 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003407 else
3408 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 }
3410 buf += n;
3411 len -= n;
3412 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003415 if (n < 0)
3416 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 Py_INCREF(Py_None);
3419 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003420}
3421
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003422PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003423"sendall(data[, flags])\n\
3424\n\
3425Send a data string to the socket. For the optional flags\n\
3426argument, see the Unix manual. This calls send() repeatedly\n\
3427until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003428to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003429
Guido van Rossum30a685f1991-06-27 15:51:29 +00003430
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003431/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003432
Guido van Rossum73624e91994-10-10 17:59:00 +00003433static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003434sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003435{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003436 Py_buffer pbuf;
3437 PyObject *addro;
3438 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003439 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 sock_addr_t addrbuf;
3441 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003442
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003443 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003444 arglen = PyTuple_Size(args);
3445 switch (arglen) {
3446 case 2:
3447 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3448 break;
3449 case 3:
3450 PyArg_ParseTuple(args, "y*iO:sendto",
3451 &pbuf, &flags, &addro);
3452 break;
3453 default:
3454 PyErr_Format(PyExc_TypeError,
3455 "sendto() takes 2 or 3 arguments (%d given)",
3456 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003457 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003458 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003459 if (PyErr_Occurred())
3460 return NULL;
3461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003462 buf = pbuf.buf;
3463 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003465 if (!IS_SELECTABLE(s)) {
3466 PyBuffer_Release(&pbuf);
3467 return select_error();
3468 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3471 PyBuffer_Release(&pbuf);
3472 return NULL;
3473 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003474
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003475 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003476 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003477 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003478 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003479#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003480 if (len > INT_MAX)
3481 len = INT_MAX;
3482 n = sendto(s->sock_fd, buf, (int)len, flags,
3483 SAS2SA(&addrbuf), addrlen);
3484#else
3485 n = sendto(s->sock_fd, buf, len, flags,
3486 SAS2SA(&addrbuf), addrlen);
3487#endif
3488 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003492 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003493 PyErr_SetString(socket_timeout, "timed out");
3494 return NULL;
3495 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003496 END_SELECT_LOOP(s)
3497 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003498 if (n < 0)
3499 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003500 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003501}
3502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003503PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003504"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003505\n\
3506Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003507For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003508
Guido van Rossum30a685f1991-06-27 15:51:29 +00003509
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003510/* The sendmsg() and recvmsg[_into]() methods require a working
3511 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3512#ifdef CMSG_LEN
3513/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3514
3515static PyObject *
3516sock_sendmsg(PySocketSockObject *s, PyObject *args)
3517{
3518 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3519 Py_buffer *databufs = NULL;
3520 struct iovec *iovs = NULL;
3521 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003522 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003523 struct cmsginfo {
3524 int level;
3525 int type;
3526 Py_buffer data;
3527 } *cmsgs = NULL;
3528 void *controlbuf = NULL;
3529 size_t controllen, controllen_last;
3530 ssize_t bytes_sent = -1;
3531 int addrlen, timeout, flags = 0;
3532 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3533 *cmsg_fast = NULL, *retval = NULL;
3534
3535 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3536 &data_arg, &cmsg_arg, &flags, &addr_arg))
3537 return NULL;
3538
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003539 /* Parse destination address. */
3540 if (addr_arg != NULL && addr_arg != Py_None) {
3541 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3542 goto finally;
3543 msg.msg_name = &addrbuf;
3544 msg.msg_namelen = addrlen;
3545 }
3546
3547 /* Fill in an iovec for each message part, and save the Py_buffer
3548 structs to release afterwards. */
3549 if ((data_fast = PySequence_Fast(data_arg,
3550 "sendmsg() argument 1 must be an "
3551 "iterable")) == NULL)
3552 goto finally;
3553 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3554 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003555 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003556 goto finally;
3557 }
3558 msg.msg_iovlen = ndataparts;
3559 if (ndataparts > 0 &&
3560 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3561 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3562 PyErr_NoMemory();
3563 goto finally;
3564 }
3565 for (; ndatabufs < ndataparts; ndatabufs++) {
3566 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3567 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003568 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003569 &databufs[ndatabufs]))
3570 goto finally;
3571 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3572 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3573 }
3574
3575 if (cmsg_arg == NULL)
3576 ncmsgs = 0;
3577 else {
3578 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3579 "sendmsg() argument 2 must be an "
3580 "iterable")) == NULL)
3581 goto finally;
3582 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3583 }
3584
3585#ifndef CMSG_SPACE
3586 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003587 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003588 "sending multiple control messages is not supported "
3589 "on this system");
3590 goto finally;
3591 }
3592#endif
3593 /* Save level, type and Py_buffer for each control message,
3594 and calculate total size. */
3595 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3596 PyErr_NoMemory();
3597 goto finally;
3598 }
3599 controllen = controllen_last = 0;
3600 while (ncmsgbufs < ncmsgs) {
3601 size_t bufsize, space;
3602
3603 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3604 "(iiy*):[sendmsg() ancillary data items]",
3605 &cmsgs[ncmsgbufs].level,
3606 &cmsgs[ncmsgbufs].type,
3607 &cmsgs[ncmsgbufs].data))
3608 goto finally;
3609 bufsize = cmsgs[ncmsgbufs++].data.len;
3610
3611#ifdef CMSG_SPACE
3612 if (!get_CMSG_SPACE(bufsize, &space)) {
3613#else
3614 if (!get_CMSG_LEN(bufsize, &space)) {
3615#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003616 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003617 goto finally;
3618 }
3619 controllen += space;
3620 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003621 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003622 goto finally;
3623 }
3624 controllen_last = controllen;
3625 }
3626
3627 /* Construct ancillary data block from control message info. */
3628 if (ncmsgbufs > 0) {
3629 struct cmsghdr *cmsgh = NULL;
3630
3631 if ((msg.msg_control = controlbuf =
3632 PyMem_Malloc(controllen)) == NULL) {
3633 PyErr_NoMemory();
3634 goto finally;
3635 }
3636 msg.msg_controllen = controllen;
3637
3638 /* Need to zero out the buffer as a workaround for glibc's
3639 CMSG_NXTHDR() implementation. After getting the pointer to
3640 the next header, it checks its (uninitialized) cmsg_len
3641 member to see if the "message" fits in the buffer, and
3642 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003643 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003644 memset(controlbuf, 0, controllen);
3645
3646 for (i = 0; i < ncmsgbufs; i++) {
3647 size_t msg_len, data_len = cmsgs[i].data.len;
3648 int enough_space = 0;
3649
3650 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3651 if (cmsgh == NULL) {
3652 PyErr_Format(PyExc_RuntimeError,
3653 "unexpected NULL result from %s()",
3654 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3655 goto finally;
3656 }
3657 if (!get_CMSG_LEN(data_len, &msg_len)) {
3658 PyErr_SetString(PyExc_RuntimeError,
3659 "item size out of range for CMSG_LEN()");
3660 goto finally;
3661 }
3662 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3663 size_t space;
3664
3665 cmsgh->cmsg_len = msg_len;
3666 if (get_cmsg_data_space(&msg, cmsgh, &space))
3667 enough_space = (space >= data_len);
3668 }
3669 if (!enough_space) {
3670 PyErr_SetString(PyExc_RuntimeError,
3671 "ancillary data does not fit in calculated "
3672 "space");
3673 goto finally;
3674 }
3675 cmsgh->cmsg_level = cmsgs[i].level;
3676 cmsgh->cmsg_type = cmsgs[i].type;
3677 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3678 }
3679 }
3680
3681 /* Make the system call. */
3682 if (!IS_SELECTABLE(s)) {
3683 select_error();
3684 goto finally;
3685 }
3686
3687 BEGIN_SELECT_LOOP(s)
3688 Py_BEGIN_ALLOW_THREADS;
3689 timeout = internal_select_ex(s, 1, interval);
3690 if (!timeout)
3691 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3692 Py_END_ALLOW_THREADS;
3693 if (timeout == 1) {
3694 PyErr_SetString(socket_timeout, "timed out");
3695 goto finally;
3696 }
3697 END_SELECT_LOOP(s)
3698
3699 if (bytes_sent < 0) {
3700 s->errorhandler();
3701 goto finally;
3702 }
3703 retval = PyLong_FromSsize_t(bytes_sent);
3704
3705finally:
3706 PyMem_Free(controlbuf);
3707 for (i = 0; i < ncmsgbufs; i++)
3708 PyBuffer_Release(&cmsgs[i].data);
3709 PyMem_Free(cmsgs);
3710 Py_XDECREF(cmsg_fast);
3711 for (i = 0; i < ndatabufs; i++)
3712 PyBuffer_Release(&databufs[i]);
3713 PyMem_Free(databufs);
3714 PyMem_Free(iovs);
3715 Py_XDECREF(data_fast);
3716 return retval;
3717}
3718
3719PyDoc_STRVAR(sendmsg_doc,
3720"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3721\n\
3722Send normal and ancillary data to the socket, gathering the\n\
3723non-ancillary data from a series of buffers and concatenating it into\n\
3724a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003725data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003726The ancdata argument specifies the ancillary data (control messages)\n\
3727as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3728cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3729protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003730is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731argument defaults to 0 and has the same meaning as for send(). If\n\
3732address is supplied and not None, it sets a destination address for\n\
3733the message. The return value is the number of bytes of non-ancillary\n\
3734data sent.");
3735#endif /* CMSG_LEN */
3736
3737
Guido van Rossum30a685f1991-06-27 15:51:29 +00003738/* s.shutdown(how) method */
3739
Guido van Rossum73624e91994-10-10 17:59:00 +00003740static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003741sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003742{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003743 int how;
3744 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003745
Serhiy Storchaka78980432013-01-15 01:12:17 +02003746 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003747 if (how == -1 && PyErr_Occurred())
3748 return NULL;
3749 Py_BEGIN_ALLOW_THREADS
3750 res = shutdown(s->sock_fd, how);
3751 Py_END_ALLOW_THREADS
3752 if (res < 0)
3753 return s->errorhandler();
3754 Py_INCREF(Py_None);
3755 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003756}
3757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003758PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003759"shutdown(flag)\n\
3760\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003761Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3762of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003763
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003764#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003765static PyObject*
3766sock_ioctl(PySocketSockObject *s, PyObject *arg)
3767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 unsigned long cmd = SIO_RCVALL;
3769 PyObject *argO;
3770 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003771
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003772 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3773 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003775 switch (cmd) {
3776 case SIO_RCVALL: {
3777 unsigned int option = RCVALL_ON;
3778 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3779 return NULL;
3780 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3781 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3782 return set_error();
3783 }
3784 return PyLong_FromUnsignedLong(recv); }
3785 case SIO_KEEPALIVE_VALS: {
3786 struct tcp_keepalive ka;
3787 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3788 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3789 return NULL;
3790 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3791 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3792 return set_error();
3793 }
3794 return PyLong_FromUnsignedLong(recv); }
3795 default:
3796 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3797 return NULL;
3798 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003799}
3800PyDoc_STRVAR(sock_ioctl_doc,
3801"ioctl(cmd, option) -> long\n\
3802\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003803Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3804SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3805SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003806#endif
3807
3808#if defined(MS_WINDOWS)
3809static PyObject*
3810sock_share(PySocketSockObject *s, PyObject *arg)
3811{
3812 WSAPROTOCOL_INFO info;
3813 DWORD processId;
3814 int result;
3815
3816 if (!PyArg_ParseTuple(arg, "I", &processId))
3817 return NULL;
3818
3819 Py_BEGIN_ALLOW_THREADS
3820 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3821 Py_END_ALLOW_THREADS
3822 if (result == SOCKET_ERROR)
3823 return set_error();
3824 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3825}
3826PyDoc_STRVAR(sock_share_doc,
3827"share(process_id) -> bytes\n\
3828\n\
3829Share the socket with another process. The target process id\n\
3830must be provided and the resulting bytes object passed to the target\n\
3831process. There the shared socket can be instantiated by calling\n\
3832socket.fromshare().");
3833
Christian Heimesfaf2f632008-01-06 16:59:19 +00003834
3835#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003836
3837/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003838
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003839static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003840 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3841 accept_doc},
3842 {"bind", (PyCFunction)sock_bind, METH_O,
3843 bind_doc},
3844 {"close", (PyCFunction)sock_close, METH_NOARGS,
3845 close_doc},
3846 {"connect", (PyCFunction)sock_connect, METH_O,
3847 connect_doc},
3848 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3849 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003850 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3851 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3853 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003854#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003855 {"getpeername", (PyCFunction)sock_getpeername,
3856 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003858 {"getsockname", (PyCFunction)sock_getsockname,
3859 METH_NOARGS, getsockname_doc},
3860 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3861 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003862#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003863 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3864 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003865#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003866#if defined(MS_WINDOWS)
3867 {"share", (PyCFunction)sock_share, METH_VARARGS,
3868 sock_share_doc},
3869#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003870 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003871 listen_doc},
3872 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3873 recv_doc},
3874 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3875 recv_into_doc},
3876 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3877 recvfrom_doc},
3878 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3879 recvfrom_into_doc},
3880 {"send", (PyCFunction)sock_send, METH_VARARGS,
3881 send_doc},
3882 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3883 sendall_doc},
3884 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3885 sendto_doc},
3886 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3887 setblocking_doc},
3888 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3889 settimeout_doc},
3890 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3891 gettimeout_doc},
3892 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3893 setsockopt_doc},
3894 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3895 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003896#ifdef CMSG_LEN
3897 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3898 recvmsg_doc},
3899 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3900 recvmsg_into_doc,},
3901 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3902 sendmsg_doc},
3903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003904 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003905};
3906
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003907/* SockObject members */
3908static PyMemberDef sock_memberlist[] = {
3909 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3910 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3911 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3912 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3913 {0},
3914};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003915
Guido van Rossum73624e91994-10-10 17:59:00 +00003916/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003917 First close the file description. */
3918
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003919static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003920sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003921{
Antoine Pitroue033e062010-10-29 10:38:18 +00003922 if (s->sock_fd != -1) {
3923 PyObject *exc, *val, *tb;
3924 Py_ssize_t old_refcount = Py_REFCNT(s);
3925 ++Py_REFCNT(s);
3926 PyErr_Fetch(&exc, &val, &tb);
3927 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3928 "unclosed %R", s))
3929 /* Spurious errors can appear at shutdown */
3930 if (PyErr_ExceptionMatches(PyExc_Warning))
3931 PyErr_WriteUnraisable((PyObject *) s);
3932 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003933 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003934 Py_REFCNT(s) = old_refcount;
3935 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003936 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003937}
3938
Guido van Rossum30a685f1991-06-27 15:51:29 +00003939
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003940static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003941sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003942{
Victor Stinnere254e532014-07-26 14:36:55 +02003943 long sock_fd;
3944 /* On Windows, this test is needed because SOCKET_T is unsigned */
3945 if (s->sock_fd == INVALID_SOCKET) {
3946 sock_fd = -1;
3947 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003948#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02003949 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 /* this can occur on Win64, and actually there is a special
3951 ugly printf formatter for decimal pointer length integer
3952 printing, only bother if necessary*/
3953 PyErr_SetString(PyExc_OverflowError,
3954 "no printf formatter to display "
3955 "the socket descriptor in decimal");
3956 return NULL;
3957 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003958#endif
Victor Stinnere254e532014-07-26 14:36:55 +02003959 else
3960 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003961 return PyUnicode_FromFormat(
3962 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02003963 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003964 s->sock_type,
3965 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003966}
3967
3968
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003969/* Create a new, uninitialized socket object. */
3970
3971static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003972sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003973{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003974 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003976 new = type->tp_alloc(type, 0);
3977 if (new != NULL) {
3978 ((PySocketSockObject *)new)->sock_fd = -1;
3979 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3980 ((PySocketSockObject *)new)->errorhandler = &set_error;
3981 }
3982 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003983}
3984
3985
3986/* Initialize a new socket object. */
3987
Victor Stinnerdaf45552013-08-28 00:53:59 +02003988#ifdef SOCK_CLOEXEC
3989/* socket() and socketpair() fail with EINVAL on Linux kernel older
3990 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3991static int sock_cloexec_works = -1;
3992#endif
3993
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003994/*ARGSUSED*/
3995static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003996sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003998 PySocketSockObject *s = (PySocketSockObject *)self;
3999 PyObject *fdobj = NULL;
4000 SOCKET_T fd = INVALID_SOCKET;
4001 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4002 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004003#ifndef MS_WINDOWS
4004#ifdef SOCK_CLOEXEC
4005 int *atomic_flag_works = &sock_cloexec_works;
4006#else
4007 int *atomic_flag_works = NULL;
4008#endif
4009#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4012 "|iiiO:socket", keywords,
4013 &family, &type, &proto, &fdobj))
4014 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004016 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004017#ifdef MS_WINDOWS
4018 /* recreate a socket that was duplicated */
4019 if (PyBytes_Check(fdobj)) {
4020 WSAPROTOCOL_INFO info;
4021 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4022 PyErr_Format(PyExc_ValueError,
4023 "socket descriptor string has wrong size, "
4024 "should be %zu bytes.", sizeof(info));
4025 return -1;
4026 }
4027 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4028 Py_BEGIN_ALLOW_THREADS
4029 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4030 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4031 Py_END_ALLOW_THREADS
4032 if (fd == INVALID_SOCKET) {
4033 set_error();
4034 return -1;
4035 }
4036 family = info.iAddressFamily;
4037 type = info.iSocketType;
4038 proto = info.iProtocol;
4039 }
4040 else
4041#endif
4042 {
4043 fd = PyLong_AsSocket_t(fdobj);
4044 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4045 return -1;
4046 if (fd == INVALID_SOCKET) {
4047 PyErr_SetString(PyExc_ValueError,
4048 "can't use invalid socket value");
4049 return -1;
4050 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 }
4052 }
4053 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004054#ifdef MS_WINDOWS
4055 /* Windows implementation */
4056#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4057#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4058#endif
4059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004061 if (support_wsa_no_inherit) {
4062 fd = WSASocket(family, type, proto,
4063 NULL, 0,
4064 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4065 if (fd == INVALID_SOCKET) {
4066 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4067 support_wsa_no_inherit = 0;
4068 fd = socket(family, type, proto);
4069 }
4070 }
4071 else {
4072 fd = socket(family, type, proto);
4073 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004074 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 if (fd == INVALID_SOCKET) {
4077 set_error();
4078 return -1;
4079 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004080
4081 if (!support_wsa_no_inherit) {
4082 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4083 closesocket(fd);
4084 PyErr_SetFromWindowsErr(0);
4085 return -1;
4086 }
4087 }
4088#else
4089 /* UNIX */
4090 Py_BEGIN_ALLOW_THREADS
4091#ifdef SOCK_CLOEXEC
4092 if (sock_cloexec_works != 0) {
4093 fd = socket(family, type | SOCK_CLOEXEC, proto);
4094 if (sock_cloexec_works == -1) {
4095 if (fd >= 0) {
4096 sock_cloexec_works = 1;
4097 }
4098 else if (errno == EINVAL) {
4099 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4100 sock_cloexec_works = 0;
4101 fd = socket(family, type, proto);
4102 }
4103 }
4104 }
4105 else
4106#endif
4107 {
4108 fd = socket(family, type, proto);
4109 }
4110 Py_END_ALLOW_THREADS
4111
4112 if (fd == INVALID_SOCKET) {
4113 set_error();
4114 return -1;
4115 }
4116
4117 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4118 SOCKETCLOSE(fd);
4119 return -1;
4120 }
4121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 }
4123 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004126
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004127}
4128
4129
Guido van Rossumb6775db1994-08-01 11:34:53 +00004130/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004131
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004132static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004133 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4134 "_socket.socket", /* tp_name */
4135 sizeof(PySocketSockObject), /* tp_basicsize */
4136 0, /* tp_itemsize */
4137 (destructor)sock_dealloc, /* tp_dealloc */
4138 0, /* tp_print */
4139 0, /* tp_getattr */
4140 0, /* tp_setattr */
4141 0, /* tp_reserved */
4142 (reprfunc)sock_repr, /* tp_repr */
4143 0, /* tp_as_number */
4144 0, /* tp_as_sequence */
4145 0, /* tp_as_mapping */
4146 0, /* tp_hash */
4147 0, /* tp_call */
4148 0, /* tp_str */
4149 PyObject_GenericGetAttr, /* tp_getattro */
4150 0, /* tp_setattro */
4151 0, /* tp_as_buffer */
4152 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4153 sock_doc, /* tp_doc */
4154 0, /* tp_traverse */
4155 0, /* tp_clear */
4156 0, /* tp_richcompare */
4157 0, /* tp_weaklistoffset */
4158 0, /* tp_iter */
4159 0, /* tp_iternext */
4160 sock_methods, /* tp_methods */
4161 sock_memberlist, /* tp_members */
4162 0, /* tp_getset */
4163 0, /* tp_base */
4164 0, /* tp_dict */
4165 0, /* tp_descr_get */
4166 0, /* tp_descr_set */
4167 0, /* tp_dictoffset */
4168 sock_initobj, /* tp_init */
4169 PyType_GenericAlloc, /* tp_alloc */
4170 sock_new, /* tp_new */
4171 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004172};
4173
Guido van Rossum30a685f1991-06-27 15:51:29 +00004174
Guido van Rossum81194471991-07-27 21:42:02 +00004175/* Python interface to gethostname(). */
4176
4177/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004178static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004179socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004180{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004181#ifdef MS_WINDOWS
4182 /* Don't use winsock's gethostname, as this returns the ANSI
4183 version of the hostname, whereas we need a Unicode string.
4184 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004185 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004186 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004187 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004188 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004189
4190 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004191 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004192
4193 if (GetLastError() != ERROR_MORE_DATA)
4194 return PyErr_SetFromWindowsErr(0);
4195
4196 if (size == 0)
4197 return PyUnicode_New(0, 0);
4198
4199 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4200 names */
4201 name = PyMem_Malloc(size * sizeof(wchar_t));
4202 if (!name)
4203 return NULL;
4204 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4205 name,
4206 &size))
4207 {
4208 PyMem_Free(name);
4209 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004210 }
Victor Stinner74168972011-11-17 01:11:36 +01004211
4212 result = PyUnicode_FromWideChar(name, size);
4213 PyMem_Free(name);
4214 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004215#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004216 char buf[1024];
4217 int res;
4218 Py_BEGIN_ALLOW_THREADS
4219 res = gethostname(buf, (int) sizeof buf - 1);
4220 Py_END_ALLOW_THREADS
4221 if (res < 0)
4222 return set_error();
4223 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004224 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004225#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004226}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004228PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004229"gethostname() -> string\n\
4230\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004231Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004232
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004233#ifdef HAVE_SETHOSTNAME
4234PyDoc_STRVAR(sethostname_doc,
4235"sethostname(name)\n\n\
4236Sets the hostname to name.");
4237
4238static PyObject *
4239socket_sethostname(PyObject *self, PyObject *args)
4240{
4241 PyObject *hnobj;
4242 Py_buffer buf;
4243 int res, flag = 0;
4244
Christian Heimesd2774c72013-06-19 02:06:29 +02004245#ifdef _AIX
4246/* issue #18259, not declared in any useful header file */
4247extern int sethostname(const char *, size_t);
4248#endif
4249
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004250 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4251 PyErr_Clear();
4252 if (!PyArg_ParseTuple(args, "O&:sethostname",
4253 PyUnicode_FSConverter, &hnobj))
4254 return NULL;
4255 flag = 1;
4256 }
4257 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4258 if (!res) {
4259 res = sethostname(buf.buf, buf.len);
4260 PyBuffer_Release(&buf);
4261 }
4262 if (flag)
4263 Py_DECREF(hnobj);
4264 if (res)
4265 return set_error();
4266 Py_RETURN_NONE;
4267}
4268#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004269
Guido van Rossum30a685f1991-06-27 15:51:29 +00004270/* Python interface to gethostbyname(name). */
4271
4272/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004273static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004274socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004275{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004276 char *name;
4277 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004278 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004279
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004280 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 return NULL;
4282 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004283 goto finally;
4284 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4285finally:
4286 PyMem_Free(name);
4287 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004288}
4289
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004290PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004291"gethostbyname(host) -> address\n\
4292\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004293Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004294
4295
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004296/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4297
4298static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004299gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 char **pch;
4302 PyObject *rtn_tuple = (PyObject *)NULL;
4303 PyObject *name_list = (PyObject *)NULL;
4304 PyObject *addr_list = (PyObject *)NULL;
4305 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004307 if (h == NULL) {
4308 /* Let's get real error message to return */
4309 set_herror(h_errno);
4310 return NULL;
4311 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 if (h->h_addrtype != af) {
4314 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004315 errno = EAFNOSUPPORT;
4316 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 return NULL;
4318 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004320 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 case AF_INET:
4323 if (alen < sizeof(struct sockaddr_in))
4324 return NULL;
4325 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004326
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004327#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 case AF_INET6:
4329 if (alen < sizeof(struct sockaddr_in6))
4330 return NULL;
4331 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004332#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 if ((name_list = PyList_New(0)) == NULL)
4337 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 if ((addr_list = PyList_New(0)) == NULL)
4340 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 /* SF #1511317: h_aliases can be NULL */
4343 if (h->h_aliases) {
4344 for (pch = h->h_aliases; *pch != NULL; pch++) {
4345 int status;
4346 tmp = PyUnicode_FromString(*pch);
4347 if (tmp == NULL)
4348 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 status = PyList_Append(name_list, tmp);
4351 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004353 if (status)
4354 goto err;
4355 }
4356 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004357
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004358 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4359 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004361 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 case AF_INET:
4364 {
4365 struct sockaddr_in sin;
4366 memset(&sin, 0, sizeof(sin));
4367 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004368#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004369 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004370#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4372 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 if (pch == h->h_addr_list && alen >= sizeof(sin))
4375 memcpy((char *) addr, &sin, sizeof(sin));
4376 break;
4377 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004378
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004379#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 case AF_INET6:
4381 {
4382 struct sockaddr_in6 sin6;
4383 memset(&sin6, 0, sizeof(sin6));
4384 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004385#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4389 tmp = makeipaddr((struct sockaddr *)&sin6,
4390 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4393 memcpy((char *) addr, &sin6, sizeof(sin6));
4394 break;
4395 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004396#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004399 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004400 "unsupported address family");
4401 return NULL;
4402 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 if (tmp == NULL)
4405 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 status = PyList_Append(addr_list, tmp);
4408 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 if (status)
4411 goto err;
4412 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004415
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004416 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 Py_XDECREF(name_list);
4418 Py_XDECREF(addr_list);
4419 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004420}
4421
4422
4423/* Python interface to gethostbyname_ex(name). */
4424
4425/*ARGSUSED*/
4426static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004427socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 char *name;
4430 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004431 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004433 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004434#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004436#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004438#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004439 char buf[16384];
4440 int buf_len = (sizeof buf) - 1;
4441 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004442#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004443#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004445#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004446#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004447
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004448 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004450 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004451 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004453#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004454#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004455 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004456 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004457#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004459#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 memset((void *) &data, '\0', sizeof(data));
4461 result = gethostbyname_r(name, &hp_allocated, &data);
4462 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004463#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004464#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004465#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004469#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 Py_END_ALLOW_THREADS
4471 /* Some C libraries would require addr.__ss_family instead of
4472 addr.ss_family.
4473 Therefore, we cast the sockaddr_storage into sockaddr to
4474 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004475 sa = SAS2SA(&addr);
4476 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004478#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004480#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004481finally:
4482 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004483 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004484}
4485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004486PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004487"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4488\n\
4489Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004490for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004491
4492
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004493/* Python interface to gethostbyaddr(IP). */
4494
4495/*ARGSUSED*/
4496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004497socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004498{
Charles-François Natali8b759652011-12-23 16:44:51 +01004499 sock_addr_t addr;
4500 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 char *ip_num;
4502 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004503 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004504#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004506#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004508#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004509 /* glibcs up to 2.10 assume that the buf argument to
4510 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4511 does not ensure. The attribute below instructs the compiler
4512 to maintain this alignment. */
4513 char buf[16384] Py_ALIGNED(8);
4514 int buf_len = (sizeof buf) - 1;
4515 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004516#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004517#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004518 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004519#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004520#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 char *ap;
4522 int al;
4523 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004524
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004525 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 return NULL;
4527 af = AF_UNSPEC;
4528 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004529 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 af = sa->sa_family;
4531 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004532 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 switch (af) {
4534 case AF_INET:
4535 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4536 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4537 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004538#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 case AF_INET6:
4540 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4541 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4542 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004543#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004544 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004545 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004546 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 }
4548 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004549#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004550#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004551 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 &hp_allocated, buf, buf_len,
4553 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004554#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 h = gethostbyaddr_r(ap, al, af,
4556 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004557#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 memset((void *) &data, '\0', sizeof(data));
4559 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4560 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004561#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004562#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004563#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004567#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004569 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004570#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004572#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004573finally:
4574 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004575 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004576}
4577
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004578PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004579"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4580\n\
4581Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004582for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004583
Guido van Rossum30a685f1991-06-27 15:51:29 +00004584
4585/* Python interface to getservbyname(name).
4586 This only returns the port number, since the other info is already
4587 known or not useful (like the list of aliases). */
4588
4589/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004591socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 char *name, *proto=NULL;
4594 struct servent *sp;
4595 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4596 return NULL;
4597 Py_BEGIN_ALLOW_THREADS
4598 sp = getservbyname(name, proto);
4599 Py_END_ALLOW_THREADS
4600 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004601 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 return NULL;
4603 }
4604 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004605}
4606
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004607PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004608"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004609\n\
4610Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004611The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4612otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004613
Guido van Rossum30a685f1991-06-27 15:51:29 +00004614
Barry Warsaw11b91a02004-06-28 00:50:43 +00004615/* Python interface to getservbyport(port).
4616 This only returns the service name, since the other info is already
4617 known or not useful (like the list of aliases). */
4618
4619/*ARGSUSED*/
4620static PyObject *
4621socket_getservbyport(PyObject *self, PyObject *args)
4622{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 int port;
4624 char *proto=NULL;
4625 struct servent *sp;
4626 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4627 return NULL;
4628 if (port < 0 || port > 0xffff) {
4629 PyErr_SetString(
4630 PyExc_OverflowError,
4631 "getservbyport: port must be 0-65535.");
4632 return NULL;
4633 }
4634 Py_BEGIN_ALLOW_THREADS
4635 sp = getservbyport(htons((short)port), proto);
4636 Py_END_ALLOW_THREADS
4637 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004638 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 return NULL;
4640 }
4641 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004642}
4643
4644PyDoc_STRVAR(getservbyport_doc,
4645"getservbyport(port[, protocolname]) -> string\n\
4646\n\
4647Return the service name from a port number and protocol name.\n\
4648The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4649otherwise any protocol will match.");
4650
Guido van Rossum3901d851996-12-19 16:35:04 +00004651/* Python interface to getprotobyname(name).
4652 This only returns the protocol number, since the other info is
4653 already known or not useful (like the list of aliases). */
4654
4655/*ARGSUSED*/
4656static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004657socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004658{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 char *name;
4660 struct protoent *sp;
4661 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4662 return NULL;
4663 Py_BEGIN_ALLOW_THREADS
4664 sp = getprotobyname(name);
4665 Py_END_ALLOW_THREADS
4666 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004667 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 return NULL;
4669 }
4670 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004671}
4672
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004673PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004674"getprotobyname(name) -> integer\n\
4675\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004676Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004677
Guido van Rossum3901d851996-12-19 16:35:04 +00004678
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004679#ifndef NO_DUP
4680/* dup() function for socket fds */
4681
4682static PyObject *
4683socket_dup(PyObject *self, PyObject *fdobj)
4684{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 SOCKET_T fd, newfd;
4686 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004687#ifdef MS_WINDOWS
4688 WSAPROTOCOL_INFO info;
4689#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 fd = PyLong_AsSocket_t(fdobj);
4692 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4693 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004694
Victor Stinnerdaf45552013-08-28 00:53:59 +02004695#ifdef MS_WINDOWS
4696 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4697 return set_error();
4698
4699 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4700 FROM_PROTOCOL_INFO,
4701 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 if (newfd == INVALID_SOCKET)
4703 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004704
Victor Stinnerdaf45552013-08-28 00:53:59 +02004705 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4706 closesocket(newfd);
4707 PyErr_SetFromWindowsErr(0);
4708 return NULL;
4709 }
4710#else
4711 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4712 newfd = _Py_dup(fd);
4713 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004714 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004715#endif
4716
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 newfdobj = PyLong_FromSocket_t(newfd);
4718 if (newfdobj == NULL)
4719 SOCKETCLOSE(newfd);
4720 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004721}
4722
4723PyDoc_STRVAR(dup_doc,
4724"dup(integer) -> integer\n\
4725\n\
4726Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4727sockets; on some platforms os.dup() won't work for socket file descriptors.");
4728#endif
4729
4730
Dave Cole331708b2004-08-09 04:51:41 +00004731#ifdef HAVE_SOCKETPAIR
4732/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004733 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004734 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004735
4736/*ARGSUSED*/
4737static PyObject *
4738socket_socketpair(PyObject *self, PyObject *args)
4739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 PySocketSockObject *s0 = NULL, *s1 = NULL;
4741 SOCKET_T sv[2];
4742 int family, type = SOCK_STREAM, proto = 0;
4743 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004744#ifdef SOCK_CLOEXEC
4745 int *atomic_flag_works = &sock_cloexec_works;
4746#else
4747 int *atomic_flag_works = NULL;
4748#endif
4749 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004750
4751#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004753#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4757 &family, &type, &proto))
4758 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004761 Py_BEGIN_ALLOW_THREADS
4762#ifdef SOCK_CLOEXEC
4763 if (sock_cloexec_works != 0) {
4764 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4765 if (sock_cloexec_works == -1) {
4766 if (ret >= 0) {
4767 sock_cloexec_works = 1;
4768 }
4769 else if (errno == EINVAL) {
4770 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4771 sock_cloexec_works = 0;
4772 ret = socketpair(family, type, proto, sv);
4773 }
4774 }
4775 }
4776 else
4777#endif
4778 {
4779 ret = socketpair(family, type, proto, sv);
4780 }
4781 Py_END_ALLOW_THREADS
4782
4783 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004785
4786 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4787 goto finally;
4788 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4789 goto finally;
4790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 s0 = new_sockobject(sv[0], family, type, proto);
4792 if (s0 == NULL)
4793 goto finally;
4794 s1 = new_sockobject(sv[1], family, type, proto);
4795 if (s1 == NULL)
4796 goto finally;
4797 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004798
4799finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 if (res == NULL) {
4801 if (s0 == NULL)
4802 SOCKETCLOSE(sv[0]);
4803 if (s1 == NULL)
4804 SOCKETCLOSE(sv[1]);
4805 }
4806 Py_XDECREF(s0);
4807 Py_XDECREF(s1);
4808 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004809}
4810
4811PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004812"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004813\n\
4814Create a pair of socket objects from the sockets returned by the platform\n\
4815socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004816The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004817AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004818
4819#endif /* HAVE_SOCKETPAIR */
4820
4821
Guido van Rossum006bf911996-06-12 04:04:55 +00004822static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004823socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004824{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004825 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4828 return NULL;
4829 }
4830 if (x1 < 0) {
4831 PyErr_SetString(PyExc_OverflowError,
4832 "can't convert negative number to unsigned long");
4833 return NULL;
4834 }
4835 x2 = (unsigned int)ntohs((unsigned short)x1);
4836 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004837}
4838
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004839PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004840"ntohs(integer) -> integer\n\
4841\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004842Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004843
4844
Guido van Rossum006bf911996-06-12 04:04:55 +00004845static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004846socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004849
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 if (PyLong_Check(arg)) {
4851 x = PyLong_AsUnsignedLong(arg);
4852 if (x == (unsigned long) -1 && PyErr_Occurred())
4853 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004854#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 {
4856 unsigned long y;
4857 /* only want the trailing 32 bits */
4858 y = x & 0xFFFFFFFFUL;
4859 if (y ^ x)
4860 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004861 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 x = y;
4863 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 }
4866 else
4867 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004868 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004871}
4872
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004873PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004874"ntohl(integer) -> integer\n\
4875\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004876Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004877
4878
Guido van Rossum006bf911996-06-12 04:04:55 +00004879static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004880socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4885 return NULL;
4886 }
4887 if (x1 < 0) {
4888 PyErr_SetString(PyExc_OverflowError,
4889 "can't convert negative number to unsigned long");
4890 return NULL;
4891 }
4892 x2 = (unsigned int)htons((unsigned short)x1);
4893 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004894}
4895
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004896PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004897"htons(integer) -> integer\n\
4898\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004899Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004900
4901
Guido van Rossum006bf911996-06-12 04:04:55 +00004902static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004903socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004904{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 if (PyLong_Check(arg)) {
4908 x = PyLong_AsUnsignedLong(arg);
4909 if (x == (unsigned long) -1 && PyErr_Occurred())
4910 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004911#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 {
4913 unsigned long y;
4914 /* only want the trailing 32 bits */
4915 y = x & 0xFFFFFFFFUL;
4916 if (y ^ x)
4917 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004918 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 x = y;
4920 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004922 }
4923 else
4924 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004925 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004926 Py_TYPE(arg)->tp_name);
4927 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004928}
4929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004930PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004931"htonl(integer) -> integer\n\
4932\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004933Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004934
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004935/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004937PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004938"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004939\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004940Convert 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 +00004941binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004942
4943static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004944socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004945{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004946#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004948#endif
4949
4950#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004951#if (SIZEOF_INT != 4)
4952#error "Not sure if in_addr_t exists and int is not 32-bits."
4953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 /* Have to use inet_addr() instead */
4955 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004956#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4960 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004961
Tim Peters1df9fdd2003-02-13 03:13:40 +00004962
4963#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004964
4965#ifdef USE_INET_ATON_WEAKLINK
4966 if (inet_aton != NULL) {
4967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 if (inet_aton(ip_addr, &buf))
4969 return PyBytes_FromStringAndSize((char *)(&buf),
4970 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004971
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004972 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 "illegal IP address string passed to inet_aton");
4974 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004975
Thomas Wouters477c8d52006-05-27 19:21:47 +00004976#ifdef USE_INET_ATON_WEAKLINK
4977 } else {
4978#endif
4979
4980#endif
4981
4982#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 /* special-case this address as inet_addr might return INADDR_NONE
4985 * for this */
4986 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004987 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004990 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004992 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004993 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 "illegal IP address string passed to inet_aton");
4995 return NULL;
4996 }
4997 }
4998 return PyBytes_FromStringAndSize((char *) &packed_addr,
4999 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005000
5001#ifdef USE_INET_ATON_WEAKLINK
5002 }
5003#endif
5004
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005005#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005006}
5007
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005008PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005009"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005010\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005011Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005012
5013static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005014socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 char *packed_str;
5017 int addr_len;
5018 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
5021 return NULL;
5022 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005025 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 "packed IP wrong length for inet_ntoa");
5027 return NULL;
5028 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005033}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005034
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005035#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005036
5037PyDoc_STRVAR(inet_pton_doc,
5038"inet_pton(af, ip) -> packed IP address string\n\
5039\n\
5040Convert an IP address from string format to a packed string suitable\n\
5041for use with low-level network functions.");
5042
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005043#endif
5044
5045#ifdef HAVE_INET_PTON
5046
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005047static PyObject *
5048socket_inet_pton(PyObject *self, PyObject *args)
5049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 int af;
5051 char* ip;
5052 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005053#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005054 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005055#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005057#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5059 return NULL;
5060 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005061
Martin v. Löwis04697e82004-06-02 12:35:29 +00005062#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005064 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 "can't use AF_INET6, IPv6 is disabled");
5066 return NULL;
5067 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005068#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 retval = inet_pton(af, ip, packed);
5071 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005072 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 return NULL;
5074 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005075 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 "illegal IP address string passed to inet_pton");
5077 return NULL;
5078 } else if (af == AF_INET) {
5079 return PyBytes_FromStringAndSize(packed,
5080 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005081#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 } else if (af == AF_INET6) {
5083 return PyBytes_FromStringAndSize(packed,
5084 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005087 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 return NULL;
5089 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005090}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005091#elif defined(MS_WINDOWS)
5092
5093static PyObject *
5094socket_inet_pton(PyObject *self, PyObject *args)
5095{
5096 int af;
5097 char* ip;
5098 struct sockaddr_in6 addr;
5099 INT ret, size;
5100
5101 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5102 return NULL;
5103 }
5104
Victor Stinnere990c6e2013-11-16 00:18:58 +01005105 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005106 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5107
5108 if (ret) {
5109 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5110 return NULL;
5111 } else if(af == AF_INET) {
5112 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005113 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005114 sizeof(addr4->sin_addr));
5115 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005116 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005117 sizeof(addr.sin6_addr));
5118 } else {
5119 PyErr_SetString(PyExc_OSError, "unknown address family");
5120 return NULL;
5121 }
5122}
5123
5124#endif
5125
5126#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005127
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005128PyDoc_STRVAR(inet_ntop_doc,
5129"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5130\n\
5131Convert a packed IP address of the given family to string format.");
5132
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005133#endif
5134
5135
5136#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005137static PyObject *
5138socket_inet_ntop(PyObject *self, PyObject *args)
5139{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 int af;
5141 char* packed;
5142 int len;
5143 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005144#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005145 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005148#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5151 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005153 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5154 return NULL;
5155 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 if (af == AF_INET) {
5158 if (len != sizeof(struct in_addr)) {
5159 PyErr_SetString(PyExc_ValueError,
5160 "invalid length of packed IP address string");
5161 return NULL;
5162 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005163#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 } else if (af == AF_INET6) {
5165 if (len != sizeof(struct in6_addr)) {
5166 PyErr_SetString(PyExc_ValueError,
5167 "invalid length of packed IP address string");
5168 return NULL;
5169 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 } else {
5172 PyErr_Format(PyExc_ValueError,
5173 "unknown address family %d", af);
5174 return NULL;
5175 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 retval = inet_ntop(af, packed, ip, sizeof(ip));
5178 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005179 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 return NULL;
5181 } else {
5182 return PyUnicode_FromString(retval);
5183 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005184
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005185 /* NOTREACHED */
5186 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5187 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005188}
5189
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005190#elif defined(MS_WINDOWS)
5191
5192static PyObject *
5193socket_inet_ntop(PyObject *self, PyObject *args)
5194{
5195 int af;
5196 char* packed;
5197 int len;
5198 struct sockaddr_in6 addr;
5199 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005200#ifdef ENABLE_IPV6
5201 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5202#else
5203 char ip[INET_ADDRSTRLEN + 1];
5204#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005205
5206 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5207 memset((void *) &ip[0], '\0', sizeof(ip));
5208
5209 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5210 return NULL;
5211 }
5212
5213 if (af == AF_INET) {
5214 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5215
5216 if (len != sizeof(struct in_addr)) {
5217 PyErr_SetString(PyExc_ValueError,
5218 "invalid length of packed IP address string");
5219 return NULL;
5220 }
5221 memset(addr4, 0, sizeof(struct sockaddr_in));
5222 addr4->sin_family = AF_INET;
5223 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5224 addrlen = sizeof(struct sockaddr_in);
5225 } else if (af == AF_INET6) {
5226 if (len != sizeof(struct in6_addr)) {
5227 PyErr_SetString(PyExc_ValueError,
5228 "invalid length of packed IP address string");
5229 return NULL;
5230 }
5231
5232 memset(&addr, 0, sizeof(addr));
5233 addr.sin6_family = AF_INET6;
5234 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5235 addrlen = sizeof(addr);
5236 } else {
5237 PyErr_Format(PyExc_ValueError,
5238 "unknown address family %d", af);
5239 return NULL;
5240 }
5241
5242 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005243 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005244 ip, &retlen);
5245
5246 if (ret) {
5247 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5248 return NULL;
5249 } else {
5250 return PyUnicode_FromString(ip);
5251 }
5252}
5253
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005254#endif /* HAVE_INET_PTON */
5255
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005256/* Python interface to getaddrinfo(host, port). */
5257
5258/*ARGSUSED*/
5259static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005260socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005261{
Victor Stinner77af1722011-05-26 14:05:59 +02005262 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005263 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 struct addrinfo hints, *res;
5265 struct addrinfo *res0 = NULL;
5266 PyObject *hobj = NULL;
5267 PyObject *pobj = (PyObject *)NULL;
5268 char pbuf[30];
5269 char *hptr, *pptr;
5270 int family, socktype, protocol, flags;
5271 int error;
5272 PyObject *all = (PyObject *)NULL;
5273 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005274
Georg Brandl6083a4b2013-10-14 06:51:46 +02005275 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005277 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005278 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 &protocol, &flags)) {
5280 return NULL;
5281 }
5282 if (hobj == Py_None) {
5283 hptr = NULL;
5284 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005285 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005286
5287 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005288 if (!idna)
5289 return NULL;
5290 assert(PyBytes_Check(idna));
5291 hptr = PyBytes_AS_STRING(idna);
5292 } else if (PyBytes_Check(hobj)) {
5293 hptr = PyBytes_AsString(hobj);
5294 } else {
5295 PyErr_SetString(PyExc_TypeError,
5296 "getaddrinfo() argument 1 must be string or None");
5297 return NULL;
5298 }
5299 if (PyLong_CheckExact(pobj)) {
5300 long value = PyLong_AsLong(pobj);
5301 if (value == -1 && PyErr_Occurred())
5302 goto err;
5303 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5304 pptr = pbuf;
5305 } else if (PyUnicode_Check(pobj)) {
5306 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005307 if (pptr == NULL)
5308 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005310 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005311 } else if (pobj == Py_None) {
5312 pptr = (char *)NULL;
5313 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005314 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 goto err;
5316 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005317#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005318 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5319 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005320 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5321 * This workaround avoids a segfault in libsystem.
5322 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005323 pptr = "00";
5324 }
5325#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 memset(&hints, 0, sizeof(hints));
5327 hints.ai_family = family;
5328 hints.ai_socktype = socktype;
5329 hints.ai_protocol = protocol;
5330 hints.ai_flags = flags;
5331 Py_BEGIN_ALLOW_THREADS
5332 ACQUIRE_GETADDRINFO_LOCK
5333 error = getaddrinfo(hptr, pptr, &hints, &res0);
5334 Py_END_ALLOW_THREADS
5335 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5336 if (error) {
5337 set_gaierror(error);
5338 goto err;
5339 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 if ((all = PyList_New(0)) == NULL)
5342 goto err;
5343 for (res = res0; res; res = res->ai_next) {
5344 PyObject *single;
5345 PyObject *addr =
5346 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5347 if (addr == NULL)
5348 goto err;
5349 single = Py_BuildValue("iiisO", res->ai_family,
5350 res->ai_socktype, res->ai_protocol,
5351 res->ai_canonname ? res->ai_canonname : "",
5352 addr);
5353 Py_DECREF(addr);
5354 if (single == NULL)
5355 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 if (PyList_Append(all, single))
5358 goto err;
5359 Py_XDECREF(single);
5360 }
5361 Py_XDECREF(idna);
5362 if (res0)
5363 freeaddrinfo(res0);
5364 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005365 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 Py_XDECREF(all);
5367 Py_XDECREF(idna);
5368 if (res0)
5369 freeaddrinfo(res0);
5370 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005371}
5372
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005373PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005374"getaddrinfo(host, port [, family, type, proto, flags])\n\
5375 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005376\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005377Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005378
5379/* Python interface to getnameinfo(sa, flags). */
5380
5381/*ARGSUSED*/
5382static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005383socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005384{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 PyObject *sa = (PyObject *)NULL;
5386 int flags;
5387 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005388 int port;
5389 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5391 struct addrinfo hints, *res = NULL;
5392 int error;
5393 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 flags = flowinfo = scope_id = 0;
5396 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5397 return NULL;
5398 if (!PyTuple_Check(sa)) {
5399 PyErr_SetString(PyExc_TypeError,
5400 "getnameinfo() argument 1 must be a tuple");
5401 return NULL;
5402 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005403 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 &hostp, &port, &flowinfo, &scope_id))
5405 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005406 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005407 PyErr_SetString(PyExc_OverflowError,
5408 "getsockaddrarg: flowinfo must be 0-1048575.");
5409 return NULL;
5410 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005411 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5412 memset(&hints, 0, sizeof(hints));
5413 hints.ai_family = AF_UNSPEC;
5414 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005415 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 Py_BEGIN_ALLOW_THREADS
5417 ACQUIRE_GETADDRINFO_LOCK
5418 error = getaddrinfo(hostp, pbuf, &hints, &res);
5419 Py_END_ALLOW_THREADS
5420 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5421 if (error) {
5422 set_gaierror(error);
5423 goto fail;
5424 }
5425 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005426 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 "sockaddr resolved to multiple addresses");
5428 goto fail;
5429 }
5430 switch (res->ai_family) {
5431 case AF_INET:
5432 {
5433 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005434 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 "IPv4 sockaddr must be 2 tuple");
5436 goto fail;
5437 }
5438 break;
5439 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005440#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 case AF_INET6:
5442 {
5443 struct sockaddr_in6 *sin6;
5444 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005445 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 sin6->sin6_scope_id = scope_id;
5447 break;
5448 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005450 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005451 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005452 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5453 if (error) {
5454 set_gaierror(error);
5455 goto fail;
5456 }
5457 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458
5459fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005460 if (res)
5461 freeaddrinfo(res);
5462 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005463}
5464
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005465PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005466"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005467\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005468Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005469
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005470
5471/* Python API to getting and setting the default timeout value. */
5472
5473static PyObject *
5474socket_getdefaulttimeout(PyObject *self)
5475{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005476 if (defaulttimeout < 0.0) {
5477 Py_INCREF(Py_None);
5478 return Py_None;
5479 }
5480 else
5481 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005482}
5483
5484PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005485"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005486\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005487Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005488A value of None indicates that new socket objects have no timeout.\n\
5489When the socket module is first imported, the default is None.");
5490
5491static PyObject *
5492socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005494 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 if (arg == Py_None)
5497 timeout = -1.0;
5498 else {
5499 timeout = PyFloat_AsDouble(arg);
5500 if (timeout < 0.0) {
5501 if (!PyErr_Occurred())
5502 PyErr_SetString(PyExc_ValueError,
5503 "Timeout value out of range");
5504 return NULL;
5505 }
5506 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 Py_INCREF(Py_None);
5511 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005512}
5513
5514PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005515"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005516\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005517Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005518A value of None indicates that new socket objects have no timeout.\n\
5519When the socket module is first imported, the default is None.");
5520
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005521#ifdef HAVE_IF_NAMEINDEX
5522/* Python API for getting interface indices and names */
5523
5524static PyObject *
5525socket_if_nameindex(PyObject *self, PyObject *arg)
5526{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005527 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005528 int i;
5529 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005530
Charles-François Natali60713592011-05-20 16:55:06 +02005531 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005532 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005533 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005534 return NULL;
5535 }
5536
5537 list = PyList_New(0);
5538 if (list == NULL) {
5539 if_freenameindex(ni);
5540 return NULL;
5541 }
5542
Charles-François Natali60713592011-05-20 16:55:06 +02005543 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5544 PyObject *ni_tuple = Py_BuildValue("IO&",
5545 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005546
5547 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5548 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005549 Py_DECREF(list);
5550 if_freenameindex(ni);
5551 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005552 }
5553 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005554 }
5555
5556 if_freenameindex(ni);
5557 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005558}
5559
5560PyDoc_STRVAR(if_nameindex_doc,
5561"if_nameindex()\n\
5562\n\
5563Returns a list of network interface information (index, name) tuples.");
5564
Charles-François Natali60713592011-05-20 16:55:06 +02005565static PyObject *
5566socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005567{
Charles-François Natali60713592011-05-20 16:55:06 +02005568 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005569 unsigned long index;
5570
Charles-François Natali60713592011-05-20 16:55:06 +02005571 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5572 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005573 return NULL;
5574
Charles-François Natali60713592011-05-20 16:55:06 +02005575 index = if_nametoindex(PyBytes_AS_STRING(oname));
5576 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005577 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005578 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005579 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005580 return NULL;
5581 }
5582
5583 return PyLong_FromUnsignedLong(index);
5584}
5585
5586PyDoc_STRVAR(if_nametoindex_doc,
5587"if_nametoindex(if_name)\n\
5588\n\
5589Returns the interface index corresponding to the interface name if_name.");
5590
Charles-François Natali60713592011-05-20 16:55:06 +02005591static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005592socket_if_indextoname(PyObject *self, PyObject *arg)
5593{
Charles-François Natali60713592011-05-20 16:55:06 +02005594 unsigned long index;
5595 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005596
Charles-François Natali60713592011-05-20 16:55:06 +02005597 index = PyLong_AsUnsignedLong(arg);
5598 if (index == (unsigned long) -1)
5599 return NULL;
5600
5601 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005602 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005603 return NULL;
5604 }
5605
Charles-François Natali60713592011-05-20 16:55:06 +02005606 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005607}
5608
5609PyDoc_STRVAR(if_indextoname_doc,
5610"if_indextoname(if_index)\n\
5611\n\
5612Returns the interface name corresponding to the interface index if_index.");
5613
5614#endif /* HAVE_IF_NAMEINDEX */
5615
5616
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005617#ifdef CMSG_LEN
5618/* Python interface to CMSG_LEN(length). */
5619
5620static PyObject *
5621socket_CMSG_LEN(PyObject *self, PyObject *args)
5622{
5623 Py_ssize_t length;
5624 size_t result;
5625
5626 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5627 return NULL;
5628 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5629 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5630 return NULL;
5631 }
5632 return PyLong_FromSize_t(result);
5633}
5634
5635PyDoc_STRVAR(CMSG_LEN_doc,
5636"CMSG_LEN(length) -> control message length\n\
5637\n\
5638Return the total length, without trailing padding, of an ancillary\n\
5639data item with associated data of the given length. This value can\n\
5640often be used as the buffer size for recvmsg() to receive a single\n\
5641item of ancillary data, but RFC 3542 requires portable applications to\n\
5642use CMSG_SPACE() and thus include space for padding, even when the\n\
5643item will be the last in the buffer. Raises OverflowError if length\n\
5644is outside the permissible range of values.");
5645
5646
5647#ifdef CMSG_SPACE
5648/* Python interface to CMSG_SPACE(length). */
5649
5650static PyObject *
5651socket_CMSG_SPACE(PyObject *self, PyObject *args)
5652{
5653 Py_ssize_t length;
5654 size_t result;
5655
5656 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5657 return NULL;
5658 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5659 PyErr_SetString(PyExc_OverflowError,
5660 "CMSG_SPACE() argument out of range");
5661 return NULL;
5662 }
5663 return PyLong_FromSize_t(result);
5664}
5665
5666PyDoc_STRVAR(CMSG_SPACE_doc,
5667"CMSG_SPACE(length) -> buffer size\n\
5668\n\
5669Return the buffer size needed for recvmsg() to receive an ancillary\n\
5670data item with associated data of the given length, along with any\n\
5671trailing padding. The buffer space needed to receive multiple items\n\
5672is the sum of the CMSG_SPACE() values for their associated data\n\
5673lengths. Raises OverflowError if length is outside the permissible\n\
5674range of values.");
5675#endif /* CMSG_SPACE */
5676#endif /* CMSG_LEN */
5677
5678
Guido van Rossum30a685f1991-06-27 15:51:29 +00005679/* List of functions exported by this module. */
5680
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005681static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005682 {"gethostbyname", socket_gethostbyname,
5683 METH_VARARGS, gethostbyname_doc},
5684 {"gethostbyname_ex", socket_gethostbyname_ex,
5685 METH_VARARGS, ghbn_ex_doc},
5686 {"gethostbyaddr", socket_gethostbyaddr,
5687 METH_VARARGS, gethostbyaddr_doc},
5688 {"gethostname", socket_gethostname,
5689 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005690#ifdef HAVE_SETHOSTNAME
5691 {"sethostname", socket_sethostname,
5692 METH_VARARGS, sethostname_doc},
5693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 {"getservbyname", socket_getservbyname,
5695 METH_VARARGS, getservbyname_doc},
5696 {"getservbyport", socket_getservbyport,
5697 METH_VARARGS, getservbyport_doc},
5698 {"getprotobyname", socket_getprotobyname,
5699 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005700#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 {"dup", socket_dup,
5702 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005703#endif
Dave Cole331708b2004-08-09 04:51:41 +00005704#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 {"socketpair", socket_socketpair,
5706 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005708 {"ntohs", socket_ntohs,
5709 METH_VARARGS, ntohs_doc},
5710 {"ntohl", socket_ntohl,
5711 METH_O, ntohl_doc},
5712 {"htons", socket_htons,
5713 METH_VARARGS, htons_doc},
5714 {"htonl", socket_htonl,
5715 METH_O, htonl_doc},
5716 {"inet_aton", socket_inet_aton,
5717 METH_VARARGS, inet_aton_doc},
5718 {"inet_ntoa", socket_inet_ntoa,
5719 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005720#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 {"inet_pton", socket_inet_pton,
5722 METH_VARARGS, inet_pton_doc},
5723 {"inet_ntop", socket_inet_ntop,
5724 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005725#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005726 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5727 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 {"getnameinfo", socket_getnameinfo,
5729 METH_VARARGS, getnameinfo_doc},
5730 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5731 METH_NOARGS, getdefaulttimeout_doc},
5732 {"setdefaulttimeout", socket_setdefaulttimeout,
5733 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005734#ifdef HAVE_IF_NAMEINDEX
5735 {"if_nameindex", socket_if_nameindex,
5736 METH_NOARGS, if_nameindex_doc},
5737 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005738 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005739 {"if_indextoname", socket_if_indextoname,
5740 METH_O, if_indextoname_doc},
5741#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005742#ifdef CMSG_LEN
5743 {"CMSG_LEN", socket_CMSG_LEN,
5744 METH_VARARGS, CMSG_LEN_doc},
5745#ifdef CMSG_SPACE
5746 {"CMSG_SPACE", socket_CMSG_SPACE,
5747 METH_VARARGS, CMSG_SPACE_doc},
5748#endif
5749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005750 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005751};
5752
Guido van Rossum30a685f1991-06-27 15:51:29 +00005753
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005754#ifdef MS_WINDOWS
5755#define OS_INIT_DEFINED
5756
5757/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005758
5759static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005760os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005763}
5764
5765static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005766os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005767{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005768 WSADATA WSAData;
5769 int ret;
5770 ret = WSAStartup(0x0101, &WSAData);
5771 switch (ret) {
5772 case 0: /* No error */
5773 Py_AtExit(os_cleanup);
5774 return 1; /* Success */
5775 case WSASYSNOTREADY:
5776 PyErr_SetString(PyExc_ImportError,
5777 "WSAStartup failed: network not ready");
5778 break;
5779 case WSAVERNOTSUPPORTED:
5780 case WSAEINVAL:
5781 PyErr_SetString(
5782 PyExc_ImportError,
5783 "WSAStartup failed: requested version not supported");
5784 break;
5785 default:
5786 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5787 break;
5788 }
5789 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005790}
5791
Guido van Rossum8d665e61996-06-26 18:22:49 +00005792#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005793
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005794
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005795
5796#ifndef OS_INIT_DEFINED
5797static int
5798os_init(void)
5799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005801}
5802#endif
5803
5804
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005805/* C API table - always add new things to the end for binary
5806 compatibility. */
5807static
5808PySocketModule_APIObject PySocketModuleAPI =
5809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005811 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005813};
5814
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005815
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005816/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005817
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005818 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005819 "socket.py" which implements some additional functionality.
5820 The import of "_socket" may fail with an ImportError exception if
5821 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005822 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005823 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005824*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005826PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005827"Implementation module for socket operations.\n\
5828\n\
5829See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005830
Martin v. Löwis1a214512008-06-11 05:26:20 +00005831static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005832 PyModuleDef_HEAD_INIT,
5833 PySocket_MODULE_NAME,
5834 socket_doc,
5835 -1,
5836 socket_methods,
5837 NULL,
5838 NULL,
5839 NULL,
5840 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005841};
5842
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005843PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005844PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005845{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005848 if (!os_init())
5849 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005850
Victor Stinnerdaf45552013-08-28 00:53:59 +02005851#ifdef MS_WINDOWS
5852 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08005853#if defined(_MSC_VER) && _MSC_VER >= 1800
5854 support_wsa_no_inherit = IsWindows7SP1OrGreater();
5855#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02005856 DWORD version = GetVersion();
5857 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5858 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5859 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08005860 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
5861#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02005862 }
5863#endif
5864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 Py_TYPE(&sock_type) = &PyType_Type;
5866 m = PyModule_Create(&socketmodule);
5867 if (m == NULL)
5868 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005869
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005870 Py_INCREF(PyExc_OSError);
5871 PySocketModuleAPI.error = PyExc_OSError;
5872 Py_INCREF(PyExc_OSError);
5873 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005874 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005875 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005876 if (socket_herror == NULL)
5877 return NULL;
5878 Py_INCREF(socket_herror);
5879 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005880 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 NULL);
5882 if (socket_gaierror == NULL)
5883 return NULL;
5884 Py_INCREF(socket_gaierror);
5885 PyModule_AddObject(m, "gaierror", socket_gaierror);
5886 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005887 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 if (socket_timeout == NULL)
5889 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005890 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005891 Py_INCREF(socket_timeout);
5892 PyModule_AddObject(m, "timeout", socket_timeout);
5893 Py_INCREF((PyObject *)&sock_type);
5894 if (PyModule_AddObject(m, "SocketType",
5895 (PyObject *)&sock_type) != 0)
5896 return NULL;
5897 Py_INCREF((PyObject *)&sock_type);
5898 if (PyModule_AddObject(m, "socket",
5899 (PyObject *)&sock_type) != 0)
5900 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005901
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005902#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005904#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005907 Py_INCREF(has_ipv6);
5908 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 /* Export C API */
5911 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5912 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5913 ) != 0)
5914 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005916 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005917#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005918 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005919#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005920 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005921#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005922 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005923#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005924#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005925 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005926#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005927#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005929 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005930#endif
5931#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005932 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005933#endif
5934#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005936 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005937#endif
5938#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005940 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005941#endif
5942#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005944 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005945#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005946#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005948 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005949#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005950#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005952 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005953#endif
5954#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005956 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005957#endif
5958#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005959 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005960#endif
5961#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005963 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005964#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005965#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005967 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005968#endif
5969#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005971 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005972#endif
5973#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005975 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005976#endif
5977#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005979 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005980#endif
5981#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005983 PyModule_AddIntMacro(m, AF_NETLINK);
5984 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005985#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005986 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005987#endif
5988#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005989 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005990#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005991 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5992 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005993#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005994 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005995#endif
5996#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005997 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005998#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005999#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006000 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006001#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006002#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006003 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006004#endif
6005#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006006 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006007#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006008 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006009#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006010 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006011#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006012#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006013 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006014#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006015#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006016#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006018 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006019#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006020#ifdef AF_LINK
6021 PyModule_AddIntMacro(m, AF_LINK);
6022#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006023#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006025 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006026#endif
6027#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006029 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006030#endif
6031#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006033 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006034#endif
6035#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006037 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006038#endif
6039#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006041 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006042#endif
6043#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006044 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006045 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006046#endif
6047#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006049 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006050#endif
6051#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006053 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006054#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006055
Hye-Shik Chang81268602004-02-02 06:05:24 +00006056#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6058 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6059 PyModule_AddIntMacro(m, BTPROTO_HCI);
6060 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006061#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006062 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006063#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006064#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006065#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006066 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006067#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006068 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6069 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006070#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006071 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6073 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006074#endif
6075
Charles-François Natali47413c12011-10-06 19:47:44 +02006076#ifdef AF_CAN
6077 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006078 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006079#endif
6080#ifdef PF_CAN
6081 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006082 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006083#endif
6084
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006085/* Reliable Datagram Sockets */
6086#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006087 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006088#endif
6089#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006090 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006091#endif
6092
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006093/* Kernel event messages */
6094#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006095 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006096#endif
6097#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006098 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006099#endif
6100
Antoine Pitroub156a462010-10-27 20:13:57 +00006101#ifdef AF_PACKET
6102 PyModule_AddIntMacro(m, AF_PACKET);
6103#endif
6104#ifdef PF_PACKET
6105 PyModule_AddIntMacro(m, PF_PACKET);
6106#endif
6107#ifdef PACKET_HOST
6108 PyModule_AddIntMacro(m, PACKET_HOST);
6109#endif
6110#ifdef PACKET_BROADCAST
6111 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6112#endif
6113#ifdef PACKET_MULTICAST
6114 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6115#endif
6116#ifdef PACKET_OTHERHOST
6117 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6118#endif
6119#ifdef PACKET_OUTGOING
6120 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6121#endif
6122#ifdef PACKET_LOOPBACK
6123 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6124#endif
6125#ifdef PACKET_FASTROUTE
6126 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006127#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006128
Christian Heimes043d6f62008-01-07 17:19:16 +00006129#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006130 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6134 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6135 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006136
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006137 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6138 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6139 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006142 PyModule_AddIntMacro(m, SOL_TIPC);
6143 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6144 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6145 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6146 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006147
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006148 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6149 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6150 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6151 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006154 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6155 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006156#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006159#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6161 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6162 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6163 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6164 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6165 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006166#endif
6167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006169 PyModule_AddIntMacro(m, SOCK_STREAM);
6170 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006171/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, SOCK_RAW);
6173 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006174#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006176#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006177#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006179#endif
6180#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006182#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006188 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006192#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006193#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006194 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006195#endif
6196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006197#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006202#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006203#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006204 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006205#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006210 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006213 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006216 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006219 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006225 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006231 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006238#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006239#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006240 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006243 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006244#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006245#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006246 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006247#endif
6248#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006250#endif
6251#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006253#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006254#ifdef SO_BINDTODEVICE
6255 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6256#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006257#ifdef SO_PRIORITY
6258 PyModule_AddIntMacro(m, SO_PRIORITY);
6259#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006260#ifdef SO_MARK
6261 PyModule_AddIntMacro(m, SO_MARK);
6262#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 /* Maximum number of connections for "listen" */
6265#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006266 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006267#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
6270
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006271 /* Ancilliary message types */
6272#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006274#endif
6275#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006277#endif
6278#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006279 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006280#endif
6281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282 /* Flags for send, recv */
6283#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006284 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006287 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006288#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006289#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006290 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006291#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006293 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006294#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006297#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006298#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006299 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006300#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006301#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006303#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006304#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006305 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006306#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006308 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006311 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006312#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006313#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006314 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006315#endif
6316#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006317 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006318#endif
6319#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006321#endif
6322#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006324#endif
6325#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006327#endif
6328#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006330#endif
6331#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006333#endif
6334#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006336#endif
6337#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006339#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006340#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006342#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006344 /* Protocol level and numbers, usable for [gs]etsockopt */
6345#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006349 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006350#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006352#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006353#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006354 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006355#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006356#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006357 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006363 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006365#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006366 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006367#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006368#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006369 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006370#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006374 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006375#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006377#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006378#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006380#endif
6381#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6383 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006384#endif
6385#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6387 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6388 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006389
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006390 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6391 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6392 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006393#endif
6394#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6396 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6397 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6398 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006399#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006400#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006401 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006402 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6403 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6404 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6405 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6406 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6407 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6408 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6409 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6410 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6411 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6412 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6413 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6414#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006415#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006417#endif
6418#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006419 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006420#endif
6421#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006422 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006423#endif
6424#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006425 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006426#endif
6427#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006429#endif
6430#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006432#endif
6433#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006434 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006437 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006438#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006446#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006449#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006450 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006452#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006465 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006466#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006477#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006480#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006481 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006491#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006492#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006494#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006498#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006503#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006505 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006506#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006507#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006508 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006510#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006513#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006517 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006519#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006527#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006533#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006539#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006540#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006545#endif
6546/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006549#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#endif
6555
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006556#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006557 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006558#endif
6559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 /* Some port configuration */
6561#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006563#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006567 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006568#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006570#endif
6571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 /* Some reserved IP v.4 addresses */
6573#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006580#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006581 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006582#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006584 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006585#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006589 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006590#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef INADDR_ALLHOSTS_GROUP
6594 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6595 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006596#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006601#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006606#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006608#endif
6609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610 /* IPv4 [gs]etsockopt options */
6611#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006658#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006659#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006661#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6664#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006669#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006681#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006683#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006687#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006689#endif
6690#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006692#endif
6693#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006695#endif
6696#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006698#endif
6699#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006701#endif
6702#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006704#endif
6705#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006707#endif
6708#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006710#endif
6711#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006713#endif
6714#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006716#endif
6717#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006719#endif
6720#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006722#endif
6723#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006725#endif
6726#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006728#endif
6729#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006731#endif
6732#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006734#endif
6735#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006737#endif
6738#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006740#endif
6741#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006743#endif
6744#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006746#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748 /* TCP options */
6749#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006750 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006751#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006752#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006753 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006757#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006759 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006760#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006763#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006765 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006772#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006774 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006775#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006779#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006784#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006785#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006787#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789 /* IPX options */
6790#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006792#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006793
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006794/* Reliable Datagram Sockets */
6795#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006797#endif
6798#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006800#endif
6801#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006803#endif
6804#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006806#endif
6807#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006809#endif
6810#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006812#endif
6813#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006815#endif
6816#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006818#endif
6819#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006821#endif
6822#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006824#endif
6825#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006827#endif
6828#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006830#endif
6831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006832 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006833#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006835#endif
6836#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006838#endif
6839#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006841#endif
6842#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006844#endif
6845#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006847#endif
6848#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006850#endif
6851#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006853#endif
6854#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006856#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006857#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006859#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006860#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006862#endif
6863#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006865#endif
6866#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006868#endif
6869#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006871#endif
6872#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006874#endif
6875#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006877#endif
6878#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006880#endif
6881#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006883#endif
6884#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006886#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006887#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006889#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006890#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006892#endif
6893#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006895#endif
6896#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006898#endif
6899#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006901#endif
6902#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006903 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006904#endif
6905#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006907#endif
6908#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006910#endif
6911#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006913#endif
6914#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006916#endif
6917#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006919#endif
6920#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006922#endif
6923#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006925#endif
6926#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006928#endif
6929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006931#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006933#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006935#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006937#endif
6938#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006940#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006942#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006943 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006944#endif
6945#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006947#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006948 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006949#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006951#endif
6952
Christian Heimesfaf2f632008-01-06 16:59:19 +00006953#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006954 {
6955 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6956 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6957 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006958 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959 PyObject *tmp;
6960 tmp = PyLong_FromUnsignedLong(codes[i]);
6961 if (tmp == NULL)
6962 return NULL;
6963 PyModule_AddObject(m, names[i], tmp);
6964 }
6965 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, RCVALL_OFF);
6967 PyModule_AddIntMacro(m, RCVALL_ON);
6968 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006969#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006971#endif
6972#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006974#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006975#endif /* _MSTCPIP_ */
6976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006978#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006979 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006982}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006983
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006984
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006985#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006986#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006987
6988/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006989/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006990
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006991int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006992inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006994 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006995#if (SIZEOF_INT != 4)
6996#error "Not sure if in_addr_t exists and int is not 32-bits."
6997#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998 unsigned int packed_addr;
6999 packed_addr = inet_addr(src);
7000 if (packed_addr == INADDR_NONE)
7001 return 0;
7002 memcpy(dst, &packed_addr, 4);
7003 return 1;
7004 }
7005 /* Should set errno to EAFNOSUPPORT */
7006 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007007}
7008
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007009const char *
7010inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007011{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007012 if (af == AF_INET) {
7013 struct in_addr packed_addr;
7014 if (size < 16)
7015 /* Should set errno to ENOSPC. */
7016 return NULL;
7017 memcpy(&packed_addr, src, sizeof(packed_addr));
7018 return strncpy(dst, inet_ntoa(packed_addr), size);
7019 }
7020 /* Should set errno to EAFNOSUPPORT */
7021 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007022}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007023
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007024#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007025#endif