blob: 1444369e1b0a0d466e3956bba5eabd5aeb924ac0 [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
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000036- socket.getaddrinfo(host, port [, family, socktype, proto, flags])
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000037 --> List of (family, socktype, 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\
124listen(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__) || \
191 defined(__VMS) || !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öwis9e437302002-12-06 12:57:26 +0000215#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000216# include <ioctl.h>
217#endif
218
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100219#ifdef __APPLE__
220# include <sys/ioctl.h>
221#endif
222
223
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000225/* make sure that the reentrant (gethostbyaddr_r etc)
226 functions are declared correctly if compiling with
227 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000228
Thomas Wouters477c8d52006-05-27 19:21:47 +0000229/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000230 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000231#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000232#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000233
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000234#undef _XOPEN_SOURCE
235#include <sys/socket.h>
236#include <sys/types.h>
237#include <netinet/in.h>
238#ifdef _SS_ALIGNSIZE
239#define HAVE_GETADDRINFO 1
240#define HAVE_GETNAMEINFO 1
241#endif
242
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000243#define HAVE_INET_PTON
244#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000245#endif
246
Thomas Wouters477c8d52006-05-27 19:21:47 +0000247/* Irix 6.5 fails to define this variable at all. This is needed
248 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000249 are just busted. Same thing for Solaris. */
250#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000251#define INET_ADDRSTRLEN 16
252#endif
253
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000255#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000256#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000257#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000258
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700259#ifdef HAVE_SYS_SOCKET_H
260#include <sys/socket.h>
261#endif
262
263#ifdef HAVE_NET_IF_H
264#include <net/if.h>
265#endif
266
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000267/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000268#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000269#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Addressing includes */
272
Guido van Rossum6f489d91996-06-28 20:15:15 +0000273#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000274
275/* Non-MS WINDOWS includes */
276# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000277# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000278
Guido van Rossum9376b741999-09-15 22:01:40 +0000279/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000280# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000283
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000284#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000285
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000286/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000287# ifdef HAVE_FCNTL_H
288# include <fcntl.h>
289# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000290
Jeremy Hylton22308652001-02-02 03:23:09 +0000291#endif
292
Skip Montanaro7befb992004-02-10 16:50:21 +0000293#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000294
295#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000297#endif
298
Neal Norwitz39d22e52002-11-02 19:55:21 +0000299#ifndef O_NONBLOCK
300# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000301#endif
302
Trent Micka708d6e2004-09-07 17:48:26 +0000303/* include Python's addrinfo.h unless it causes trouble */
304#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
305 /* Do not include addinfo.h on some newer IRIX versions.
306 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
307 * for example, but not by 6.5.10.
308 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000309#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000310 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
311 * EAI_* constants are defined in (the already included) ws2tcpip.h.
312 */
313#else
314# include "addrinfo.h"
315#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000316
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000317#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000318#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000319int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000320const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000321#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000322#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000323
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000324#ifdef __APPLE__
325/* On OS X, getaddrinfo returns no error indication of lookup
326 failure, so we must use the emulation instead of the libinfo
327 implementation. Unfortunately, performing an autoconf test
328 for this bug would require DNS access for the machine performing
329 the configuration, which is not acceptable. Therefore, we
330 determine the bug just by checking for __APPLE__. If this bug
331 gets ever fixed, perhaps checking for sys/version.h would be
332 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000333#ifndef HAVE_GETNAMEINFO
334/* This bug seems to be fixed in Jaguar. Ths easiest way I could
335 Find to check for Jaguar is that it has getnameinfo(), which
336 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000338#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000339
340#ifdef HAVE_INET_ATON
341#define USE_INET_ATON_WEAKLINK
342#endif
343
Jack Jansen84262fb2002-07-02 14:40:42 +0000344#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000345
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000346/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000347#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000348/* avoid clashes with the C library definition of the symbol. */
349#define getaddrinfo fake_getaddrinfo
350#define gai_strerror fake_gai_strerror
351#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000352#include "getaddrinfo.c"
353#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000354#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000355#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000356#include "getnameinfo.c"
357#endif
358
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000359#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000360#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000361#endif
362
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000363#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000364#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000365#define EAFNOSUPPORT WSAEAFNOSUPPORT
366#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000367#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000368
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000369#ifndef SOCKETCLOSE
370#define SOCKETCLOSE close
371#endif
372
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000373#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000374#define USE_BLUETOOTH 1
375#if defined(__FreeBSD__)
376#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
377#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000378#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000379#define SOL_HCI SOL_HCI_RAW
380#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define sockaddr_l2 sockaddr_l2cap
382#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000383#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000384#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
385#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000386#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000387#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_l2 sockaddr_bt
389#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000390#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000392#define SOL_HCI BTPROTO_HCI
393#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
395#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000396#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000397#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000398#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
400#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000401#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000402#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
403#endif
404#endif
405
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000406#ifdef __VMS
407/* TCP/IP Services for VMS uses a maximum send/recv buffer length */
408#define SEGMENT_SIZE (32 * 1024 -1)
409#endif
410
Charles-François Natali8b759652011-12-23 16:44:51 +0100411/* Convert "sock_addr_t *" to "struct sockaddr *". */
412#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000413
Martin v. Löwise9416172003-05-03 10:12:45 +0000414/*
415 * Constants for getnameinfo()
416 */
417#if !defined(NI_MAXHOST)
418#define NI_MAXHOST 1025
419#endif
420#if !defined(NI_MAXSERV)
421#define NI_MAXSERV 32
422#endif
423
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000424#ifndef INVALID_SOCKET /* MS defines this */
425#define INVALID_SOCKET (-1)
426#endif
427
Charles-François Natali0cc86852013-09-13 19:53:08 +0200428#ifndef INADDR_NONE
429#define INADDR_NONE (-1)
430#endif
431
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000432/* XXX There's a problem here: *static* functions are not supposed to have
433 a Py prefix (or use CapitalizedWords). Later... */
434
Guido van Rossum30a685f1991-06-27 15:51:29 +0000435/* Global variable holding the exception type for errors detected
436 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000437static PyObject *socket_herror;
438static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000439static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000440
Tim Peters643a7fc2002-02-17 04:13:21 +0000441/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000442 The sock_type variable contains pointers to various functions,
443 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000444 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000445static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000446
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000447#if defined(HAVE_POLL_H)
448#include <poll.h>
449#elif defined(HAVE_SYS_POLL_H)
450#include <sys/poll.h>
451#endif
452
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000453/* Largest value to try to store in a socklen_t (used when handling
454 ancillary data). POSIX requires socklen_t to hold at least
455 (2**31)-1 and recommends against storing larger values, but
456 socklen_t was originally int in the BSD interface, so to be on the
457 safe side we use the smaller of (2**31)-1 and INT_MAX. */
458#if INT_MAX > 0x7fffffff
459#define SOCKLEN_T_LIMIT 0x7fffffff
460#else
461#define SOCKLEN_T_LIMIT INT_MAX
462#endif
463
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200464#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000465/* Instead of select(), we'll use poll() since poll() works on any fd. */
466#define IS_SELECTABLE(s) 1
467/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000468#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200469/* If there's no timeout left, we don't have to call select, so it's a safe,
470 * little white lie. */
471#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000472#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000473
474static PyObject*
475select_error(void)
476{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200477 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000479}
480
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000481#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000482#ifndef WSAEAGAIN
483#define WSAEAGAIN WSAEWOULDBLOCK
484#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000485#define CHECK_ERRNO(expected) \
486 (WSAGetLastError() == WSA ## expected)
487#else
488#define CHECK_ERRNO(expected) \
489 (errno == expected)
490#endif
491
Victor Stinnerdaf45552013-08-28 00:53:59 +0200492#ifdef MS_WINDOWS
493/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
494static int support_wsa_no_inherit = -1;
495#endif
496
Guido van Rossum30a685f1991-06-27 15:51:29 +0000497/* Convenience function to raise an error according to errno
498 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000499
Guido van Rossum73624e91994-10-10 17:59:00 +0000500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000501set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000502{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000503#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 int err_no = WSAGetLastError();
505 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
506 recognizes the error codes used by both GetLastError() and
507 WSAGetLastError */
508 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200509 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000510#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000511
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200512 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000513}
514
Guido van Rossum30a685f1991-06-27 15:51:29 +0000515
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000517set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000518{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000520
521#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000525#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 if (v != NULL) {
527 PyErr_SetObject(socket_herror, v);
528 Py_DECREF(v);
529 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000532}
533
534
535static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000536set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000539
Martin v. Löwis272cb402002-03-01 08:31:07 +0000540#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 /* EAI_SYSTEM is not available on Windows XP. */
542 if (error == EAI_SYSTEM)
543 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000544#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000545
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000546#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000548#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 if (v != NULL) {
552 PyErr_SetObject(socket_gaierror, v);
553 Py_DECREF(v);
554 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000557}
558
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000559#ifdef __VMS
560/* Function to send in segments */
561static int
562sendsegmented(int sock_fd, char *buf, int len, int flags)
563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 int n = 0;
565 int remaining = len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 while (remaining > 0) {
568 unsigned int segment;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);
571 n = send(sock_fd, buf, segment, flags);
572 if (n < 0) {
573 return n;
574 }
575 remaining -= segment;
576 buf += segment;
577 } /* end while */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 return len;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000580}
581#endif
582
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000583/* Function to perform the setting of socket blocking mode
584 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585static int
586internal_setblocking(PySocketSockObject *s, int block)
587{
Victor Stinner9a954832013-12-04 00:41:24 +0100588#if !defined(MS_WINDOWS) \
589 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)) || defined(__VMS))
590 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000591#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000592#ifdef SOCK_NONBLOCK
593 if (block)
594 s->sock_type &= (~SOCK_NONBLOCK);
595 else
596 s->sock_type |= SOCK_NONBLOCK;
597#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#ifndef MS_WINDOWS
Victor Stinner9a954832013-12-04 00:41:24 +0100601#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)) || defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 block = !block;
603 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100604#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
606 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100607 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000608 else
Victor Stinner9a954832013-12-04 00:41:24 +0100609 new_delay_flag = delay_flag | O_NONBLOCK;
610 if (new_delay_flag != delay_flag)
611 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
612#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000613#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 block = !block;
615 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000616#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Since these don't return anything */
620 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000621}
622
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000623/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000624 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000625 This does not raise an exception; we'll let our caller do that
626 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000627 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000628static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000629internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 /* Nothing to do unless we're in timeout mode (not non-blocking) */
634 if (s->sock_timeout <= 0.0)
635 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 /* Guard against closed socket */
638 if (s->sock_fd < 0)
639 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000640
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000641 /* Handling this condition here simplifies the select loops */
642 if (interval < 0.0)
643 return 1;
644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 /* Prefer poll, if available, since you can poll() any fd
646 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000647#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000648 {
649 struct pollfd pollfd;
650 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 pollfd.fd = s->sock_fd;
653 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000656 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 n = poll(&pollfd, 1, timeout);
658 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000659#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 {
661 /* Construct the arguments to select */
662 fd_set fds;
663 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000664 tv.tv_sec = (int)interval;
665 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000666 FD_ZERO(&fds);
667 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 /* See if the socket is ready */
670 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000671 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
672 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000674 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
675 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000677#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (n < 0)
680 return -1;
681 if (n == 0)
682 return 1;
683 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000684}
685
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000686static int
687internal_select(PySocketSockObject *s, int writing)
688{
689 return internal_select_ex(s, writing, s->sock_timeout);
690}
691
692/*
693 Two macros for automatic retry of select() in case of false positives
694 (for example, select() could indicate a socket is ready for reading
695 but the data then discarded by the OS because of a wrong checksum).
696 Here is an example of use:
697
698 BEGIN_SELECT_LOOP(s)
699 Py_BEGIN_ALLOW_THREADS
700 timeout = internal_select_ex(s, 0, interval);
701 if (!timeout)
702 outlen = recv(s->sock_fd, cbuf, len, flags);
703 Py_END_ALLOW_THREADS
704 if (timeout == 1) {
705 PyErr_SetString(socket_timeout, "timed out");
706 return -1;
707 }
708 END_SELECT_LOOP(s)
709*/
710
711#define BEGIN_SELECT_LOOP(s) \
712 { \
713 _PyTime_timeval now, deadline = {0, 0}; \
714 double interval = s->sock_timeout; \
715 int has_timeout = s->sock_timeout > 0.0; \
716 if (has_timeout) { \
717 _PyTime_gettimeofday(&now); \
718 deadline = now; \
719 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
720 } \
721 while (1) { \
722 errno = 0; \
723
724#define END_SELECT_LOOP(s) \
725 if (!has_timeout || \
726 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
727 break; \
728 _PyTime_gettimeofday(&now); \
729 interval = _PyTime_INTERVAL(now, deadline); \
730 } \
731 } \
732
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000733/* Initialize a new socket object. */
734
Tim Petersa12b4cf2002-07-18 22:38:44 +0000735static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000736
Martin v. Löwis1a214512008-06-11 05:26:20 +0000737static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000738init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000741 s->sock_fd = fd;
742 s->sock_family = family;
743 s->sock_type = type;
744 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000745
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000747#ifdef SOCK_NONBLOCK
748 if (type & SOCK_NONBLOCK)
749 s->sock_timeout = 0.0;
750 else
751#endif
752 {
753 s->sock_timeout = defaulttimeout;
754 if (defaulttimeout >= 0.0)
755 internal_setblocking(s, 0);
756 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000757
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000758}
759
760
Guido van Rossum30a685f1991-06-27 15:51:29 +0000761/* Create a new socket object.
762 This just creates the object and initializes it.
763 If the creation fails, return NULL and set an exception (implicit
764 in NEWOBJ()). */
765
Guido van Rossum73624e91994-10-10 17:59:00 +0000766static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000767new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 PySocketSockObject *s;
770 s = (PySocketSockObject *)
771 PyType_GenericNew(&sock_type, NULL, NULL);
772 if (s != NULL)
773 init_sockobject(s, fd, family, type, proto);
774 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000775}
776
Guido van Rossum30a685f1991-06-27 15:51:29 +0000777
Guido van Rossum48a680c2001-03-02 06:34:14 +0000778/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000779 thread to be in gethostbyname or getaddrinfo */
780#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200781static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000782#endif
783
784
Guido van Rossum30a685f1991-06-27 15:51:29 +0000785/* Convert a string specifying a host name or one of a few symbolic
786 names to a numeric IP address. This usually calls gethostbyname()
787 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000788 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000789 an error occurred; then an exception is raised. */
790
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000792setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 struct addrinfo hints, *res;
795 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
798 if (name[0] == '\0') {
799 int siz;
800 memset(&hints, 0, sizeof(hints));
801 hints.ai_family = af;
802 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
803 hints.ai_flags = AI_PASSIVE;
804 Py_BEGIN_ALLOW_THREADS
805 ACQUIRE_GETADDRINFO_LOCK
806 error = getaddrinfo(NULL, "0", &hints, &res);
807 Py_END_ALLOW_THREADS
808 /* We assume that those thread-unsafe getaddrinfo() versions
809 *are* safe regarding their return value, ie. that a
810 subsequent call to getaddrinfo() does not destroy the
811 outcome of the first call. */
812 RELEASE_GETADDRINFO_LOCK
813 if (error) {
814 set_gaierror(error);
815 return -1;
816 }
817 switch (res->ai_family) {
818 case AF_INET:
819 siz = 4;
820 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000821#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 case AF_INET6:
823 siz = 16;
824 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 default:
827 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200828 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 "unsupported address family");
830 return -1;
831 }
832 if (res->ai_next) {
833 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200834 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 "wildcard resolved to multiple address");
836 return -1;
837 }
838 if (res->ai_addrlen < addr_ret_size)
839 addr_ret_size = res->ai_addrlen;
840 memcpy(addr_ret, res->ai_addr, addr_ret_size);
841 freeaddrinfo(res);
842 return siz;
843 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200844 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100845 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200846 if (strcmp(name, "255.255.255.255") == 0 ||
847 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 struct sockaddr_in *sin;
849 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200850 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 "address family mismatched");
852 return -1;
853 }
854 sin = (struct sockaddr_in *)addr_ret;
855 memset((void *) sin, '\0', sizeof(*sin));
856 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000857#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 sin->sin_addr.s_addr = INADDR_BROADCAST;
861 return sizeof(sin->sin_addr);
862 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200863
864 /* avoid a name resolution in case of numeric address */
865#ifdef HAVE_INET_PTON
866 /* check for an IPv4 address */
867 if (af == AF_UNSPEC || af == AF_INET) {
868 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
869 memset(sin, 0, sizeof(*sin));
870 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
871 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000872#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200873 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000874#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200875 return 4;
876 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200878#ifdef ENABLE_IPV6
879 /* check for an IPv6 address - if the address contains a scope ID, we
880 * fallback to getaddrinfo(), which can handle translation from interface
881 * name to interface index */
882 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
883 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
884 memset(sin, 0, sizeof(*sin));
885 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
886 sin->sin6_family = AF_INET6;
887#ifdef HAVE_SOCKADDR_SA_LEN
888 sin->sin6_len = sizeof(*sin);
889#endif
890 return 16;
891 }
892 }
893#endif /* ENABLE_IPV6 */
894#else /* HAVE_INET_PTON */
895 /* check for an IPv4 address */
896 if (af == AF_INET || af == AF_UNSPEC) {
897 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
898 memset(sin, 0, sizeof(*sin));
899 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
900 sin->sin_family = AF_INET;
901#ifdef HAVE_SOCKADDR_SA_LEN
902 sin->sin_len = sizeof(*sin);
903#endif
904 return 4;
905 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100906 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200907#endif /* HAVE_INET_PTON */
908
909 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 memset(&hints, 0, sizeof(hints));
911 hints.ai_family = af;
912 Py_BEGIN_ALLOW_THREADS
913 ACQUIRE_GETADDRINFO_LOCK
914 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000915#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 if (error == EAI_NONAME && af == AF_UNSPEC) {
917 /* On Tru64 V5.1, numeric-to-addr conversion fails
918 if no address family is given. Assume IPv4 for now.*/
919 hints.ai_family = AF_INET;
920 error = getaddrinfo(name, NULL, &hints, &res);
921 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 Py_END_ALLOW_THREADS
924 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
925 if (error) {
926 set_gaierror(error);
927 return -1;
928 }
929 if (res->ai_addrlen < addr_ret_size)
930 addr_ret_size = res->ai_addrlen;
931 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
932 freeaddrinfo(res);
933 switch (addr_ret->sa_family) {
934 case AF_INET:
935 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000936#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 case AF_INET6:
938 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000939#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200941 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 return -1;
943 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000944}
945
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946
Guido van Rossum30a685f1991-06-27 15:51:29 +0000947/* Create a string object representing an IP address.
948 This is always a string of the form 'dd.dd.dd.dd' (with variable
949 size numbers). */
950
Guido van Rossum73624e91994-10-10 17:59:00 +0000951static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000952makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 char buf[NI_MAXHOST];
955 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
958 NI_NUMERICHOST);
959 if (error) {
960 set_gaierror(error);
961 return NULL;
962 }
963 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000964}
965
966
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000967#ifdef USE_BLUETOOTH
968/* Convert a string representation of a Bluetooth address into a numeric
969 address. Returns the length (6), or raises an exception and returns -1 if
970 an error occurred. */
971
972static int
973setbdaddr(char *name, bdaddr_t *bdaddr)
974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 unsigned int b0, b1, b2, b3, b4, b5;
976 char ch;
977 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
980 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
981 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
982 bdaddr->b[0] = b0;
983 bdaddr->b[1] = b1;
984 bdaddr->b[2] = b2;
985 bdaddr->b[3] = b3;
986 bdaddr->b[4] = b4;
987 bdaddr->b[5] = b5;
988 return 6;
989 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200990 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 return -1;
992 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000993}
994
995/* Create a string representation of the Bluetooth address. This is always a
996 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
997 value (zero padded if necessary). */
998
999static PyObject *
1000makebdaddr(bdaddr_t *bdaddr)
1001{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001004 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1005 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1006 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1007 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001008}
1009#endif
1010
1011
Guido van Rossum30a685f1991-06-27 15:51:29 +00001012/* Create an object representing the given socket address,
1013 suitable for passing it back to bind(), connect() etc.
1014 The family field of the sockaddr structure is inspected
1015 to determine what kind of address it really is. */
1016
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001017/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001018static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001019makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001020{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021 if (addrlen == 0) {
1022 /* No address -- may be recvfrom() from known socket */
1023 Py_INCREF(Py_None);
1024 return Py_None;
1025 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 case AF_INET:
1030 {
1031 struct sockaddr_in *a;
1032 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1033 PyObject *ret = NULL;
1034 if (addrobj) {
1035 a = (struct sockaddr_in *)addr;
1036 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1037 Py_DECREF(addrobj);
1038 }
1039 return ret;
1040 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001041
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001042#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 case AF_UNIX:
1044 {
1045 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001046#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1048 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001049 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 }
1051 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001052#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 {
1054 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001055 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 }
1057 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001058#endif /* AF_UNIX */
1059
Martin v. Löwis11017b12006-01-14 18:12:57 +00001060#if defined(AF_NETLINK)
1061 case AF_NETLINK:
1062 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1064 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001065 }
1066#endif /* AF_NETLINK */
1067
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001068#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 case AF_INET6:
1070 {
1071 struct sockaddr_in6 *a;
1072 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1073 PyObject *ret = NULL;
1074 if (addrobj) {
1075 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001076 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 addrobj,
1078 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001079 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001080 a->sin6_scope_id);
1081 Py_DECREF(addrobj);
1082 }
1083 return ret;
1084 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001085#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001086
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001087#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 case AF_BLUETOOTH:
1089 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 case BTPROTO_L2CAP:
1092 {
1093 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1094 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1095 PyObject *ret = NULL;
1096 if (addrobj) {
1097 ret = Py_BuildValue("Oi",
1098 addrobj,
1099 _BT_L2_MEMB(a, psm));
1100 Py_DECREF(addrobj);
1101 }
1102 return ret;
1103 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 case BTPROTO_RFCOMM:
1106 {
1107 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1108 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1109 PyObject *ret = NULL;
1110 if (addrobj) {
1111 ret = Py_BuildValue("Oi",
1112 addrobj,
1113 _BT_RC_MEMB(a, channel));
1114 Py_DECREF(addrobj);
1115 }
1116 return ret;
1117 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 case BTPROTO_HCI:
1120 {
1121 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001122#if defined(__NetBSD__) || defined(__DragonFly__)
1123 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 PyObject *ret = NULL;
1126 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1127 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001129 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001130
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001131#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 case BTPROTO_SCO:
1133 {
1134 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1135 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1136 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137#endif
1138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 default:
1140 PyErr_SetString(PyExc_ValueError,
1141 "Unknown Bluetooth protocol");
1142 return NULL;
1143 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001144#endif
1145
Antoine Pitroub156a462010-10-27 20:13:57 +00001146#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 case AF_PACKET:
1148 {
1149 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1150 char *ifname = "";
1151 struct ifreq ifr;
1152 /* need to look up interface name give index */
1153 if (a->sll_ifindex) {
1154 ifr.ifr_ifindex = a->sll_ifindex;
1155 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1156 ifname = ifr.ifr_name;
1157 }
1158 return Py_BuildValue("shbhy#",
1159 ifname,
1160 ntohs(a->sll_protocol),
1161 a->sll_pkttype,
1162 a->sll_hatype,
1163 a->sll_addr,
1164 a->sll_halen);
1165 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001166#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001167
Christian Heimes043d6f62008-01-07 17:19:16 +00001168#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 case AF_TIPC:
1170 {
1171 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1172 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1173 return Py_BuildValue("IIIII",
1174 a->addrtype,
1175 a->addr.nameseq.type,
1176 a->addr.nameseq.lower,
1177 a->addr.nameseq.upper,
1178 a->scope);
1179 } else if (a->addrtype == TIPC_ADDR_NAME) {
1180 return Py_BuildValue("IIIII",
1181 a->addrtype,
1182 a->addr.name.name.type,
1183 a->addr.name.name.instance,
1184 a->addr.name.name.instance,
1185 a->scope);
1186 } else if (a->addrtype == TIPC_ADDR_ID) {
1187 return Py_BuildValue("IIIII",
1188 a->addrtype,
1189 a->addr.id.node,
1190 a->addr.id.ref,
1191 0,
1192 a->scope);
1193 } else {
1194 PyErr_SetString(PyExc_ValueError,
1195 "Invalid address type");
1196 return NULL;
1197 }
1198 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001199#endif
1200
Charles-François Natali30589c92011-10-07 22:47:08 +02001201#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001202 case AF_CAN:
1203 {
1204 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1205 char *ifname = "";
1206 struct ifreq ifr;
1207 /* need to look up interface name given index */
1208 if (a->can_ifindex) {
1209 ifr.ifr_ifindex = a->can_ifindex;
1210 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1211 ifname = ifr.ifr_name;
1212 }
1213
1214 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1215 ifname,
1216 a->can_family);
1217 }
1218#endif
1219
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001220#ifdef PF_SYSTEM
1221 case PF_SYSTEM:
1222 switch(proto) {
1223#ifdef SYSPROTO_CONTROL
1224 case SYSPROTO_CONTROL:
1225 {
1226 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1227 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1228 }
1229#endif
1230 default:
1231 PyErr_SetString(PyExc_ValueError,
1232 "Invalid address type");
1233 return 0;
1234 }
1235#endif
1236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 default:
1240 /* If we don't know the address family, don't raise an
1241 exception -- return it as an (int, bytes) tuple. */
1242 return Py_BuildValue("iy#",
1243 addr->sa_family,
1244 addr->sa_data,
1245 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001248}
1249
Guido van Rossum30a685f1991-06-27 15:51:29 +00001250
1251/* Parse a socket address argument according to the socket object's
1252 address family. Return 1 if the address was in the proper format,
1253 0 of not. The address is returned through addr_ret, its length
1254 through len_ret. */
1255
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001256static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001257getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001259{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001261
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001262#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001263 case AF_UNIX:
1264 {
1265 struct sockaddr_un* addr;
1266 char *path;
1267 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001268 int retval = 0;
1269
1270 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1271 allow embedded nulls on Linux. */
1272 if (PyUnicode_Check(args)) {
1273 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1274 return 0;
1275 }
1276 else
1277 Py_INCREF(args);
1278 if (!PyArg_Parse(args, "y#", &path, &len))
1279 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001282#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001283 if (len > 0 && path[0] == 0) {
1284 /* Linux abstract namespace extension */
1285 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001286 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001288 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 }
1290 }
1291 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001292#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001293 {
1294 /* regular NULL-terminated string */
1295 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001296 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001298 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001299 }
1300 addr->sun_path[len] = 0;
1301 }
1302 addr->sun_family = s->sock_family;
1303 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001304 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001305 retval = 1;
1306 unix_out:
1307 Py_DECREF(args);
1308 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001309 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001310#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001311
Martin v. Löwis11017b12006-01-14 18:12:57 +00001312#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001313 case AF_NETLINK:
1314 {
1315 struct sockaddr_nl* addr;
1316 int pid, groups;
1317 addr = (struct sockaddr_nl *)addr_ret;
1318 if (!PyTuple_Check(args)) {
1319 PyErr_Format(
1320 PyExc_TypeError,
1321 "getsockaddrarg: "
1322 "AF_NETLINK address must be tuple, not %.500s",
1323 Py_TYPE(args)->tp_name);
1324 return 0;
1325 }
1326 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1327 return 0;
1328 addr->nl_family = AF_NETLINK;
1329 addr->nl_pid = pid;
1330 addr->nl_groups = groups;
1331 *len_ret = sizeof(*addr);
1332 return 1;
1333 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001334#endif
1335
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001336#ifdef AF_RDS
1337 case AF_RDS:
1338 /* RDS sockets use sockaddr_in: fall-through */
1339#endif
1340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 case AF_INET:
1342 {
1343 struct sockaddr_in* addr;
1344 char *host;
1345 int port, result;
1346 if (!PyTuple_Check(args)) {
1347 PyErr_Format(
1348 PyExc_TypeError,
1349 "getsockaddrarg: "
1350 "AF_INET address must be tuple, not %.500s",
1351 Py_TYPE(args)->tp_name);
1352 return 0;
1353 }
1354 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1355 "idna", &host, &port))
1356 return 0;
1357 addr=(struct sockaddr_in*)addr_ret;
1358 result = setipaddr(host, (struct sockaddr *)addr,
1359 sizeof(*addr), AF_INET);
1360 PyMem_Free(host);
1361 if (result < 0)
1362 return 0;
1363 if (port < 0 || port > 0xffff) {
1364 PyErr_SetString(
1365 PyExc_OverflowError,
1366 "getsockaddrarg: port must be 0-65535.");
1367 return 0;
1368 }
1369 addr->sin_family = AF_INET;
1370 addr->sin_port = htons((short)port);
1371 *len_ret = sizeof *addr;
1372 return 1;
1373 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001374
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001375#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 case AF_INET6:
1377 {
1378 struct sockaddr_in6* addr;
1379 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001380 int port, result;
1381 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001382 flowinfo = scope_id = 0;
1383 if (!PyTuple_Check(args)) {
1384 PyErr_Format(
1385 PyExc_TypeError,
1386 "getsockaddrarg: "
1387 "AF_INET6 address must be tuple, not %.500s",
1388 Py_TYPE(args)->tp_name);
1389 return 0;
1390 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001391 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 "idna", &host, &port, &flowinfo,
1393 &scope_id)) {
1394 return 0;
1395 }
1396 addr = (struct sockaddr_in6*)addr_ret;
1397 result = setipaddr(host, (struct sockaddr *)addr,
1398 sizeof(*addr), AF_INET6);
1399 PyMem_Free(host);
1400 if (result < 0)
1401 return 0;
1402 if (port < 0 || port > 0xffff) {
1403 PyErr_SetString(
1404 PyExc_OverflowError,
1405 "getsockaddrarg: port must be 0-65535.");
1406 return 0;
1407 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001408 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001409 PyErr_SetString(
1410 PyExc_OverflowError,
1411 "getsockaddrarg: flowinfo must be 0-1048575.");
1412 return 0;
1413 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001414 addr->sin6_family = s->sock_family;
1415 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001416 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 addr->sin6_scope_id = scope_id;
1418 *len_ret = sizeof *addr;
1419 return 1;
1420 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001421#endif
1422
Hye-Shik Chang81268602004-02-02 06:05:24 +00001423#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 case AF_BLUETOOTH:
1425 {
1426 switch (s->sock_proto) {
1427 case BTPROTO_L2CAP:
1428 {
1429 struct sockaddr_l2 *addr;
1430 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 addr = (struct sockaddr_l2 *)addr_ret;
1433 memset(addr, 0, sizeof(struct sockaddr_l2));
1434 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1435 if (!PyArg_ParseTuple(args, "si", &straddr,
1436 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001437 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 "wrong format");
1439 return 0;
1440 }
1441 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1442 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001444 *len_ret = sizeof *addr;
1445 return 1;
1446 }
1447 case BTPROTO_RFCOMM:
1448 {
1449 struct sockaddr_rc *addr;
1450 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001452 addr = (struct sockaddr_rc *)addr_ret;
1453 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1454 if (!PyArg_ParseTuple(args, "si", &straddr,
1455 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001456 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 "wrong format");
1458 return 0;
1459 }
1460 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1461 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 *len_ret = sizeof *addr;
1464 return 1;
1465 }
1466 case BTPROTO_HCI:
1467 {
1468 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001469#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001470 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001471
Alexander Belopolskye239d232010-12-08 23:31:48 +00001472 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001473 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001474 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001475 "wrong format");
1476 return 0;
1477 }
1478 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1479 return 0;
1480#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1482 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001483 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 "wrong format");
1485 return 0;
1486 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 *len_ret = sizeof *addr;
1489 return 1;
1490 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001491#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 case BTPROTO_SCO:
1493 {
1494 struct sockaddr_sco *addr;
1495 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 addr = (struct sockaddr_sco *)addr_ret;
1498 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1499 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001500 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 "wrong format");
1502 return 0;
1503 }
1504 straddr = PyBytes_AS_STRING(args);
1505 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1506 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001508 *len_ret = sizeof *addr;
1509 return 1;
1510 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001513 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001514 return 0;
1515 }
1516 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001517#endif
1518
Antoine Pitroub156a462010-10-27 20:13:57 +00001519#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 case AF_PACKET:
1521 {
1522 struct sockaddr_ll* addr;
1523 struct ifreq ifr;
1524 char *interfaceName;
1525 int protoNumber;
1526 int hatype = 0;
1527 int pkttype = 0;
1528 char *haddr = NULL;
1529 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 if (!PyTuple_Check(args)) {
1532 PyErr_Format(
1533 PyExc_TypeError,
1534 "getsockaddrarg: "
1535 "AF_PACKET address must be tuple, not %.500s",
1536 Py_TYPE(args)->tp_name);
1537 return 0;
1538 }
1539 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1540 &protoNumber, &pkttype, &hatype,
1541 &haddr, &halen))
1542 return 0;
1543 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1544 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1545 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1546 s->errorhandler();
1547 return 0;
1548 }
1549 if (halen > 8) {
1550 PyErr_SetString(PyExc_ValueError,
1551 "Hardware address must be 8 bytes or less");
1552 return 0;
1553 }
1554 if (protoNumber < 0 || protoNumber > 0xffff) {
1555 PyErr_SetString(
1556 PyExc_OverflowError,
1557 "getsockaddrarg: protoNumber must be 0-65535.");
1558 return 0;
1559 }
1560 addr = (struct sockaddr_ll*)addr_ret;
1561 addr->sll_family = AF_PACKET;
1562 addr->sll_protocol = htons((short)protoNumber);
1563 addr->sll_ifindex = ifr.ifr_ifindex;
1564 addr->sll_pkttype = pkttype;
1565 addr->sll_hatype = hatype;
1566 if (halen != 0) {
1567 memcpy(&addr->sll_addr, haddr, halen);
1568 }
1569 addr->sll_halen = halen;
1570 *len_ret = sizeof *addr;
1571 return 1;
1572 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001573#endif
1574
Christian Heimes043d6f62008-01-07 17:19:16 +00001575#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 case AF_TIPC:
1577 {
1578 unsigned int atype, v1, v2, v3;
1579 unsigned int scope = TIPC_CLUSTER_SCOPE;
1580 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001582 if (!PyTuple_Check(args)) {
1583 PyErr_Format(
1584 PyExc_TypeError,
1585 "getsockaddrarg: "
1586 "AF_TIPC address must be tuple, not %.500s",
1587 Py_TYPE(args)->tp_name);
1588 return 0;
1589 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (!PyArg_ParseTuple(args,
1592 "IIII|I;Invalid TIPC address format",
1593 &atype, &v1, &v2, &v3, &scope))
1594 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001596 addr = (struct sockaddr_tipc *) addr_ret;
1597 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 addr->family = AF_TIPC;
1600 addr->scope = scope;
1601 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001603 if (atype == TIPC_ADDR_NAMESEQ) {
1604 addr->addr.nameseq.type = v1;
1605 addr->addr.nameseq.lower = v2;
1606 addr->addr.nameseq.upper = v3;
1607 } else if (atype == TIPC_ADDR_NAME) {
1608 addr->addr.name.name.type = v1;
1609 addr->addr.name.name.instance = v2;
1610 } else if (atype == TIPC_ADDR_ID) {
1611 addr->addr.id.node = v1;
1612 addr->addr.id.ref = v2;
1613 } else {
1614 /* Shouldn't happen */
1615 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1616 return 0;
1617 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 return 1;
1622 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001623#endif
1624
Charles-François Natali30589c92011-10-07 22:47:08 +02001625#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001626 case AF_CAN:
1627 switch (s->sock_proto) {
1628 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001629 /* fall-through */
1630 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001631 {
1632 struct sockaddr_can *addr;
1633 PyObject *interfaceName;
1634 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001635 Py_ssize_t len;
1636
Benjamin Peterson18b71912013-05-16 15:29:44 -05001637 addr = (struct sockaddr_can *)addr_ret;
1638
Charles-François Natali47413c12011-10-06 19:47:44 +02001639 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1640 &interfaceName))
1641 return 0;
1642
1643 len = PyBytes_GET_SIZE(interfaceName);
1644
1645 if (len == 0) {
1646 ifr.ifr_ifindex = 0;
1647 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001648 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1649 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001650 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1651 s->errorhandler();
1652 Py_DECREF(interfaceName);
1653 return 0;
1654 }
1655 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001656 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001657 "AF_CAN interface name too long");
1658 Py_DECREF(interfaceName);
1659 return 0;
1660 }
1661
1662 addr->can_family = AF_CAN;
1663 addr->can_ifindex = ifr.ifr_ifindex;
1664
1665 *len_ret = sizeof(*addr);
1666 Py_DECREF(interfaceName);
1667 return 1;
1668 }
1669 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001670 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001671 "getsockaddrarg: unsupported CAN protocol");
1672 return 0;
1673 }
1674#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001675
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001676#ifdef PF_SYSTEM
1677 case PF_SYSTEM:
1678 switch (s->sock_proto) {
1679#ifdef SYSPROTO_CONTROL
1680 case SYSPROTO_CONTROL:
1681 {
1682 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001683
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001684 addr = (struct sockaddr_ctl *)addr_ret;
1685 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001686 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001687
1688 if (PyUnicode_Check(args)) {
1689 struct ctl_info info;
1690 PyObject *ctl_name;
1691
1692 if (!PyArg_Parse(args, "O&",
1693 PyUnicode_FSConverter, &ctl_name)) {
1694 return 0;
1695 }
1696
1697 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1698 PyErr_SetString(PyExc_ValueError,
1699 "provided string is too long");
1700 Py_DECREF(ctl_name);
1701 return 0;
1702 }
1703 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1704 sizeof(info.ctl_name));
1705 Py_DECREF(ctl_name);
1706
1707 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1708 PyErr_SetString(PyExc_OSError,
1709 "cannot find kernel control with provided name");
1710 return 0;
1711 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001712
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001713 addr->sc_id = info.ctl_id;
1714 addr->sc_unit = 0;
1715 } else if (!PyArg_ParseTuple(args, "II",
1716 &(addr->sc_id), &(addr->sc_unit))) {
1717 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1718 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001719
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001720 return 0;
1721 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001722
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001723 *len_ret = sizeof(*addr);
1724 return 1;
1725 }
1726#endif
1727 default:
1728 PyErr_SetString(PyExc_OSError,
1729 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1730 return 0;
1731 }
1732#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001737 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001741}
1742
Guido van Rossum30a685f1991-06-27 15:51:29 +00001743
Guido van Rossum48a680c2001-03-02 06:34:14 +00001744/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001745 Return 1 if the family is known, 0 otherwise. The length is returned
1746 through len_ret. */
1747
1748static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001749getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001750{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001752
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001753#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 case AF_UNIX:
1755 {
1756 *len_ret = sizeof (struct sockaddr_un);
1757 return 1;
1758 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001759#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001760#if defined(AF_NETLINK)
1761 case AF_NETLINK:
1762 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001763 *len_ret = sizeof (struct sockaddr_nl);
1764 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001765 }
1766#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001767
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001768#ifdef AF_RDS
1769 case AF_RDS:
1770 /* RDS sockets use sockaddr_in: fall-through */
1771#endif
1772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001773 case AF_INET:
1774 {
1775 *len_ret = sizeof (struct sockaddr_in);
1776 return 1;
1777 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001778
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001779#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 case AF_INET6:
1781 {
1782 *len_ret = sizeof (struct sockaddr_in6);
1783 return 1;
1784 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001785#endif
1786
Hye-Shik Chang81268602004-02-02 06:05:24 +00001787#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001788 case AF_BLUETOOTH:
1789 {
1790 switch(s->sock_proto)
1791 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001793 case BTPROTO_L2CAP:
1794 *len_ret = sizeof (struct sockaddr_l2);
1795 return 1;
1796 case BTPROTO_RFCOMM:
1797 *len_ret = sizeof (struct sockaddr_rc);
1798 return 1;
1799 case BTPROTO_HCI:
1800 *len_ret = sizeof (struct sockaddr_hci);
1801 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001802#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001803 case BTPROTO_SCO:
1804 *len_ret = sizeof (struct sockaddr_sco);
1805 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001808 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 "unknown BT protocol");
1810 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 }
1813 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001814#endif
1815
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001816#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 case AF_PACKET:
1818 {
1819 *len_ret = sizeof (struct sockaddr_ll);
1820 return 1;
1821 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001822#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001823
Christian Heimes043d6f62008-01-07 17:19:16 +00001824#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001825 case AF_TIPC:
1826 {
1827 *len_ret = sizeof (struct sockaddr_tipc);
1828 return 1;
1829 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001830#endif
1831
Charles-François Natali30589c92011-10-07 22:47:08 +02001832#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001833 case AF_CAN:
1834 {
1835 *len_ret = sizeof (struct sockaddr_can);
1836 return 1;
1837 }
1838#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001839
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001840#ifdef PF_SYSTEM
1841 case PF_SYSTEM:
1842 switch(s->sock_proto) {
1843#ifdef SYSPROTO_CONTROL
1844 case SYSPROTO_CONTROL:
1845 *len_ret = sizeof (struct sockaddr_ctl);
1846 return 1;
1847#endif
1848 default:
1849 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1850 "unknown PF_SYSTEM protocol");
1851 return 0;
1852 }
1853#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001858 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001861 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001862}
1863
1864
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001865/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1866 Currently, these methods are only compiled if the RFC 2292/3542
1867 CMSG_LEN() macro is available. Older systems seem to have used
1868 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1869 it may be possible to define CMSG_LEN() that way if it's not
1870 provided. Some architectures might need extra padding after the
1871 cmsghdr, however, and CMSG_LEN() would have to take account of
1872 this. */
1873#ifdef CMSG_LEN
1874/* If length is in range, set *result to CMSG_LEN(length) and return
1875 true; otherwise, return false. */
1876static int
1877get_CMSG_LEN(size_t length, size_t *result)
1878{
1879 size_t tmp;
1880
1881 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1882 return 0;
1883 tmp = CMSG_LEN(length);
1884 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1885 return 0;
1886 *result = tmp;
1887 return 1;
1888}
1889
1890#ifdef CMSG_SPACE
1891/* If length is in range, set *result to CMSG_SPACE(length) and return
1892 true; otherwise, return false. */
1893static int
1894get_CMSG_SPACE(size_t length, size_t *result)
1895{
1896 size_t tmp;
1897
1898 /* Use CMSG_SPACE(1) here in order to take account of the padding
1899 necessary before *and* after the data. */
1900 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1901 return 0;
1902 tmp = CMSG_SPACE(length);
1903 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1904 return 0;
1905 *result = tmp;
1906 return 1;
1907}
1908#endif
1909
1910/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1911 pointer in msg->msg_control with at least "space" bytes after it,
1912 and its cmsg_len member inside the buffer. */
1913static int
1914cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1915{
1916 size_t cmsg_offset;
1917 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1918 sizeof(cmsgh->cmsg_len));
1919
Charles-François Natali466517d2011-08-28 18:23:43 +02001920 /* Note that POSIX allows msg_controllen to be of signed type. */
1921 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001922 return 0;
1923 if (space < cmsg_len_end)
1924 space = cmsg_len_end;
1925 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1926 return (cmsg_offset <= (size_t)-1 - space &&
1927 cmsg_offset + space <= msg->msg_controllen);
1928}
1929
1930/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1931 *space to number of bytes following it in the buffer and return
1932 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1933 msg->msg_controllen are valid. */
1934static int
1935get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1936{
1937 size_t data_offset;
1938 char *data_ptr;
1939
1940 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1941 return 0;
1942 data_offset = data_ptr - (char *)msg->msg_control;
1943 if (data_offset > msg->msg_controllen)
1944 return 0;
1945 *space = msg->msg_controllen - data_offset;
1946 return 1;
1947}
1948
1949/* If cmsgh is invalid or not contained in the buffer pointed to by
1950 msg->msg_control, return -1. If cmsgh is valid and its associated
1951 data is entirely contained in the buffer, set *data_len to the
1952 length of the associated data and return 0. If only part of the
1953 associated data is contained in the buffer but cmsgh is otherwise
1954 valid, set *data_len to the length contained in the buffer and
1955 return 1. */
1956static int
1957get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1958{
1959 size_t space, cmsg_data_len;
1960
1961 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1962 cmsgh->cmsg_len < CMSG_LEN(0))
1963 return -1;
1964 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1965 if (!get_cmsg_data_space(msg, cmsgh, &space))
1966 return -1;
1967 if (space >= cmsg_data_len) {
1968 *data_len = cmsg_data_len;
1969 return 0;
1970 }
1971 *data_len = space;
1972 return 1;
1973}
1974#endif /* CMSG_LEN */
1975
1976
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001977/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001978
Guido van Rossum73624e91994-10-10 17:59:00 +00001979static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001980sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 sock_addr_t addrbuf;
1983 SOCKET_T newfd = INVALID_SOCKET;
1984 socklen_t addrlen;
1985 PyObject *sock = NULL;
1986 PyObject *addr = NULL;
1987 PyObject *res = NULL;
1988 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001989#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1990 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
1991 static int accept4_works = -1;
1992#endif
1993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001994 if (!getsockaddrlen(s, &addrlen))
1995 return NULL;
1996 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 if (!IS_SELECTABLE(s))
1999 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002000
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002001 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002004 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002005 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002006#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2007 if (accept4_works != 0) {
2008 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2009 SOCK_CLOEXEC);
2010 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2011 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2012 accept4_works = (errno != ENOSYS);
2013 }
2014 }
2015 if (accept4_works == 0)
2016 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2017#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002019#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002020 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002023 if (timeout == 1) {
2024 PyErr_SetString(socket_timeout, "timed out");
2025 return NULL;
2026 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002027 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002029 if (newfd == INVALID_SOCKET)
2030 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002031
Victor Stinnerdaf45552013-08-28 00:53:59 +02002032#ifdef MS_WINDOWS
2033 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2034 PyErr_SetFromWindowsErr(0);
2035 SOCKETCLOSE(newfd);
2036 goto finally;
2037 }
2038#else
2039
2040#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2041 if (!accept4_works)
2042#endif
2043 {
2044 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2045 SOCKETCLOSE(newfd);
2046 goto finally;
2047 }
2048 }
2049#endif
2050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002051 sock = PyLong_FromSocket_t(newfd);
2052 if (sock == NULL) {
2053 SOCKETCLOSE(newfd);
2054 goto finally;
2055 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002057 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2058 addrlen, s->sock_proto);
2059 if (addr == NULL)
2060 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002062 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002063
Guido van Rossum67f7a382002-06-06 21:08:16 +00002064finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002065 Py_XDECREF(sock);
2066 Py_XDECREF(addr);
2067 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002068}
2069
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002070PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002071"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002072\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002073Wait for an incoming connection. Return a new socket file descriptor\n\
2074representing the connection, and the address of the client.\n\
2075For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002076
Guido van Rossum11ba0942002-06-13 15:07:44 +00002077/* s.setblocking(flag) method. Argument:
2078 False -- non-blocking mode; same as settimeout(0)
2079 True -- blocking mode; same as settimeout(None)
2080*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002081
Guido van Rossum73624e91994-10-10 17:59:00 +00002082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002083sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002084{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002085 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002087 block = PyLong_AsLong(arg);
2088 if (block == -1 && PyErr_Occurred())
2089 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002091 s->sock_timeout = block ? -1.0 : 0.0;
2092 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002094 Py_INCREF(Py_None);
2095 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002096}
Guido van Rossume4485b01994-09-07 14:32:49 +00002097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002098PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002099"setblocking(flag)\n\
2100\n\
2101Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002102setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002103setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002104
Guido van Rossum11ba0942002-06-13 15:07:44 +00002105/* s.settimeout(timeout) method. Argument:
2106 None -- no timeout, blocking mode; same as setblocking(True)
2107 0.0 -- non-blocking mode; same as setblocking(False)
2108 > 0 -- timeout mode; operations time out after timeout seconds
2109 < 0 -- illegal; raises an exception
2110*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002112sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002113{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002116 if (arg == Py_None)
2117 timeout = -1.0;
2118 else {
2119 timeout = PyFloat_AsDouble(arg);
2120 if (timeout < 0.0) {
2121 if (!PyErr_Occurred())
2122 PyErr_SetString(PyExc_ValueError,
2123 "Timeout value out of range");
2124 return NULL;
2125 }
2126 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002128 s->sock_timeout = timeout;
2129 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002131 Py_INCREF(Py_None);
2132 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002133}
2134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002135PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002136"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002137\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002138Set a timeout on socket operations. 'timeout' can be a float,\n\
2139giving in seconds, or None. Setting a timeout of None disables\n\
2140the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002141Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002142
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002143/* s.gettimeout() method.
2144 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002146sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002148 if (s->sock_timeout < 0.0) {
2149 Py_INCREF(Py_None);
2150 return Py_None;
2151 }
2152 else
2153 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002154}
2155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002156PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002157"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002159Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002160operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002161operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002162
Guido van Rossumaee08791992-09-08 09:05:33 +00002163/* s.setsockopt() method.
2164 With an integer third argument, sets an integer option.
2165 With a string third argument, sets an option from a buffer;
2166 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002167
Guido van Rossum73624e91994-10-10 17:59:00 +00002168static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002169sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002171 int level;
2172 int optname;
2173 int res;
2174 char *buf;
2175 int buflen;
2176 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (PyArg_ParseTuple(args, "iii:setsockopt",
2179 &level, &optname, &flag)) {
2180 buf = (char *) &flag;
2181 buflen = sizeof flag;
2182 }
2183 else {
2184 PyErr_Clear();
2185 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2186 &level, &optname, &buf, &buflen))
2187 return NULL;
2188 }
2189 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2190 if (res < 0)
2191 return s->errorhandler();
2192 Py_INCREF(Py_None);
2193 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002194}
2195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002196PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002197"setsockopt(level, option, value)\n\
2198\n\
2199Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002200The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002201
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002202
Guido van Rossumaee08791992-09-08 09:05:33 +00002203/* s.getsockopt() method.
2204 With two arguments, retrieves an integer option.
2205 With a third integer argument, retrieves a string buffer of that size;
2206 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002207
Guido van Rossum73624e91994-10-10 17:59:00 +00002208static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002209sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002210{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 int level;
2212 int optname;
2213 int res;
2214 PyObject *buf;
2215 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2218 &level, &optname, &buflen))
2219 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 if (buflen == 0) {
2222 int flag = 0;
2223 socklen_t flagsize = sizeof flag;
2224 res = getsockopt(s->sock_fd, level, optname,
2225 (void *)&flag, &flagsize);
2226 if (res < 0)
2227 return s->errorhandler();
2228 return PyLong_FromLong(flag);
2229 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002230#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 /* socklen_t is unsigned so no negative test is needed,
2232 test buflen == 0 is previously done */
2233 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002234#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002235 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002236#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002237 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002238 "getsockopt buflen out of range");
2239 return NULL;
2240 }
2241 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2242 if (buf == NULL)
2243 return NULL;
2244 res = getsockopt(s->sock_fd, level, optname,
2245 (void *)PyBytes_AS_STRING(buf), &buflen);
2246 if (res < 0) {
2247 Py_DECREF(buf);
2248 return s->errorhandler();
2249 }
2250 _PyBytes_Resize(&buf, buflen);
2251 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002252}
2253
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002254PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002255"getsockopt(level, option[, buffersize]) -> value\n\
2256\n\
2257Get a socket option. See the Unix manual for level and option.\n\
2258If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002259string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002260
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002261
Fred Drake728819a2000-07-01 03:40:12 +00002262/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002263
Guido van Rossum73624e91994-10-10 17:59:00 +00002264static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002265sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 sock_addr_t addrbuf;
2268 int addrlen;
2269 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002271 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2272 return NULL;
2273 Py_BEGIN_ALLOW_THREADS
2274 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2275 Py_END_ALLOW_THREADS
2276 if (res < 0)
2277 return s->errorhandler();
2278 Py_INCREF(Py_None);
2279 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002280}
2281
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002282PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002283"bind(address)\n\
2284\n\
2285Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002286pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002287sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002288
Guido van Rossum30a685f1991-06-27 15:51:29 +00002289
2290/* s.close() method.
2291 Set the file descriptor to -1 so operations tried subsequently
2292 will surely fail. */
2293
Guido van Rossum73624e91994-10-10 17:59:00 +00002294static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002295sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002296{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 if ((fd = s->sock_fd) != -1) {
2300 s->sock_fd = -1;
2301 Py_BEGIN_ALLOW_THREADS
2302 (void) SOCKETCLOSE(fd);
2303 Py_END_ALLOW_THREADS
2304 }
2305 Py_INCREF(Py_None);
2306 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002307}
2308
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002309PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002310"close()\n\
2311\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002312Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002313
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002314static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002315sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002316{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002317 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002318 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002319 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002320}
2321
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002322PyDoc_STRVAR(detach_doc,
2323"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002324\n\
2325Close the socket object without closing the underlying file descriptor.\
2326The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002327can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002328
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002329static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002330internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002335 timeout = 0;
2336 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002337
2338#ifdef MS_WINDOWS
2339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 if (s->sock_timeout > 0.0) {
2341 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2342 IS_SELECTABLE(s)) {
2343 /* This is a mess. Best solution: trust select */
2344 fd_set fds;
2345 fd_set fds_exc;
2346 struct timeval tv;
2347 tv.tv_sec = (int)s->sock_timeout;
2348 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2349 FD_ZERO(&fds);
2350 FD_SET(s->sock_fd, &fds);
2351 FD_ZERO(&fds_exc);
2352 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002353 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2354 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002355 if (res == 0) {
2356 res = WSAEWOULDBLOCK;
2357 timeout = 1;
2358 } else if (res > 0) {
2359 if (FD_ISSET(s->sock_fd, &fds))
2360 /* The socket is in the writable set - this
2361 means connected */
2362 res = 0;
2363 else {
2364 /* As per MS docs, we need to call getsockopt()
2365 to get the underlying error */
2366 int res_size = sizeof res;
2367 /* It must be in the exception set */
2368 assert(FD_ISSET(s->sock_fd, &fds_exc));
2369 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2370 (char *)&res, &res_size))
2371 /* getsockopt also clears WSAGetLastError,
2372 so reset it back. */
2373 WSASetLastError(res);
2374 else
2375 res = WSAGetLastError();
2376 }
2377 }
2378 /* else if (res < 0) an error occurred */
2379 }
2380 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 if (res < 0)
2383 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002384
2385#else
2386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 if (s->sock_timeout > 0.0) {
2388 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2389 timeout = internal_select(s, 1);
2390 if (timeout == 0) {
2391 /* Bug #1019808: in case of an EINPROGRESS,
2392 use getsockopt(SO_ERROR) to get the real
2393 error. */
2394 socklen_t res_size = sizeof res;
2395 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2396 SO_ERROR, &res, &res_size);
2397 if (res == EISCONN)
2398 res = 0;
2399 errno = res;
2400 }
2401 else if (timeout == -1) {
2402 res = errno; /* had error */
2403 }
2404 else
2405 res = EWOULDBLOCK; /* timed out */
2406 }
2407 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 if (res < 0)
2410 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002411
2412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002416}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002417
Fred Drake728819a2000-07-01 03:40:12 +00002418/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002419
Guido van Rossum73624e91994-10-10 17:59:00 +00002420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 sock_addr_t addrbuf;
2424 int addrlen;
2425 int res;
2426 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2429 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 Py_BEGIN_ALLOW_THREADS
2432 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2433 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (timeout == 1) {
2436 PyErr_SetString(socket_timeout, "timed out");
2437 return NULL;
2438 }
2439 if (res != 0)
2440 return s->errorhandler();
2441 Py_INCREF(Py_None);
2442 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002443}
2444
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002445PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002446"connect(address)\n\
2447\n\
2448Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002449is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002450
Guido van Rossum30a685f1991-06-27 15:51:29 +00002451
Fred Drake728819a2000-07-01 03:40:12 +00002452/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002453
2454static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002455sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002456{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002457 sock_addr_t addrbuf;
2458 int addrlen;
2459 int res;
2460 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2463 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002464
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002465 Py_BEGIN_ALLOW_THREADS
2466 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2467 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 /* Signals are not errors (though they may raise exceptions). Adapted
2470 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002471#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002472 if (res == EINTR && PyErr_CheckSignals())
2473 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002474#endif
2475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002476 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002477}
2478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002479PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002480"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002481\n\
2482This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002483instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002484
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002485
Guido van Rossumed233a51992-06-23 09:07:03 +00002486/* s.fileno() method */
2487
Guido van Rossum73624e91994-10-10 17:59:00 +00002488static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002489sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002490{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002491 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002492}
2493
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002494PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002495"fileno() -> integer\n\
2496\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002497Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002498
Guido van Rossumed233a51992-06-23 09:07:03 +00002499
Guido van Rossumc89705d1992-11-26 08:54:07 +00002500/* s.getsockname() method */
2501
Guido van Rossum73624e91994-10-10 17:59:00 +00002502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002503sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 sock_addr_t addrbuf;
2506 int res;
2507 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 if (!getsockaddrlen(s, &addrlen))
2510 return NULL;
2511 memset(&addrbuf, 0, addrlen);
2512 Py_BEGIN_ALLOW_THREADS
2513 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2514 Py_END_ALLOW_THREADS
2515 if (res < 0)
2516 return s->errorhandler();
2517 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2518 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002519}
2520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522"getsockname() -> address info\n\
2523\n\
2524Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526
Guido van Rossumc89705d1992-11-26 08:54:07 +00002527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002528#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002529/* s.getpeername() method */
2530
Guido van Rossum73624e91994-10-10 17:59:00 +00002531static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002532sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002533{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 sock_addr_t addrbuf;
2535 int res;
2536 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 if (!getsockaddrlen(s, &addrlen))
2539 return NULL;
2540 memset(&addrbuf, 0, addrlen);
2541 Py_BEGIN_ALLOW_THREADS
2542 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2543 Py_END_ALLOW_THREADS
2544 if (res < 0)
2545 return s->errorhandler();
2546 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2547 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002548}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002550PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002551"getpeername() -> address info\n\
2552\n\
2553Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002554info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002555
Guido van Rossumb6775db1994-08-01 11:34:53 +00002556#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002557
2558
Guido van Rossum30a685f1991-06-27 15:51:29 +00002559/* s.listen(n) method */
2560
Guido van Rossum73624e91994-10-10 17:59:00 +00002561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002562sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002564 int backlog;
2565 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002566
Serhiy Storchaka78980432013-01-15 01:12:17 +02002567 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 if (backlog == -1 && PyErr_Occurred())
2569 return NULL;
2570 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002571 /* To avoid problems on systems that don't allow a negative backlog
2572 * (which doesn't make sense anyway) we force a minimum value of 0. */
2573 if (backlog < 0)
2574 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 res = listen(s->sock_fd, backlog);
2576 Py_END_ALLOW_THREADS
2577 if (res < 0)
2578 return s->errorhandler();
2579 Py_INCREF(Py_None);
2580 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002581}
2582
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002583PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002584"listen(backlog)\n\
2585\n\
2586Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002587least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2588unaccepted connections that the system will allow before refusing new\n\
2589connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002590
2591
Thomas Wouters477c8d52006-05-27 19:21:47 +00002592/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002593 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002594 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002596 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002597 * also possible that we return a number of bytes smaller than the request
2598 * bytes.
2599 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002600
Antoine Pitrou19467d22010-08-17 19:33:30 +00002601static Py_ssize_t
2602sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002603{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002604 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002606#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 int remaining;
2608 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002609#endif
2610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 if (!IS_SELECTABLE(s)) {
2612 select_error();
2613 return -1;
2614 }
2615 if (len == 0) {
2616 /* If 0 bytes were requested, do nothing. */
2617 return 0;
2618 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002619
2620#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002621 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002622 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002623 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002624 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002625#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002626 if (len > INT_MAX)
2627 len = INT_MAX;
2628 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2629#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002631#endif
2632 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 if (timeout == 1) {
2636 PyErr_SetString(socket_timeout, "timed out");
2637 return -1;
2638 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002639 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002640 if (outlen < 0) {
2641 /* Note: the call to errorhandler() ALWAYS indirectly returned
2642 NULL, so ignore its return value */
2643 s->errorhandler();
2644 return -1;
2645 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002646#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002647 read_buf = cbuf;
2648 remaining = len;
2649 while (remaining != 0) {
2650 unsigned int segment;
2651 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002653 segment = remaining /SEGMENT_SIZE;
2654 if (segment != 0) {
2655 segment = SEGMENT_SIZE;
2656 }
2657 else {
2658 segment = remaining;
2659 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002660
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002661 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002663 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (!timeout)
2665 nread = recv(s->sock_fd, read_buf, segment, flags);
2666 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 if (timeout == 1) {
2668 PyErr_SetString(socket_timeout, "timed out");
2669 return -1;
2670 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002671 END_SELECT_LOOP(s)
2672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002673 if (nread < 0) {
2674 s->errorhandler();
2675 return -1;
2676 }
2677 if (nread != remaining) {
2678 read_buf += nread;
2679 break;
2680 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 remaining -= segment;
2683 read_buf += segment;
2684 }
2685 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002686#endif /* !__VMS */
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;
2939 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 if (recvlen < 0) {
2942 PyBuffer_Release(&pbuf);
2943 PyErr_SetString(PyExc_ValueError,
2944 "negative buffersize in recvfrom_into");
2945 return NULL;
2946 }
2947 if (recvlen == 0) {
2948 /* If nbytes was not specified, use the buffer's length */
2949 recvlen = buflen;
2950 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2953 if (readlen < 0) {
2954 PyBuffer_Release(&pbuf);
2955 /* Return an error */
2956 Py_XDECREF(addr);
2957 return NULL;
2958 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 PyBuffer_Release(&pbuf);
2961 /* Return the number of bytes read and the address. Note that we do
2962 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002963 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002964}
2965
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002966PyDoc_STRVAR(recvfrom_into_doc,
2967"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002968\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002969Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002970
2971
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002972/* The sendmsg() and recvmsg[_into]() methods require a working
2973 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2974#ifdef CMSG_LEN
2975/*
2976 * Call recvmsg() with the supplied iovec structures, flags, and
2977 * ancillary data buffer size (controllen). Returns the tuple return
2978 * value for recvmsg() or recvmsg_into(), with the first item provided
2979 * by the supplied makeval() function. makeval() will be called with
2980 * the length read and makeval_data as arguments, and must return a
2981 * new reference (which will be decrefed if there is a subsequent
2982 * error). On error, closes any file descriptors received via
2983 * SCM_RIGHTS.
2984 */
2985static PyObject *
2986sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2987 int flags, Py_ssize_t controllen,
2988 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2989{
2990 ssize_t bytes_received = -1;
2991 int timeout;
2992 sock_addr_t addrbuf;
2993 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002994 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002995 PyObject *cmsg_list = NULL, *retval = NULL;
2996 void *controlbuf = NULL;
2997 struct cmsghdr *cmsgh;
2998 size_t cmsgdatalen = 0;
2999 int cmsg_status;
3000
3001 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3002 ignored" when the socket is connected (Linux fills them in
3003 anyway for AF_UNIX sockets at least). Normally msg_namelen
3004 seems to be set to 0 if there's no address, but try to
3005 initialize msg_name to something that won't be mistaken for a
3006 real address if that doesn't happen. */
3007 if (!getsockaddrlen(s, &addrbuflen))
3008 return NULL;
3009 memset(&addrbuf, 0, addrbuflen);
3010 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3011
3012 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3013 PyErr_SetString(PyExc_ValueError,
3014 "invalid ancillary data buffer length");
3015 return NULL;
3016 }
3017 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3018 return PyErr_NoMemory();
3019
3020 /* Make the system call. */
3021 if (!IS_SELECTABLE(s)) {
3022 select_error();
3023 goto finally;
3024 }
3025
3026 BEGIN_SELECT_LOOP(s)
3027 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003028 msg.msg_name = SAS2SA(&addrbuf);
3029 msg.msg_namelen = addrbuflen;
3030 msg.msg_iov = iov;
3031 msg.msg_iovlen = iovlen;
3032 msg.msg_control = controlbuf;
3033 msg.msg_controllen = controllen;
3034 timeout = internal_select_ex(s, 0, interval);
3035 if (!timeout)
3036 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3037 Py_END_ALLOW_THREADS;
3038 if (timeout == 1) {
3039 PyErr_SetString(socket_timeout, "timed out");
3040 goto finally;
3041 }
3042 END_SELECT_LOOP(s)
3043
3044 if (bytes_received < 0) {
3045 s->errorhandler();
3046 goto finally;
3047 }
3048
3049 /* Make list of (level, type, data) tuples from control messages. */
3050 if ((cmsg_list = PyList_New(0)) == NULL)
3051 goto err_closefds;
3052 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3053 implementations didn't do so. */
3054 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3055 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3056 PyObject *bytes, *tuple;
3057 int tmp;
3058
3059 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3060 if (cmsg_status != 0) {
3061 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3062 "received malformed or improperly-truncated "
3063 "ancillary data", 1) == -1)
3064 goto err_closefds;
3065 }
3066 if (cmsg_status < 0)
3067 break;
3068 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003069 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070 goto err_closefds;
3071 }
3072
3073 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3074 cmsgdatalen);
3075 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3076 (int)cmsgh->cmsg_type, bytes);
3077 if (tuple == NULL)
3078 goto err_closefds;
3079 tmp = PyList_Append(cmsg_list, tuple);
3080 Py_DECREF(tuple);
3081 if (tmp != 0)
3082 goto err_closefds;
3083
3084 if (cmsg_status != 0)
3085 break;
3086 }
3087
3088 retval = Py_BuildValue("NOiN",
3089 (*makeval)(bytes_received, makeval_data),
3090 cmsg_list,
3091 (int)msg.msg_flags,
3092 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3093 ((msg.msg_namelen > addrbuflen) ?
3094 addrbuflen : msg.msg_namelen),
3095 s->sock_proto));
3096 if (retval == NULL)
3097 goto err_closefds;
3098
3099finally:
3100 Py_XDECREF(cmsg_list);
3101 PyMem_Free(controlbuf);
3102 return retval;
3103
3104err_closefds:
3105#ifdef SCM_RIGHTS
3106 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3107 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3108 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3109 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3110 if (cmsg_status < 0)
3111 break;
3112 if (cmsgh->cmsg_level == SOL_SOCKET &&
3113 cmsgh->cmsg_type == SCM_RIGHTS) {
3114 size_t numfds;
3115 int *fdp;
3116
3117 numfds = cmsgdatalen / sizeof(int);
3118 fdp = (int *)CMSG_DATA(cmsgh);
3119 while (numfds-- > 0)
3120 close(*fdp++);
3121 }
3122 if (cmsg_status != 0)
3123 break;
3124 }
3125#endif /* SCM_RIGHTS */
3126 goto finally;
3127}
3128
3129
3130static PyObject *
3131makeval_recvmsg(ssize_t received, void *data)
3132{
3133 PyObject **buf = data;
3134
3135 if (received < PyBytes_GET_SIZE(*buf))
3136 _PyBytes_Resize(buf, received);
3137 Py_XINCREF(*buf);
3138 return *buf;
3139}
3140
3141/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3142
3143static PyObject *
3144sock_recvmsg(PySocketSockObject *s, PyObject *args)
3145{
3146 Py_ssize_t bufsize, ancbufsize = 0;
3147 int flags = 0;
3148 struct iovec iov;
3149 PyObject *buf = NULL, *retval = NULL;
3150
3151 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3152 return NULL;
3153
3154 if (bufsize < 0) {
3155 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3156 return NULL;
3157 }
3158 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3159 return NULL;
3160 iov.iov_base = PyBytes_AS_STRING(buf);
3161 iov.iov_len = bufsize;
3162
3163 /* Note that we're passing a pointer to *our pointer* to the bytes
3164 object here (&buf); makeval_recvmsg() may incref the object, or
3165 deallocate it and set our pointer to NULL. */
3166 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3167 &makeval_recvmsg, &buf);
3168 Py_XDECREF(buf);
3169 return retval;
3170}
3171
3172PyDoc_STRVAR(recvmsg_doc,
3173"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3174\n\
3175Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3176socket. The ancbufsize argument sets the size in bytes of the\n\
3177internal buffer used to receive the ancillary data; it defaults to 0,\n\
3178meaning that no ancillary data will be received. Appropriate buffer\n\
3179sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3180CMSG_LEN(), and items which do not fit into the buffer might be\n\
3181truncated or discarded. The flags argument defaults to 0 and has the\n\
3182same meaning as for recv().\n\
3183\n\
3184The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3185The data item is a bytes object holding the non-ancillary data\n\
3186received. The ancdata item is a list of zero or more tuples\n\
3187(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3188(control messages) received: cmsg_level and cmsg_type are integers\n\
3189specifying the protocol level and protocol-specific type respectively,\n\
3190and cmsg_data is a bytes object holding the associated data. The\n\
3191msg_flags item is the bitwise OR of various flags indicating\n\
3192conditions on the received message; see your system documentation for\n\
3193details. If the receiving socket is unconnected, address is the\n\
3194address of the sending socket, if available; otherwise, its value is\n\
3195unspecified.\n\
3196\n\
3197If recvmsg() raises an exception after the system call returns, it\n\
3198will first attempt to close any file descriptors received via the\n\
3199SCM_RIGHTS mechanism.");
3200
3201
3202static PyObject *
3203makeval_recvmsg_into(ssize_t received, void *data)
3204{
3205 return PyLong_FromSsize_t(received);
3206}
3207
3208/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3209
3210static PyObject *
3211sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3212{
3213 Py_ssize_t ancbufsize = 0;
3214 int flags = 0;
3215 struct iovec *iovs = NULL;
3216 Py_ssize_t i, nitems, nbufs = 0;
3217 Py_buffer *bufs = NULL;
3218 PyObject *buffers_arg, *fast, *retval = NULL;
3219
3220 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3221 &buffers_arg, &ancbufsize, &flags))
3222 return NULL;
3223
3224 if ((fast = PySequence_Fast(buffers_arg,
3225 "recvmsg_into() argument 1 must be an "
3226 "iterable")) == NULL)
3227 return NULL;
3228 nitems = PySequence_Fast_GET_SIZE(fast);
3229 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003230 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003231 goto finally;
3232 }
3233
3234 /* Fill in an iovec for each item, and save the Py_buffer
3235 structs to release afterwards. */
3236 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3237 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3238 PyErr_NoMemory();
3239 goto finally;
3240 }
3241 for (; nbufs < nitems; nbufs++) {
3242 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3243 "w*;recvmsg_into() argument 1 must be an iterable "
3244 "of single-segment read-write buffers",
3245 &bufs[nbufs]))
3246 goto finally;
3247 iovs[nbufs].iov_base = bufs[nbufs].buf;
3248 iovs[nbufs].iov_len = bufs[nbufs].len;
3249 }
3250
3251 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3252 &makeval_recvmsg_into, NULL);
3253finally:
3254 for (i = 0; i < nbufs; i++)
3255 PyBuffer_Release(&bufs[i]);
3256 PyMem_Free(bufs);
3257 PyMem_Free(iovs);
3258 Py_DECREF(fast);
3259 return retval;
3260}
3261
3262PyDoc_STRVAR(recvmsg_into_doc,
3263"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3264\n\
3265Receive normal data and ancillary data from the socket, scattering the\n\
3266non-ancillary data into a series of buffers. The buffers argument\n\
3267must be an iterable of objects that export writable buffers\n\
3268(e.g. bytearray objects); these will be filled with successive chunks\n\
3269of the non-ancillary data until it has all been written or there are\n\
3270no more buffers. The ancbufsize argument sets the size in bytes of\n\
3271the internal buffer used to receive the ancillary data; it defaults to\n\
32720, meaning that no ancillary data will be received. Appropriate\n\
3273buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3274or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3275truncated or discarded. The flags argument defaults to 0 and has the\n\
3276same meaning as for recv().\n\
3277\n\
3278The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3279The nbytes item is the total number of bytes of non-ancillary data\n\
3280written into the buffers. The ancdata item is a list of zero or more\n\
3281tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3282data (control messages) received: cmsg_level and cmsg_type are\n\
3283integers specifying the protocol level and protocol-specific type\n\
3284respectively, and cmsg_data is a bytes object holding the associated\n\
3285data. The msg_flags item is the bitwise OR of various flags\n\
3286indicating conditions on the received message; see your system\n\
3287documentation for details. If the receiving socket is unconnected,\n\
3288address is the address of the sending socket, if available; otherwise,\n\
3289its value is unspecified.\n\
3290\n\
3291If recvmsg_into() raises an exception after the system call returns,\n\
3292it will first attempt to close any file descriptors received via the\n\
3293SCM_RIGHTS mechanism.");
3294#endif /* CMSG_LEN */
3295
3296
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003297/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003298
Guido van Rossum73624e91994-10-10 17:59:00 +00003299static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003300sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003301{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003302 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003303 Py_ssize_t len, n = -1;
3304 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003307 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3308 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 if (!IS_SELECTABLE(s)) {
3311 PyBuffer_Release(&pbuf);
3312 return select_error();
3313 }
3314 buf = pbuf.buf;
3315 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003316
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003317 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003318 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003319 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003320 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003321#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003322 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003323#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003324 if (len > INT_MAX)
3325 len = INT_MAX;
3326 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003327#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003329#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003333 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 PyErr_SetString(socket_timeout, "timed out");
3335 return NULL;
3336 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003337 END_SELECT_LOOP(s)
3338
3339 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003340 if (n < 0)
3341 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003342 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003343}
3344
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003345PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003346"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003347\n\
3348Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003349argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003350sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003351
3352
3353/* s.sendall(data [,flags]) method */
3354
3355static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003356sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003357{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003358 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003359 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003360 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003363 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3364 return NULL;
3365 buf = pbuf.buf;
3366 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 if (!IS_SELECTABLE(s)) {
3369 PyBuffer_Release(&pbuf);
3370 return select_error();
3371 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003374 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003375 timeout = internal_select(s, 1);
3376 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003377 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003378#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003379 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003380#elif defined(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 "
3568 "buffer-compatible objects",
3569 &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\
3725data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3726The 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\
3730is a buffer-compatible object holding the associated data. The flags\n\
3731argument 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
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003870 {"listen", (PyCFunction)sock_listen, METH_O,
3871 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{
Fred Drakea04eaad2000-06-30 02:46:07 +00003943#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 if (s->sock_fd > LONG_MAX) {
3945 /* this can occur on Win64, and actually there is a special
3946 ugly printf formatter for decimal pointer length integer
3947 printing, only bother if necessary*/
3948 PyErr_SetString(PyExc_OverflowError,
3949 "no printf formatter to display "
3950 "the socket descriptor in decimal");
3951 return NULL;
3952 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 return PyUnicode_FromFormat(
3955 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3956 (long)s->sock_fd, s->sock_family,
3957 s->sock_type,
3958 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003959}
3960
3961
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003962/* Create a new, uninitialized socket object. */
3963
3964static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003965sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 new = type->tp_alloc(type, 0);
3970 if (new != NULL) {
3971 ((PySocketSockObject *)new)->sock_fd = -1;
3972 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3973 ((PySocketSockObject *)new)->errorhandler = &set_error;
3974 }
3975 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003976}
3977
3978
3979/* Initialize a new socket object. */
3980
Victor Stinnerdaf45552013-08-28 00:53:59 +02003981#ifdef SOCK_CLOEXEC
3982/* socket() and socketpair() fail with EINVAL on Linux kernel older
3983 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3984static int sock_cloexec_works = -1;
3985#endif
3986
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003987/*ARGSUSED*/
3988static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003989sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 PySocketSockObject *s = (PySocketSockObject *)self;
3992 PyObject *fdobj = NULL;
3993 SOCKET_T fd = INVALID_SOCKET;
3994 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3995 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003996#ifndef MS_WINDOWS
3997#ifdef SOCK_CLOEXEC
3998 int *atomic_flag_works = &sock_cloexec_works;
3999#else
4000 int *atomic_flag_works = NULL;
4001#endif
4002#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004004 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4005 "|iiiO:socket", keywords,
4006 &family, &type, &proto, &fdobj))
4007 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004009 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004010#ifdef MS_WINDOWS
4011 /* recreate a socket that was duplicated */
4012 if (PyBytes_Check(fdobj)) {
4013 WSAPROTOCOL_INFO info;
4014 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4015 PyErr_Format(PyExc_ValueError,
4016 "socket descriptor string has wrong size, "
4017 "should be %zu bytes.", sizeof(info));
4018 return -1;
4019 }
4020 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4021 Py_BEGIN_ALLOW_THREADS
4022 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4023 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4024 Py_END_ALLOW_THREADS
4025 if (fd == INVALID_SOCKET) {
4026 set_error();
4027 return -1;
4028 }
4029 family = info.iAddressFamily;
4030 type = info.iSocketType;
4031 proto = info.iProtocol;
4032 }
4033 else
4034#endif
4035 {
4036 fd = PyLong_AsSocket_t(fdobj);
4037 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4038 return -1;
4039 if (fd == INVALID_SOCKET) {
4040 PyErr_SetString(PyExc_ValueError,
4041 "can't use invalid socket value");
4042 return -1;
4043 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 }
4045 }
4046 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004047#ifdef MS_WINDOWS
4048 /* Windows implementation */
4049#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4050#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4051#endif
4052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004054 if (support_wsa_no_inherit) {
4055 fd = WSASocket(family, type, proto,
4056 NULL, 0,
4057 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4058 if (fd == INVALID_SOCKET) {
4059 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4060 support_wsa_no_inherit = 0;
4061 fd = socket(family, type, proto);
4062 }
4063 }
4064 else {
4065 fd = socket(family, type, proto);
4066 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 if (fd == INVALID_SOCKET) {
4070 set_error();
4071 return -1;
4072 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004073
4074 if (!support_wsa_no_inherit) {
4075 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4076 closesocket(fd);
4077 PyErr_SetFromWindowsErr(0);
4078 return -1;
4079 }
4080 }
4081#else
4082 /* UNIX */
4083 Py_BEGIN_ALLOW_THREADS
4084#ifdef SOCK_CLOEXEC
4085 if (sock_cloexec_works != 0) {
4086 fd = socket(family, type | SOCK_CLOEXEC, proto);
4087 if (sock_cloexec_works == -1) {
4088 if (fd >= 0) {
4089 sock_cloexec_works = 1;
4090 }
4091 else if (errno == EINVAL) {
4092 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4093 sock_cloexec_works = 0;
4094 fd = socket(family, type, proto);
4095 }
4096 }
4097 }
4098 else
4099#endif
4100 {
4101 fd = socket(family, type, proto);
4102 }
4103 Py_END_ALLOW_THREADS
4104
4105 if (fd == INVALID_SOCKET) {
4106 set_error();
4107 return -1;
4108 }
4109
4110 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4111 SOCKETCLOSE(fd);
4112 return -1;
4113 }
4114#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 }
4116 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004118 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004119
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004120}
4121
4122
Guido van Rossumb6775db1994-08-01 11:34:53 +00004123/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004124
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004125static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004126 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4127 "_socket.socket", /* tp_name */
4128 sizeof(PySocketSockObject), /* tp_basicsize */
4129 0, /* tp_itemsize */
4130 (destructor)sock_dealloc, /* tp_dealloc */
4131 0, /* tp_print */
4132 0, /* tp_getattr */
4133 0, /* tp_setattr */
4134 0, /* tp_reserved */
4135 (reprfunc)sock_repr, /* tp_repr */
4136 0, /* tp_as_number */
4137 0, /* tp_as_sequence */
4138 0, /* tp_as_mapping */
4139 0, /* tp_hash */
4140 0, /* tp_call */
4141 0, /* tp_str */
4142 PyObject_GenericGetAttr, /* tp_getattro */
4143 0, /* tp_setattro */
4144 0, /* tp_as_buffer */
4145 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4146 sock_doc, /* tp_doc */
4147 0, /* tp_traverse */
4148 0, /* tp_clear */
4149 0, /* tp_richcompare */
4150 0, /* tp_weaklistoffset */
4151 0, /* tp_iter */
4152 0, /* tp_iternext */
4153 sock_methods, /* tp_methods */
4154 sock_memberlist, /* tp_members */
4155 0, /* tp_getset */
4156 0, /* tp_base */
4157 0, /* tp_dict */
4158 0, /* tp_descr_get */
4159 0, /* tp_descr_set */
4160 0, /* tp_dictoffset */
4161 sock_initobj, /* tp_init */
4162 PyType_GenericAlloc, /* tp_alloc */
4163 sock_new, /* tp_new */
4164 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004165};
4166
Guido van Rossum30a685f1991-06-27 15:51:29 +00004167
Guido van Rossum81194471991-07-27 21:42:02 +00004168/* Python interface to gethostname(). */
4169
4170/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004171static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004172socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004173{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004174#ifdef MS_WINDOWS
4175 /* Don't use winsock's gethostname, as this returns the ANSI
4176 version of the hostname, whereas we need a Unicode string.
4177 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004178 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004179 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004180 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004181 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004182
4183 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004184 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004185
4186 if (GetLastError() != ERROR_MORE_DATA)
4187 return PyErr_SetFromWindowsErr(0);
4188
4189 if (size == 0)
4190 return PyUnicode_New(0, 0);
4191
4192 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4193 names */
4194 name = PyMem_Malloc(size * sizeof(wchar_t));
4195 if (!name)
4196 return NULL;
4197 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4198 name,
4199 &size))
4200 {
4201 PyMem_Free(name);
4202 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004203 }
Victor Stinner74168972011-11-17 01:11:36 +01004204
4205 result = PyUnicode_FromWideChar(name, size);
4206 PyMem_Free(name);
4207 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004208#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 char buf[1024];
4210 int res;
4211 Py_BEGIN_ALLOW_THREADS
4212 res = gethostname(buf, (int) sizeof buf - 1);
4213 Py_END_ALLOW_THREADS
4214 if (res < 0)
4215 return set_error();
4216 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004217 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004218#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004219}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004221PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004222"gethostname() -> string\n\
4223\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004224Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004225
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004226#ifdef HAVE_SETHOSTNAME
4227PyDoc_STRVAR(sethostname_doc,
4228"sethostname(name)\n\n\
4229Sets the hostname to name.");
4230
4231static PyObject *
4232socket_sethostname(PyObject *self, PyObject *args)
4233{
4234 PyObject *hnobj;
4235 Py_buffer buf;
4236 int res, flag = 0;
4237
Christian Heimesd2774c72013-06-19 02:06:29 +02004238#ifdef _AIX
4239/* issue #18259, not declared in any useful header file */
4240extern int sethostname(const char *, size_t);
4241#endif
4242
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004243 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4244 PyErr_Clear();
4245 if (!PyArg_ParseTuple(args, "O&:sethostname",
4246 PyUnicode_FSConverter, &hnobj))
4247 return NULL;
4248 flag = 1;
4249 }
4250 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4251 if (!res) {
4252 res = sethostname(buf.buf, buf.len);
4253 PyBuffer_Release(&buf);
4254 }
4255 if (flag)
4256 Py_DECREF(hnobj);
4257 if (res)
4258 return set_error();
4259 Py_RETURN_NONE;
4260}
4261#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004262
Guido van Rossum30a685f1991-06-27 15:51:29 +00004263/* Python interface to gethostbyname(name). */
4264
4265/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004267socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004269 char *name;
4270 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004271 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004272
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004273 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 return NULL;
4275 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004276 goto finally;
4277 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4278finally:
4279 PyMem_Free(name);
4280 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004281}
4282
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004283PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004284"gethostbyname(host) -> address\n\
4285\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004286Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004287
4288
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004289/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4290
4291static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004292gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 char **pch;
4295 PyObject *rtn_tuple = (PyObject *)NULL;
4296 PyObject *name_list = (PyObject *)NULL;
4297 PyObject *addr_list = (PyObject *)NULL;
4298 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 if (h == NULL) {
4301 /* Let's get real error message to return */
4302 set_herror(h_errno);
4303 return NULL;
4304 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 if (h->h_addrtype != af) {
4307 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004308 errno = EAFNOSUPPORT;
4309 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004310 return NULL;
4311 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004315 case AF_INET:
4316 if (alen < sizeof(struct sockaddr_in))
4317 return NULL;
4318 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004319
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004320#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004321 case AF_INET6:
4322 if (alen < sizeof(struct sockaddr_in6))
4323 return NULL;
4324 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004325#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 if ((name_list = PyList_New(0)) == NULL)
4330 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004332 if ((addr_list = PyList_New(0)) == NULL)
4333 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 /* SF #1511317: h_aliases can be NULL */
4336 if (h->h_aliases) {
4337 for (pch = h->h_aliases; *pch != NULL; pch++) {
4338 int status;
4339 tmp = PyUnicode_FromString(*pch);
4340 if (tmp == NULL)
4341 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004343 status = PyList_Append(name_list, tmp);
4344 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 if (status)
4347 goto err;
4348 }
4349 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004351 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4352 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004356 case AF_INET:
4357 {
4358 struct sockaddr_in sin;
4359 memset(&sin, 0, sizeof(sin));
4360 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004361#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4365 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 if (pch == h->h_addr_list && alen >= sizeof(sin))
4368 memcpy((char *) addr, &sin, sizeof(sin));
4369 break;
4370 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004371
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004372#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004373 case AF_INET6:
4374 {
4375 struct sockaddr_in6 sin6;
4376 memset(&sin6, 0, sizeof(sin6));
4377 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004378#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004381 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4382 tmp = makeipaddr((struct sockaddr *)&sin6,
4383 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004385 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4386 memcpy((char *) addr, &sin6, sizeof(sin6));
4387 break;
4388 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004389#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004392 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004393 "unsupported address family");
4394 return NULL;
4395 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 if (tmp == NULL)
4398 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004400 status = PyList_Append(addr_list, tmp);
4401 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 if (status)
4404 goto err;
4405 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004408
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004409 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 Py_XDECREF(name_list);
4411 Py_XDECREF(addr_list);
4412 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004413}
4414
4415
4416/* Python interface to gethostbyname_ex(name). */
4417
4418/*ARGSUSED*/
4419static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004420socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004421{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 char *name;
4423 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004424 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004425 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004426 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004427#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004429#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004431#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 char buf[16384];
4433 int buf_len = (sizeof buf) - 1;
4434 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004435#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004436#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004437 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004438#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004439#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004440
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004441 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004443 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004444 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004445 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004446#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004447#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004448 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004450#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004452#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004453 memset((void *) &data, '\0', sizeof(data));
4454 result = gethostbyname_r(name, &hp_allocated, &data);
4455 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004456#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004457#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004458#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004462#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 Py_END_ALLOW_THREADS
4464 /* Some C libraries would require addr.__ss_family instead of
4465 addr.ss_family.
4466 Therefore, we cast the sockaddr_storage into sockaddr to
4467 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004468 sa = SAS2SA(&addr);
4469 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004471#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004472 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004473#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004474finally:
4475 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004477}
4478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004479PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004480"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4481\n\
4482Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004483for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004484
4485
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004486/* Python interface to gethostbyaddr(IP). */
4487
4488/*ARGSUSED*/
4489static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004490socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004491{
Charles-François Natali8b759652011-12-23 16:44:51 +01004492 sock_addr_t addr;
4493 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 char *ip_num;
4495 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004496 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004497#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004499#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004501#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 /* glibcs up to 2.10 assume that the buf argument to
4503 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4504 does not ensure. The attribute below instructs the compiler
4505 to maintain this alignment. */
4506 char buf[16384] Py_ALIGNED(8);
4507 int buf_len = (sizeof buf) - 1;
4508 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004509#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004510#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004512#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004513#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 char *ap;
4515 int al;
4516 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004517
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004518 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 return NULL;
4520 af = AF_UNSPEC;
4521 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004522 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 af = sa->sa_family;
4524 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004525 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 switch (af) {
4527 case AF_INET:
4528 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4529 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4530 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004531#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 case AF_INET6:
4533 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4534 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4535 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004538 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004539 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 }
4541 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004542#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004543#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004544 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 &hp_allocated, buf, buf_len,
4546 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004547#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 h = gethostbyaddr_r(ap, al, af,
4549 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004550#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 memset((void *) &data, '\0', sizeof(data));
4552 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4553 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004554#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004555#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004556#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004560#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004562 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004563#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004565#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004566finally:
4567 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004569}
4570
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004571PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004572"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4573\n\
4574Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004575for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004576
Guido van Rossum30a685f1991-06-27 15:51:29 +00004577
4578/* Python interface to getservbyname(name).
4579 This only returns the port number, since the other info is already
4580 known or not useful (like the list of aliases). */
4581
4582/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004583static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004584socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 char *name, *proto=NULL;
4587 struct servent *sp;
4588 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4589 return NULL;
4590 Py_BEGIN_ALLOW_THREADS
4591 sp = getservbyname(name, proto);
4592 Py_END_ALLOW_THREADS
4593 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004594 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 return NULL;
4596 }
4597 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004598}
4599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004600PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004601"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004602\n\
4603Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004604The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4605otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004606
Guido van Rossum30a685f1991-06-27 15:51:29 +00004607
Barry Warsaw11b91a02004-06-28 00:50:43 +00004608/* Python interface to getservbyport(port).
4609 This only returns the service name, since the other info is already
4610 known or not useful (like the list of aliases). */
4611
4612/*ARGSUSED*/
4613static PyObject *
4614socket_getservbyport(PyObject *self, PyObject *args)
4615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 int port;
4617 char *proto=NULL;
4618 struct servent *sp;
4619 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4620 return NULL;
4621 if (port < 0 || port > 0xffff) {
4622 PyErr_SetString(
4623 PyExc_OverflowError,
4624 "getservbyport: port must be 0-65535.");
4625 return NULL;
4626 }
4627 Py_BEGIN_ALLOW_THREADS
4628 sp = getservbyport(htons((short)port), proto);
4629 Py_END_ALLOW_THREADS
4630 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004631 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 return NULL;
4633 }
4634 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004635}
4636
4637PyDoc_STRVAR(getservbyport_doc,
4638"getservbyport(port[, protocolname]) -> string\n\
4639\n\
4640Return the service name from a port number and protocol name.\n\
4641The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4642otherwise any protocol will match.");
4643
Guido van Rossum3901d851996-12-19 16:35:04 +00004644/* Python interface to getprotobyname(name).
4645 This only returns the protocol number, since the other info is
4646 already known or not useful (like the list of aliases). */
4647
4648/*ARGSUSED*/
4649static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004650socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004651{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 char *name;
4653 struct protoent *sp;
4654 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4655 return NULL;
4656 Py_BEGIN_ALLOW_THREADS
4657 sp = getprotobyname(name);
4658 Py_END_ALLOW_THREADS
4659 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004660 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 return NULL;
4662 }
4663 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004664}
4665
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004666PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004667"getprotobyname(name) -> integer\n\
4668\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004669Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004670
Guido van Rossum3901d851996-12-19 16:35:04 +00004671
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004672#ifndef NO_DUP
4673/* dup() function for socket fds */
4674
4675static PyObject *
4676socket_dup(PyObject *self, PyObject *fdobj)
4677{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 SOCKET_T fd, newfd;
4679 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004680#ifdef MS_WINDOWS
4681 WSAPROTOCOL_INFO info;
4682#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004683
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 fd = PyLong_AsSocket_t(fdobj);
4685 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4686 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004687
Victor Stinnerdaf45552013-08-28 00:53:59 +02004688#ifdef MS_WINDOWS
4689 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4690 return set_error();
4691
4692 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4693 FROM_PROTOCOL_INFO,
4694 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 if (newfd == INVALID_SOCKET)
4696 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004697
Victor Stinnerdaf45552013-08-28 00:53:59 +02004698 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4699 closesocket(newfd);
4700 PyErr_SetFromWindowsErr(0);
4701 return NULL;
4702 }
4703#else
4704 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4705 newfd = _Py_dup(fd);
4706 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004707 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004708#endif
4709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 newfdobj = PyLong_FromSocket_t(newfd);
4711 if (newfdobj == NULL)
4712 SOCKETCLOSE(newfd);
4713 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004714}
4715
4716PyDoc_STRVAR(dup_doc,
4717"dup(integer) -> integer\n\
4718\n\
4719Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4720sockets; on some platforms os.dup() won't work for socket file descriptors.");
4721#endif
4722
4723
Dave Cole331708b2004-08-09 04:51:41 +00004724#ifdef HAVE_SOCKETPAIR
4725/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004726 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004727 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004728
4729/*ARGSUSED*/
4730static PyObject *
4731socket_socketpair(PyObject *self, PyObject *args)
4732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 PySocketSockObject *s0 = NULL, *s1 = NULL;
4734 SOCKET_T sv[2];
4735 int family, type = SOCK_STREAM, proto = 0;
4736 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004737#ifdef SOCK_CLOEXEC
4738 int *atomic_flag_works = &sock_cloexec_works;
4739#else
4740 int *atomic_flag_works = NULL;
4741#endif
4742 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004743
4744#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004746#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004748#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4750 &family, &type, &proto))
4751 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004754 Py_BEGIN_ALLOW_THREADS
4755#ifdef SOCK_CLOEXEC
4756 if (sock_cloexec_works != 0) {
4757 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4758 if (sock_cloexec_works == -1) {
4759 if (ret >= 0) {
4760 sock_cloexec_works = 1;
4761 }
4762 else if (errno == EINVAL) {
4763 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4764 sock_cloexec_works = 0;
4765 ret = socketpair(family, type, proto, sv);
4766 }
4767 }
4768 }
4769 else
4770#endif
4771 {
4772 ret = socketpair(family, type, proto, sv);
4773 }
4774 Py_END_ALLOW_THREADS
4775
4776 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004778
4779 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4780 goto finally;
4781 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4782 goto finally;
4783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 s0 = new_sockobject(sv[0], family, type, proto);
4785 if (s0 == NULL)
4786 goto finally;
4787 s1 = new_sockobject(sv[1], family, type, proto);
4788 if (s1 == NULL)
4789 goto finally;
4790 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004791
4792finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 if (res == NULL) {
4794 if (s0 == NULL)
4795 SOCKETCLOSE(sv[0]);
4796 if (s1 == NULL)
4797 SOCKETCLOSE(sv[1]);
4798 }
4799 Py_XDECREF(s0);
4800 Py_XDECREF(s1);
4801 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004802}
4803
4804PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004805"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004806\n\
4807Create a pair of socket objects from the sockets returned by the platform\n\
4808socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004809The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004810AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004811
4812#endif /* HAVE_SOCKETPAIR */
4813
4814
Guido van Rossum006bf911996-06-12 04:04:55 +00004815static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004816socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004817{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004820 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4821 return NULL;
4822 }
4823 if (x1 < 0) {
4824 PyErr_SetString(PyExc_OverflowError,
4825 "can't convert negative number to unsigned long");
4826 return NULL;
4827 }
4828 x2 = (unsigned int)ntohs((unsigned short)x1);
4829 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004830}
4831
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004832PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004833"ntohs(integer) -> integer\n\
4834\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004835Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004836
4837
Guido van Rossum006bf911996-06-12 04:04:55 +00004838static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004839socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004840{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 if (PyLong_Check(arg)) {
4844 x = PyLong_AsUnsignedLong(arg);
4845 if (x == (unsigned long) -1 && PyErr_Occurred())
4846 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004847#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004848 {
4849 unsigned long y;
4850 /* only want the trailing 32 bits */
4851 y = x & 0xFFFFFFFFUL;
4852 if (y ^ x)
4853 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004854 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004855 x = y;
4856 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 }
4859 else
4860 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004861 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004864}
4865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004866PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004867"ntohl(integer) -> integer\n\
4868\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004869Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004870
4871
Guido van Rossum006bf911996-06-12 04:04:55 +00004872static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004873socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004877 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4878 return NULL;
4879 }
4880 if (x1 < 0) {
4881 PyErr_SetString(PyExc_OverflowError,
4882 "can't convert negative number to unsigned long");
4883 return NULL;
4884 }
4885 x2 = (unsigned int)htons((unsigned short)x1);
4886 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004887}
4888
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004889PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004890"htons(integer) -> integer\n\
4891\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004892Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004893
4894
Guido van Rossum006bf911996-06-12 04:04:55 +00004895static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004896socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004900 if (PyLong_Check(arg)) {
4901 x = PyLong_AsUnsignedLong(arg);
4902 if (x == (unsigned long) -1 && PyErr_Occurred())
4903 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004904#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 {
4906 unsigned long y;
4907 /* only want the trailing 32 bits */
4908 y = x & 0xFFFFFFFFUL;
4909 if (y ^ x)
4910 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004911 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004912 x = y;
4913 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004914#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 }
4916 else
4917 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004918 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 Py_TYPE(arg)->tp_name);
4920 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004921}
4922
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004923PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004924"htonl(integer) -> integer\n\
4925\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004926Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004927
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004928/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004930PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004931"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004932\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004933Convert 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 +00004934binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004935
4936static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004937socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004938{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004939#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004941#endif
4942
4943#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004944#if (SIZEOF_INT != 4)
4945#error "Not sure if in_addr_t exists and int is not 32-bits."
4946#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 /* Have to use inet_addr() instead */
4948 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004952 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4953 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004954
Tim Peters1df9fdd2003-02-13 03:13:40 +00004955
4956#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004957
4958#ifdef USE_INET_ATON_WEAKLINK
4959 if (inet_aton != NULL) {
4960#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 if (inet_aton(ip_addr, &buf))
4962 return PyBytes_FromStringAndSize((char *)(&buf),
4963 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004964
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004965 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966 "illegal IP address string passed to inet_aton");
4967 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004968
Thomas Wouters477c8d52006-05-27 19:21:47 +00004969#ifdef USE_INET_ATON_WEAKLINK
4970 } else {
4971#endif
4972
4973#endif
4974
4975#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004977 /* special-case this address as inet_addr might return INADDR_NONE
4978 * for this */
4979 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004980 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004986 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 "illegal IP address string passed to inet_aton");
4988 return NULL;
4989 }
4990 }
4991 return PyBytes_FromStringAndSize((char *) &packed_addr,
4992 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004993
4994#ifdef USE_INET_ATON_WEAKLINK
4995 }
4996#endif
4997
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004998#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004999}
5000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005001PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005002"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005003\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005004Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005005
5006static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005007socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005009 char *packed_str;
5010 int addr_len;
5011 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005012
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
5014 return NULL;
5015 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005018 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 "packed IP wrong length for inet_ntoa");
5020 return NULL;
5021 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005026}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005027
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005028#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005029
5030PyDoc_STRVAR(inet_pton_doc,
5031"inet_pton(af, ip) -> packed IP address string\n\
5032\n\
5033Convert an IP address from string format to a packed string suitable\n\
5034for use with low-level network functions.");
5035
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005036#endif
5037
5038#ifdef HAVE_INET_PTON
5039
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005040static PyObject *
5041socket_inet_pton(PyObject *self, PyObject *args)
5042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 int af;
5044 char* ip;
5045 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005046#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005047 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005048#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5052 return NULL;
5053 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005054
Martin v. Löwis04697e82004-06-02 12:35:29 +00005055#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005057 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 "can't use AF_INET6, IPv6 is disabled");
5059 return NULL;
5060 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005061#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 retval = inet_pton(af, ip, packed);
5064 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005065 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005066 return NULL;
5067 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005068 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 "illegal IP address string passed to inet_pton");
5070 return NULL;
5071 } else if (af == AF_INET) {
5072 return PyBytes_FromStringAndSize(packed,
5073 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005074#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 } else if (af == AF_INET6) {
5076 return PyBytes_FromStringAndSize(packed,
5077 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005078#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005080 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 return NULL;
5082 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005083}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005084#elif defined(MS_WINDOWS)
5085
5086static PyObject *
5087socket_inet_pton(PyObject *self, PyObject *args)
5088{
5089 int af;
5090 char* ip;
5091 struct sockaddr_in6 addr;
5092 INT ret, size;
5093
5094 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5095 return NULL;
5096 }
5097
Victor Stinnere990c6e2013-11-16 00:18:58 +01005098 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005099 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5100
5101 if (ret) {
5102 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5103 return NULL;
5104 } else if(af == AF_INET) {
5105 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005106 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005107 sizeof(addr4->sin_addr));
5108 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005109 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005110 sizeof(addr.sin6_addr));
5111 } else {
5112 PyErr_SetString(PyExc_OSError, "unknown address family");
5113 return NULL;
5114 }
5115}
5116
5117#endif
5118
5119#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005120
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005121PyDoc_STRVAR(inet_ntop_doc,
5122"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5123\n\
5124Convert a packed IP address of the given family to string format.");
5125
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005126#endif
5127
5128
5129#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005130static PyObject *
5131socket_inet_ntop(PyObject *self, PyObject *args)
5132{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 int af;
5134 char* packed;
5135 int len;
5136 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005137#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005138 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005139#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005141#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5144 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5147 return NULL;
5148 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 if (af == AF_INET) {
5151 if (len != sizeof(struct in_addr)) {
5152 PyErr_SetString(PyExc_ValueError,
5153 "invalid length of packed IP address string");
5154 return NULL;
5155 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005156#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 } else if (af == AF_INET6) {
5158 if (len != sizeof(struct in6_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#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 } else {
5165 PyErr_Format(PyExc_ValueError,
5166 "unknown address family %d", af);
5167 return NULL;
5168 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 retval = inet_ntop(af, packed, ip, sizeof(ip));
5171 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005172 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 return NULL;
5174 } else {
5175 return PyUnicode_FromString(retval);
5176 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 /* NOTREACHED */
5179 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5180 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005181}
5182
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005183#elif defined(MS_WINDOWS)
5184
5185static PyObject *
5186socket_inet_ntop(PyObject *self, PyObject *args)
5187{
5188 int af;
5189 char* packed;
5190 int len;
5191 struct sockaddr_in6 addr;
5192 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005193#ifdef ENABLE_IPV6
5194 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5195#else
5196 char ip[INET_ADDRSTRLEN + 1];
5197#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005198
5199 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5200 memset((void *) &ip[0], '\0', sizeof(ip));
5201
5202 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5203 return NULL;
5204 }
5205
5206 if (af == AF_INET) {
5207 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5208
5209 if (len != sizeof(struct in_addr)) {
5210 PyErr_SetString(PyExc_ValueError,
5211 "invalid length of packed IP address string");
5212 return NULL;
5213 }
5214 memset(addr4, 0, sizeof(struct sockaddr_in));
5215 addr4->sin_family = AF_INET;
5216 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5217 addrlen = sizeof(struct sockaddr_in);
5218 } else if (af == AF_INET6) {
5219 if (len != sizeof(struct in6_addr)) {
5220 PyErr_SetString(PyExc_ValueError,
5221 "invalid length of packed IP address string");
5222 return NULL;
5223 }
5224
5225 memset(&addr, 0, sizeof(addr));
5226 addr.sin6_family = AF_INET6;
5227 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5228 addrlen = sizeof(addr);
5229 } else {
5230 PyErr_Format(PyExc_ValueError,
5231 "unknown address family %d", af);
5232 return NULL;
5233 }
5234
5235 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005236 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005237 ip, &retlen);
5238
5239 if (ret) {
5240 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5241 return NULL;
5242 } else {
5243 return PyUnicode_FromString(ip);
5244 }
5245}
5246
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005247#endif /* HAVE_INET_PTON */
5248
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005249/* Python interface to getaddrinfo(host, port). */
5250
5251/*ARGSUSED*/
5252static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005253socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005254{
Victor Stinner77af1722011-05-26 14:05:59 +02005255 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005256 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 struct addrinfo hints, *res;
5258 struct addrinfo *res0 = NULL;
5259 PyObject *hobj = NULL;
5260 PyObject *pobj = (PyObject *)NULL;
5261 char pbuf[30];
5262 char *hptr, *pptr;
5263 int family, socktype, protocol, flags;
5264 int error;
5265 PyObject *all = (PyObject *)NULL;
5266 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005267
Georg Brandl6083a4b2013-10-14 06:51:46 +02005268 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005270 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005271 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 &protocol, &flags)) {
5273 return NULL;
5274 }
5275 if (hobj == Py_None) {
5276 hptr = NULL;
5277 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005278 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005279
5280 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005281 if (!idna)
5282 return NULL;
5283 assert(PyBytes_Check(idna));
5284 hptr = PyBytes_AS_STRING(idna);
5285 } else if (PyBytes_Check(hobj)) {
5286 hptr = PyBytes_AsString(hobj);
5287 } else {
5288 PyErr_SetString(PyExc_TypeError,
5289 "getaddrinfo() argument 1 must be string or None");
5290 return NULL;
5291 }
5292 if (PyLong_CheckExact(pobj)) {
5293 long value = PyLong_AsLong(pobj);
5294 if (value == -1 && PyErr_Occurred())
5295 goto err;
5296 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5297 pptr = pbuf;
5298 } else if (PyUnicode_Check(pobj)) {
5299 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005300 if (pptr == NULL)
5301 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005303 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005304 } else if (pobj == Py_None) {
5305 pptr = (char *)NULL;
5306 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005307 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 goto err;
5309 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005310#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005311 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5312 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
5313 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5314 * This workaround avoids a segfault in libsystem.
5315 */
5316 pptr = "00";
5317 }
5318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005319 memset(&hints, 0, sizeof(hints));
5320 hints.ai_family = family;
5321 hints.ai_socktype = socktype;
5322 hints.ai_protocol = protocol;
5323 hints.ai_flags = flags;
5324 Py_BEGIN_ALLOW_THREADS
5325 ACQUIRE_GETADDRINFO_LOCK
5326 error = getaddrinfo(hptr, pptr, &hints, &res0);
5327 Py_END_ALLOW_THREADS
5328 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5329 if (error) {
5330 set_gaierror(error);
5331 goto err;
5332 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005333
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 if ((all = PyList_New(0)) == NULL)
5335 goto err;
5336 for (res = res0; res; res = res->ai_next) {
5337 PyObject *single;
5338 PyObject *addr =
5339 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5340 if (addr == NULL)
5341 goto err;
5342 single = Py_BuildValue("iiisO", res->ai_family,
5343 res->ai_socktype, res->ai_protocol,
5344 res->ai_canonname ? res->ai_canonname : "",
5345 addr);
5346 Py_DECREF(addr);
5347 if (single == NULL)
5348 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 if (PyList_Append(all, single))
5351 goto err;
5352 Py_XDECREF(single);
5353 }
5354 Py_XDECREF(idna);
5355 if (res0)
5356 freeaddrinfo(res0);
5357 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005358 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005359 Py_XDECREF(all);
5360 Py_XDECREF(idna);
5361 if (res0)
5362 freeaddrinfo(res0);
5363 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005364}
5365
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005366PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005367"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5368 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005369\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005370Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005371
5372/* Python interface to getnameinfo(sa, flags). */
5373
5374/*ARGSUSED*/
5375static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005376socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005377{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 PyObject *sa = (PyObject *)NULL;
5379 int flags;
5380 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005381 int port;
5382 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5384 struct addrinfo hints, *res = NULL;
5385 int error;
5386 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005388 flags = flowinfo = scope_id = 0;
5389 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5390 return NULL;
5391 if (!PyTuple_Check(sa)) {
5392 PyErr_SetString(PyExc_TypeError,
5393 "getnameinfo() argument 1 must be a tuple");
5394 return NULL;
5395 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005396 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 &hostp, &port, &flowinfo, &scope_id))
5398 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005399 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005400 PyErr_SetString(PyExc_OverflowError,
5401 "getsockaddrarg: flowinfo must be 0-1048575.");
5402 return NULL;
5403 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005404 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5405 memset(&hints, 0, sizeof(hints));
5406 hints.ai_family = AF_UNSPEC;
5407 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005408 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005409 Py_BEGIN_ALLOW_THREADS
5410 ACQUIRE_GETADDRINFO_LOCK
5411 error = getaddrinfo(hostp, pbuf, &hints, &res);
5412 Py_END_ALLOW_THREADS
5413 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5414 if (error) {
5415 set_gaierror(error);
5416 goto fail;
5417 }
5418 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005419 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 "sockaddr resolved to multiple addresses");
5421 goto fail;
5422 }
5423 switch (res->ai_family) {
5424 case AF_INET:
5425 {
5426 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005427 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 "IPv4 sockaddr must be 2 tuple");
5429 goto fail;
5430 }
5431 break;
5432 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005433#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 case AF_INET6:
5435 {
5436 struct sockaddr_in6 *sin6;
5437 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005438 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005439 sin6->sin6_scope_id = scope_id;
5440 break;
5441 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005444 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005445 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5446 if (error) {
5447 set_gaierror(error);
5448 goto fail;
5449 }
5450 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005451
5452fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005453 if (res)
5454 freeaddrinfo(res);
5455 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005456}
5457
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005458PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005459"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005460\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005461Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005462
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005463
5464/* Python API to getting and setting the default timeout value. */
5465
5466static PyObject *
5467socket_getdefaulttimeout(PyObject *self)
5468{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 if (defaulttimeout < 0.0) {
5470 Py_INCREF(Py_None);
5471 return Py_None;
5472 }
5473 else
5474 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005475}
5476
5477PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005478"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005479\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005480Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005481A value of None indicates that new socket objects have no timeout.\n\
5482When the socket module is first imported, the default is None.");
5483
5484static PyObject *
5485socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5486{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 if (arg == Py_None)
5490 timeout = -1.0;
5491 else {
5492 timeout = PyFloat_AsDouble(arg);
5493 if (timeout < 0.0) {
5494 if (!PyErr_Occurred())
5495 PyErr_SetString(PyExc_ValueError,
5496 "Timeout value out of range");
5497 return NULL;
5498 }
5499 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005503 Py_INCREF(Py_None);
5504 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005505}
5506
5507PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005508"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005509\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005510Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005511A value of None indicates that new socket objects have no timeout.\n\
5512When the socket module is first imported, the default is None.");
5513
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005514#ifdef HAVE_IF_NAMEINDEX
5515/* Python API for getting interface indices and names */
5516
5517static PyObject *
5518socket_if_nameindex(PyObject *self, PyObject *arg)
5519{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005520 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005521 int i;
5522 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005523
Charles-François Natali60713592011-05-20 16:55:06 +02005524 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005525 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005526 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005527 return NULL;
5528 }
5529
5530 list = PyList_New(0);
5531 if (list == NULL) {
5532 if_freenameindex(ni);
5533 return NULL;
5534 }
5535
Charles-François Natali60713592011-05-20 16:55:06 +02005536 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5537 PyObject *ni_tuple = Py_BuildValue("IO&",
5538 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005539
5540 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5541 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005542 Py_DECREF(list);
5543 if_freenameindex(ni);
5544 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005545 }
5546 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005547 }
5548
5549 if_freenameindex(ni);
5550 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005551}
5552
5553PyDoc_STRVAR(if_nameindex_doc,
5554"if_nameindex()\n\
5555\n\
5556Returns a list of network interface information (index, name) tuples.");
5557
Charles-François Natali60713592011-05-20 16:55:06 +02005558static PyObject *
5559socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005560{
Charles-François Natali60713592011-05-20 16:55:06 +02005561 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005562 unsigned long index;
5563
Charles-François Natali60713592011-05-20 16:55:06 +02005564 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5565 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005566 return NULL;
5567
Charles-François Natali60713592011-05-20 16:55:06 +02005568 index = if_nametoindex(PyBytes_AS_STRING(oname));
5569 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005570 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005571 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005572 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005573 return NULL;
5574 }
5575
5576 return PyLong_FromUnsignedLong(index);
5577}
5578
5579PyDoc_STRVAR(if_nametoindex_doc,
5580"if_nametoindex(if_name)\n\
5581\n\
5582Returns the interface index corresponding to the interface name if_name.");
5583
Charles-François Natali60713592011-05-20 16:55:06 +02005584static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005585socket_if_indextoname(PyObject *self, PyObject *arg)
5586{
Charles-François Natali60713592011-05-20 16:55:06 +02005587 unsigned long index;
5588 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005589
Charles-François Natali60713592011-05-20 16:55:06 +02005590 index = PyLong_AsUnsignedLong(arg);
5591 if (index == (unsigned long) -1)
5592 return NULL;
5593
5594 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005595 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005596 return NULL;
5597 }
5598
Charles-François Natali60713592011-05-20 16:55:06 +02005599 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005600}
5601
5602PyDoc_STRVAR(if_indextoname_doc,
5603"if_indextoname(if_index)\n\
5604\n\
5605Returns the interface name corresponding to the interface index if_index.");
5606
5607#endif /* HAVE_IF_NAMEINDEX */
5608
5609
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005610#ifdef CMSG_LEN
5611/* Python interface to CMSG_LEN(length). */
5612
5613static PyObject *
5614socket_CMSG_LEN(PyObject *self, PyObject *args)
5615{
5616 Py_ssize_t length;
5617 size_t result;
5618
5619 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5620 return NULL;
5621 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5622 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5623 return NULL;
5624 }
5625 return PyLong_FromSize_t(result);
5626}
5627
5628PyDoc_STRVAR(CMSG_LEN_doc,
5629"CMSG_LEN(length) -> control message length\n\
5630\n\
5631Return the total length, without trailing padding, of an ancillary\n\
5632data item with associated data of the given length. This value can\n\
5633often be used as the buffer size for recvmsg() to receive a single\n\
5634item of ancillary data, but RFC 3542 requires portable applications to\n\
5635use CMSG_SPACE() and thus include space for padding, even when the\n\
5636item will be the last in the buffer. Raises OverflowError if length\n\
5637is outside the permissible range of values.");
5638
5639
5640#ifdef CMSG_SPACE
5641/* Python interface to CMSG_SPACE(length). */
5642
5643static PyObject *
5644socket_CMSG_SPACE(PyObject *self, PyObject *args)
5645{
5646 Py_ssize_t length;
5647 size_t result;
5648
5649 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5650 return NULL;
5651 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5652 PyErr_SetString(PyExc_OverflowError,
5653 "CMSG_SPACE() argument out of range");
5654 return NULL;
5655 }
5656 return PyLong_FromSize_t(result);
5657}
5658
5659PyDoc_STRVAR(CMSG_SPACE_doc,
5660"CMSG_SPACE(length) -> buffer size\n\
5661\n\
5662Return the buffer size needed for recvmsg() to receive an ancillary\n\
5663data item with associated data of the given length, along with any\n\
5664trailing padding. The buffer space needed to receive multiple items\n\
5665is the sum of the CMSG_SPACE() values for their associated data\n\
5666lengths. Raises OverflowError if length is outside the permissible\n\
5667range of values.");
5668#endif /* CMSG_SPACE */
5669#endif /* CMSG_LEN */
5670
5671
Guido van Rossum30a685f1991-06-27 15:51:29 +00005672/* List of functions exported by this module. */
5673
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005674static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005675 {"gethostbyname", socket_gethostbyname,
5676 METH_VARARGS, gethostbyname_doc},
5677 {"gethostbyname_ex", socket_gethostbyname_ex,
5678 METH_VARARGS, ghbn_ex_doc},
5679 {"gethostbyaddr", socket_gethostbyaddr,
5680 METH_VARARGS, gethostbyaddr_doc},
5681 {"gethostname", socket_gethostname,
5682 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005683#ifdef HAVE_SETHOSTNAME
5684 {"sethostname", socket_sethostname,
5685 METH_VARARGS, sethostname_doc},
5686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 {"getservbyname", socket_getservbyname,
5688 METH_VARARGS, getservbyname_doc},
5689 {"getservbyport", socket_getservbyport,
5690 METH_VARARGS, getservbyport_doc},
5691 {"getprotobyname", socket_getprotobyname,
5692 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005693#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005694 {"dup", socket_dup,
5695 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005696#endif
Dave Cole331708b2004-08-09 04:51:41 +00005697#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 {"socketpair", socket_socketpair,
5699 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005701 {"ntohs", socket_ntohs,
5702 METH_VARARGS, ntohs_doc},
5703 {"ntohl", socket_ntohl,
5704 METH_O, ntohl_doc},
5705 {"htons", socket_htons,
5706 METH_VARARGS, htons_doc},
5707 {"htonl", socket_htonl,
5708 METH_O, htonl_doc},
5709 {"inet_aton", socket_inet_aton,
5710 METH_VARARGS, inet_aton_doc},
5711 {"inet_ntoa", socket_inet_ntoa,
5712 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005713#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 {"inet_pton", socket_inet_pton,
5715 METH_VARARGS, inet_pton_doc},
5716 {"inet_ntop", socket_inet_ntop,
5717 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005718#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005719 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5720 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005721 {"getnameinfo", socket_getnameinfo,
5722 METH_VARARGS, getnameinfo_doc},
5723 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5724 METH_NOARGS, getdefaulttimeout_doc},
5725 {"setdefaulttimeout", socket_setdefaulttimeout,
5726 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005727#ifdef HAVE_IF_NAMEINDEX
5728 {"if_nameindex", socket_if_nameindex,
5729 METH_NOARGS, if_nameindex_doc},
5730 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005731 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005732 {"if_indextoname", socket_if_indextoname,
5733 METH_O, if_indextoname_doc},
5734#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005735#ifdef CMSG_LEN
5736 {"CMSG_LEN", socket_CMSG_LEN,
5737 METH_VARARGS, CMSG_LEN_doc},
5738#ifdef CMSG_SPACE
5739 {"CMSG_SPACE", socket_CMSG_SPACE,
5740 METH_VARARGS, CMSG_SPACE_doc},
5741#endif
5742#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005743 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005744};
5745
Guido van Rossum30a685f1991-06-27 15:51:29 +00005746
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005747#ifdef MS_WINDOWS
5748#define OS_INIT_DEFINED
5749
5750/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005751
5752static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005753os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005754{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005756}
5757
5758static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005759os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 WSADATA WSAData;
5762 int ret;
5763 ret = WSAStartup(0x0101, &WSAData);
5764 switch (ret) {
5765 case 0: /* No error */
5766 Py_AtExit(os_cleanup);
5767 return 1; /* Success */
5768 case WSASYSNOTREADY:
5769 PyErr_SetString(PyExc_ImportError,
5770 "WSAStartup failed: network not ready");
5771 break;
5772 case WSAVERNOTSUPPORTED:
5773 case WSAEINVAL:
5774 PyErr_SetString(
5775 PyExc_ImportError,
5776 "WSAStartup failed: requested version not supported");
5777 break;
5778 default:
5779 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5780 break;
5781 }
5782 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005783}
5784
Guido van Rossum8d665e61996-06-26 18:22:49 +00005785#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005786
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005787
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005788
5789#ifndef OS_INIT_DEFINED
5790static int
5791os_init(void)
5792{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005793 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005794}
5795#endif
5796
5797
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005798/* C API table - always add new things to the end for binary
5799 compatibility. */
5800static
5801PySocketModule_APIObject PySocketModuleAPI =
5802{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005804 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005805 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005806};
5807
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005808
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005809/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005810
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005811 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005812 "socket.py" which implements some additional functionality.
5813 The import of "_socket" may fail with an ImportError exception if
5814 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005815 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005816 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005817*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005818
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005819PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005820"Implementation module for socket operations.\n\
5821\n\
5822See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005823
Martin v. Löwis1a214512008-06-11 05:26:20 +00005824static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 PyModuleDef_HEAD_INIT,
5826 PySocket_MODULE_NAME,
5827 socket_doc,
5828 -1,
5829 socket_methods,
5830 NULL,
5831 NULL,
5832 NULL,
5833 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005834};
5835
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005836PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005837PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 if (!os_init())
5842 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005843
Victor Stinnerdaf45552013-08-28 00:53:59 +02005844#ifdef MS_WINDOWS
5845 if (support_wsa_no_inherit == -1) {
5846 DWORD version = GetVersion();
5847 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5848 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5849 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5850 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5851 }
5852#endif
5853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854 Py_TYPE(&sock_type) = &PyType_Type;
5855 m = PyModule_Create(&socketmodule);
5856 if (m == NULL)
5857 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005858
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005859 Py_INCREF(PyExc_OSError);
5860 PySocketModuleAPI.error = PyExc_OSError;
5861 Py_INCREF(PyExc_OSError);
5862 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005864 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 if (socket_herror == NULL)
5866 return NULL;
5867 Py_INCREF(socket_herror);
5868 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005869 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005870 NULL);
5871 if (socket_gaierror == NULL)
5872 return NULL;
5873 Py_INCREF(socket_gaierror);
5874 PyModule_AddObject(m, "gaierror", socket_gaierror);
5875 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005876 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 if (socket_timeout == NULL)
5878 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005879 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 Py_INCREF(socket_timeout);
5881 PyModule_AddObject(m, "timeout", socket_timeout);
5882 Py_INCREF((PyObject *)&sock_type);
5883 if (PyModule_AddObject(m, "SocketType",
5884 (PyObject *)&sock_type) != 0)
5885 return NULL;
5886 Py_INCREF((PyObject *)&sock_type);
5887 if (PyModule_AddObject(m, "socket",
5888 (PyObject *)&sock_type) != 0)
5889 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005890
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005891#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005893#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 Py_INCREF(has_ipv6);
5897 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005899 /* Export C API */
5900 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5901 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5902 ) != 0)
5903 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005906#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005907 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005908#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005909 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005910#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005911 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005912#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005913#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005914 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005915#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005916#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005918 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005919#endif
5920#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005921 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005922#endif
5923#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005924 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005925 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005926#endif
5927#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005929 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005930#endif
5931#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005933 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005934#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005935#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005936 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005937 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005938#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005939#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005940 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005941 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005942#endif
5943#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005945 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005946#endif
5947#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005948 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005949#endif
5950#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005952 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005953#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005954#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005956 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005957#endif
5958#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005960 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005961#endif
5962#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005963 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005964 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005965#endif
5966#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005967 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005968 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005969#endif
5970#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005971 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005972 PyModule_AddIntMacro(m, AF_NETLINK);
5973 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005974#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005975 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005976#endif
5977#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005978 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005979#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005980 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5981 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005982#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005983 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005984#endif
5985#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005986 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005987#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005988#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005989 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005990#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005991#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005992 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005993#endif
5994#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005995 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005996#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005997 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005998#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005999 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006000#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006001#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006002 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006003#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006004#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006005#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006006 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006007 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006008#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006009#ifdef AF_LINK
6010 PyModule_AddIntMacro(m, AF_LINK);
6011#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006012#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006014 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006015#endif
6016#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006018 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006019#endif
6020#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006022 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006023#endif
6024#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006025 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006026 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006027#endif
6028#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006030 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006031#endif
6032#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006034 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006035#endif
6036#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006038 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006039#endif
6040#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006042 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006043#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006044
Hye-Shik Chang81268602004-02-02 06:05:24 +00006045#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006046 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6047 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6048 PyModule_AddIntMacro(m, BTPROTO_HCI);
6049 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006050#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006051 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006052#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006053#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006054#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006055 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006056#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6058 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006059#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006060 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6062 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006063#endif
6064
Charles-François Natali47413c12011-10-06 19:47:44 +02006065#ifdef AF_CAN
6066 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006067 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006068#endif
6069#ifdef PF_CAN
6070 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006071 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006072#endif
6073
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006074/* Reliable Datagram Sockets */
6075#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006076 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006077#endif
6078#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006079 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006080#endif
6081
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006082/* Kernel event messages */
6083#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006084 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006085#endif
6086#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006087 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006088#endif
6089
Antoine Pitroub156a462010-10-27 20:13:57 +00006090#ifdef AF_PACKET
6091 PyModule_AddIntMacro(m, AF_PACKET);
6092#endif
6093#ifdef PF_PACKET
6094 PyModule_AddIntMacro(m, PF_PACKET);
6095#endif
6096#ifdef PACKET_HOST
6097 PyModule_AddIntMacro(m, PACKET_HOST);
6098#endif
6099#ifdef PACKET_BROADCAST
6100 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6101#endif
6102#ifdef PACKET_MULTICAST
6103 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6104#endif
6105#ifdef PACKET_OTHERHOST
6106 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6107#endif
6108#ifdef PACKET_OUTGOING
6109 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6110#endif
6111#ifdef PACKET_LOOPBACK
6112 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6113#endif
6114#ifdef PACKET_FASTROUTE
6115 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006116#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006117
Christian Heimes043d6f62008-01-07 17:19:16 +00006118#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006119 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006120
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006122 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6123 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6124 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006125
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006126 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6127 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6128 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006131 PyModule_AddIntMacro(m, SOL_TIPC);
6132 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6133 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6134 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6135 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006136
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006137 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6138 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6139 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6140 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6144 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006145#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006147 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006148#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6150 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6151 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6152 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6153 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6154 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006155#endif
6156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, SOCK_STREAM);
6159 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006160/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006161 PyModule_AddIntMacro(m, SOCK_RAW);
6162 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006163#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006164 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006165#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006166#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006168#endif
6169#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006171#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006173#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006174 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006177 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006178#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006179#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006180 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006181#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006182#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006184#endif
6185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006188#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006189#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006190 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006191#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006193 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006195#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006196 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006197#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006201#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006202 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006203#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006205 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006206#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006208 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006212#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006215#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006216#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006218#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006219#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006220 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006221#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006222#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006223 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006224#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006226 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006227#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006229 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006232 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006233#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006234#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006235 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006236#endif
6237#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006239#endif
6240#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006241 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006242#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006243#ifdef SO_BINDTODEVICE
6244 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6245#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006246#ifdef SO_PRIORITY
6247 PyModule_AddIntMacro(m, SO_PRIORITY);
6248#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 /* Maximum number of connections for "listen" */
6251#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006253#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006255#endif
6256
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006257 /* Ancilliary message types */
6258#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006259 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006260#endif
6261#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006262 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006263#endif
6264#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006266#endif
6267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 /* Flags for send, recv */
6269#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006279 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006280#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006283#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006286#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006290#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006292#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006298#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006299#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006301#endif
6302#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006303 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006304#endif
6305#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006306 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006307#endif
6308#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006310#endif
6311#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006313#endif
6314#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006315 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006316#endif
6317#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006319#endif
6320#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006321 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006322#endif
6323#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006324 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006325#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006326#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006327 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006328#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 /* Protocol level and numbers, usable for [gs]etsockopt */
6331#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006336#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006340 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006343 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006344#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006347#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006348#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006349 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006350#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006351#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006352 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006355 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006356#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006363#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006364#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006365 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006366#endif
6367#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6369 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006370#endif
6371#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006372 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6373 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6374 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006375
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6377 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6378 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006379#endif
6380#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006381 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6382 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6383 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6384 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006385#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006386#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006387 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006388 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6389 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6390 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6391 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6392 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6393 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6394 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6395 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6396 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6397 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6398 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6399 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6400#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006401#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006402 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006403#endif
6404#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006406#endif
6407#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006409#endif
6410#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006412#endif
6413#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006414 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006415#endif
6416#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006417 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006418#endif
6419#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006420 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006424#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006432#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006452#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006455#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006463#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006488 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006494 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006497 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006500 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006503 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006509 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006515 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006521 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006522#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006524 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006525#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006526#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006527 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006528#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006530 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006531#endif
6532/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006535#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006538#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006540#endif
6541
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006542#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006544#endif
6545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546 /* Some port configuration */
6547#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006549#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006556#endif
6557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 /* Some reserved IP v.4 addresses */
6559#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006561#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006566#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006571#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006576#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579#ifdef INADDR_ALLHOSTS_GROUP
6580 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6581 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006582#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006587#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006592#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006594#endif
6595
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 /* IPv4 [gs]etsockopt options */
6597#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006598 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006601 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006607 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006615#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006616 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006617#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006619 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006628 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006635#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006636#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006638#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006639#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006640 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006641#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006642#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006643 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006644#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006645#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006647#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006648
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006649 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6650#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006669#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006673#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006675#endif
6676#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006678#endif
6679#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006681#endif
6682#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006683 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006684#endif
6685#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006686 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006687#endif
6688#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006690#endif
6691#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006693#endif
6694#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006696#endif
6697#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006699#endif
6700#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006702#endif
6703#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006705#endif
6706#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006708#endif
6709#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006711#endif
6712#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006714#endif
6715#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006717#endif
6718#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006720#endif
6721#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006723#endif
6724#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006726#endif
6727#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006729#endif
6730#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006732#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006734 /* TCP options */
6735#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006744#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006750#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006752#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006754 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006758#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006759#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006761#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006764#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006767#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006768#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006770#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006771#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006773#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775 /* IPX options */
6776#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006778#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006779
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006780/* Reliable Datagram Sockets */
6781#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006783#endif
6784#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006786#endif
6787#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006789#endif
6790#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006792#endif
6793#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006795#endif
6796#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006798#endif
6799#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006801#endif
6802#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006804#endif
6805#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006807#endif
6808#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006810#endif
6811#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006813#endif
6814#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006816#endif
6817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006819#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006821#endif
6822#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006824#endif
6825#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006827#endif
6828#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006830#endif
6831#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006833#endif
6834#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006836#endif
6837#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006839#endif
6840#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006842#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006843#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006845#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006846#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006848#endif
6849#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006851#endif
6852#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006854#endif
6855#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006856 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006857#endif
6858#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006859 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006860#endif
6861#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006863#endif
6864#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006866#endif
6867#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006869#endif
6870#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006872#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006873#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006875#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006876#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006878#endif
6879#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006881#endif
6882#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006884#endif
6885#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006887#endif
6888#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006890#endif
6891#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006893#endif
6894#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006896#endif
6897#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006899#endif
6900#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006902#endif
6903#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006905#endif
6906#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006908#endif
6909#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006911#endif
6912#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006914#endif
6915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006917#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006919#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006921#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006923#endif
6924#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006926#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006927 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006928#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006930#endif
6931#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006933#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006935#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006937#endif
6938
Christian Heimesfaf2f632008-01-06 16:59:19 +00006939#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940 {
6941 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6942 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6943 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006944 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945 PyObject *tmp;
6946 tmp = PyLong_FromUnsignedLong(codes[i]);
6947 if (tmp == NULL)
6948 return NULL;
6949 PyModule_AddObject(m, names[i], tmp);
6950 }
6951 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006952 PyModule_AddIntMacro(m, RCVALL_OFF);
6953 PyModule_AddIntMacro(m, RCVALL_ON);
6954 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006955#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006957#endif
6958#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006960#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006961#endif /* _MSTCPIP_ */
6962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006963 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006964#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006967 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006968}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006969
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006970
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006971#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006972#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006973
6974/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006975/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006976
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006977int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006978inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006981#if (SIZEOF_INT != 4)
6982#error "Not sure if in_addr_t exists and int is not 32-bits."
6983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984 unsigned int packed_addr;
6985 packed_addr = inet_addr(src);
6986 if (packed_addr == INADDR_NONE)
6987 return 0;
6988 memcpy(dst, &packed_addr, 4);
6989 return 1;
6990 }
6991 /* Should set errno to EAFNOSUPPORT */
6992 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006993}
6994
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006995const char *
6996inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998 if (af == AF_INET) {
6999 struct in_addr packed_addr;
7000 if (size < 16)
7001 /* Should set errno to ENOSPC. */
7002 return NULL;
7003 memcpy(&packed_addr, src, sizeof(packed_addr));
7004 return strncpy(dst, inet_ntoa(packed_addr), size);
7005 }
7006 /* Should set errno to EAFNOSUPPORT */
7007 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007008}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007009
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007010#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007011#endif