blob: 5ba7f4c9904d803e7293cc509ed05e5c1033d619 [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{
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588#ifndef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 int delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000590#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000591#ifdef SOCK_NONBLOCK
592 if (block)
593 s->sock_type &= (~SOCK_NONBLOCK);
594 else
595 s->sock_type |= SOCK_NONBLOCK;
596#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000599#ifndef MS_WINDOWS
Jesus Cea14c81ab2012-10-05 02:11:36 +0200600#if defined(__VMS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 block = !block;
602 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200603#else /* !__VMS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
605 if (block)
606 delay_flag &= (~O_NONBLOCK);
607 else
608 delay_flag |= O_NONBLOCK;
609 fcntl(s->sock_fd, F_SETFL, delay_flag);
Jesus Cea14c81ab2012-10-05 02:11:36 +0200610#endif /* !__VMS */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000611#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 block = !block;
613 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000614#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 /* Since these don't return anything */
618 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000619}
620
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000622 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000623 This does not raise an exception; we'll let our caller do that
624 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000625 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000626static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000627internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 /* Nothing to do unless we're in timeout mode (not non-blocking) */
632 if (s->sock_timeout <= 0.0)
633 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 /* Guard against closed socket */
636 if (s->sock_fd < 0)
637 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000638
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000639 /* Handling this condition here simplifies the select loops */
640 if (interval < 0.0)
641 return 1;
642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Prefer poll, if available, since you can poll() any fd
644 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000645#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 {
647 struct pollfd pollfd;
648 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 pollfd.fd = s->sock_fd;
651 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000654 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 n = poll(&pollfd, 1, timeout);
656 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000657#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000658 {
659 /* Construct the arguments to select */
660 fd_set fds;
661 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000662 tv.tv_sec = (int)interval;
663 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 FD_ZERO(&fds);
665 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 /* See if the socket is ready */
668 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000669 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
670 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000672 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
673 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (n < 0)
678 return -1;
679 if (n == 0)
680 return 1;
681 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682}
683
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000684static int
685internal_select(PySocketSockObject *s, int writing)
686{
687 return internal_select_ex(s, writing, s->sock_timeout);
688}
689
690/*
691 Two macros for automatic retry of select() in case of false positives
692 (for example, select() could indicate a socket is ready for reading
693 but the data then discarded by the OS because of a wrong checksum).
694 Here is an example of use:
695
696 BEGIN_SELECT_LOOP(s)
697 Py_BEGIN_ALLOW_THREADS
698 timeout = internal_select_ex(s, 0, interval);
699 if (!timeout)
700 outlen = recv(s->sock_fd, cbuf, len, flags);
701 Py_END_ALLOW_THREADS
702 if (timeout == 1) {
703 PyErr_SetString(socket_timeout, "timed out");
704 return -1;
705 }
706 END_SELECT_LOOP(s)
707*/
708
709#define BEGIN_SELECT_LOOP(s) \
710 { \
711 _PyTime_timeval now, deadline = {0, 0}; \
712 double interval = s->sock_timeout; \
713 int has_timeout = s->sock_timeout > 0.0; \
714 if (has_timeout) { \
715 _PyTime_gettimeofday(&now); \
716 deadline = now; \
717 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
718 } \
719 while (1) { \
720 errno = 0; \
721
722#define END_SELECT_LOOP(s) \
723 if (!has_timeout || \
724 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
725 break; \
726 _PyTime_gettimeofday(&now); \
727 interval = _PyTime_INTERVAL(now, deadline); \
728 } \
729 } \
730
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000731/* Initialize a new socket object. */
732
Tim Petersa12b4cf2002-07-18 22:38:44 +0000733static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000734
Martin v. Löwis1a214512008-06-11 05:26:20 +0000735static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000736init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000738{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 s->sock_fd = fd;
740 s->sock_family = family;
741 s->sock_type = type;
742 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000745#ifdef SOCK_NONBLOCK
746 if (type & SOCK_NONBLOCK)
747 s->sock_timeout = 0.0;
748 else
749#endif
750 {
751 s->sock_timeout = defaulttimeout;
752 if (defaulttimeout >= 0.0)
753 internal_setblocking(s, 0);
754 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000755
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000756}
757
758
Guido van Rossum30a685f1991-06-27 15:51:29 +0000759/* Create a new socket object.
760 This just creates the object and initializes it.
761 If the creation fails, return NULL and set an exception (implicit
762 in NEWOBJ()). */
763
Guido van Rossum73624e91994-10-10 17:59:00 +0000764static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000765new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000766{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 PySocketSockObject *s;
768 s = (PySocketSockObject *)
769 PyType_GenericNew(&sock_type, NULL, NULL);
770 if (s != NULL)
771 init_sockobject(s, fd, family, type, proto);
772 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000773}
774
Guido van Rossum30a685f1991-06-27 15:51:29 +0000775
Guido van Rossum48a680c2001-03-02 06:34:14 +0000776/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000777 thread to be in gethostbyname or getaddrinfo */
778#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200779static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000780#endif
781
782
Guido van Rossum30a685f1991-06-27 15:51:29 +0000783/* Convert a string specifying a host name or one of a few symbolic
784 names to a numeric IP address. This usually calls gethostbyname()
785 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000786 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000787 an error occurred; then an exception is raised. */
788
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000790setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 struct addrinfo hints, *res;
793 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
796 if (name[0] == '\0') {
797 int siz;
798 memset(&hints, 0, sizeof(hints));
799 hints.ai_family = af;
800 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
801 hints.ai_flags = AI_PASSIVE;
802 Py_BEGIN_ALLOW_THREADS
803 ACQUIRE_GETADDRINFO_LOCK
804 error = getaddrinfo(NULL, "0", &hints, &res);
805 Py_END_ALLOW_THREADS
806 /* We assume that those thread-unsafe getaddrinfo() versions
807 *are* safe regarding their return value, ie. that a
808 subsequent call to getaddrinfo() does not destroy the
809 outcome of the first call. */
810 RELEASE_GETADDRINFO_LOCK
811 if (error) {
812 set_gaierror(error);
813 return -1;
814 }
815 switch (res->ai_family) {
816 case AF_INET:
817 siz = 4;
818 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000819#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 case AF_INET6:
821 siz = 16;
822 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 default:
825 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200826 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 "unsupported address family");
828 return -1;
829 }
830 if (res->ai_next) {
831 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200832 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 "wildcard resolved to multiple address");
834 return -1;
835 }
836 if (res->ai_addrlen < addr_ret_size)
837 addr_ret_size = res->ai_addrlen;
838 memcpy(addr_ret, res->ai_addr, addr_ret_size);
839 freeaddrinfo(res);
840 return siz;
841 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200842 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100843 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200844 if (strcmp(name, "255.255.255.255") == 0 ||
845 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 struct sockaddr_in *sin;
847 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200848 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000849 "address family mismatched");
850 return -1;
851 }
852 sin = (struct sockaddr_in *)addr_ret;
853 memset((void *) sin, '\0', sizeof(*sin));
854 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000855#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 sin->sin_addr.s_addr = INADDR_BROADCAST;
859 return sizeof(sin->sin_addr);
860 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200861
862 /* avoid a name resolution in case of numeric address */
863#ifdef HAVE_INET_PTON
864 /* check for an IPv4 address */
865 if (af == AF_UNSPEC || af == AF_INET) {
866 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
867 memset(sin, 0, sizeof(*sin));
868 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
869 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000870#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200871 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000872#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200873 return 4;
874 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200876#ifdef ENABLE_IPV6
877 /* check for an IPv6 address - if the address contains a scope ID, we
878 * fallback to getaddrinfo(), which can handle translation from interface
879 * name to interface index */
880 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
881 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
882 memset(sin, 0, sizeof(*sin));
883 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
884 sin->sin6_family = AF_INET6;
885#ifdef HAVE_SOCKADDR_SA_LEN
886 sin->sin6_len = sizeof(*sin);
887#endif
888 return 16;
889 }
890 }
891#endif /* ENABLE_IPV6 */
892#else /* HAVE_INET_PTON */
893 /* check for an IPv4 address */
894 if (af == AF_INET || af == AF_UNSPEC) {
895 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
896 memset(sin, 0, sizeof(*sin));
897 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
898 sin->sin_family = AF_INET;
899#ifdef HAVE_SOCKADDR_SA_LEN
900 sin->sin_len = sizeof(*sin);
901#endif
902 return 4;
903 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100904 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200905#endif /* HAVE_INET_PTON */
906
907 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 memset(&hints, 0, sizeof(hints));
909 hints.ai_family = af;
910 Py_BEGIN_ALLOW_THREADS
911 ACQUIRE_GETADDRINFO_LOCK
912 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000913#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 if (error == EAI_NONAME && af == AF_UNSPEC) {
915 /* On Tru64 V5.1, numeric-to-addr conversion fails
916 if no address family is given. Assume IPv4 for now.*/
917 hints.ai_family = AF_INET;
918 error = getaddrinfo(name, NULL, &hints, &res);
919 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 Py_END_ALLOW_THREADS
922 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
923 if (error) {
924 set_gaierror(error);
925 return -1;
926 }
927 if (res->ai_addrlen < addr_ret_size)
928 addr_ret_size = res->ai_addrlen;
929 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
930 freeaddrinfo(res);
931 switch (addr_ret->sa_family) {
932 case AF_INET:
933 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000934#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 case AF_INET6:
936 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000937#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200939 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 return -1;
941 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000942}
943
Guido van Rossum30a685f1991-06-27 15:51:29 +0000944
Guido van Rossum30a685f1991-06-27 15:51:29 +0000945/* Create a string object representing an IP address.
946 This is always a string of the form 'dd.dd.dd.dd' (with variable
947 size numbers). */
948
Guido van Rossum73624e91994-10-10 17:59:00 +0000949static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000950makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 char buf[NI_MAXHOST];
953 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
956 NI_NUMERICHOST);
957 if (error) {
958 set_gaierror(error);
959 return NULL;
960 }
961 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000962}
963
964
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000965#ifdef USE_BLUETOOTH
966/* Convert a string representation of a Bluetooth address into a numeric
967 address. Returns the length (6), or raises an exception and returns -1 if
968 an error occurred. */
969
970static int
971setbdaddr(char *name, bdaddr_t *bdaddr)
972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 unsigned int b0, b1, b2, b3, b4, b5;
974 char ch;
975 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
978 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
979 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
980 bdaddr->b[0] = b0;
981 bdaddr->b[1] = b1;
982 bdaddr->b[2] = b2;
983 bdaddr->b[3] = b3;
984 bdaddr->b[4] = b4;
985 bdaddr->b[5] = b5;
986 return 6;
987 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200988 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000989 return -1;
990 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000991}
992
993/* Create a string representation of the Bluetooth address. This is always a
994 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
995 value (zero padded if necessary). */
996
997static PyObject *
998makebdaddr(bdaddr_t *bdaddr)
999{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001000 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1003 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1004 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1005 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001006}
1007#endif
1008
1009
Guido van Rossum30a685f1991-06-27 15:51:29 +00001010/* Create an object representing the given socket address,
1011 suitable for passing it back to bind(), connect() etc.
1012 The family field of the sockaddr structure is inspected
1013 to determine what kind of address it really is. */
1014
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001015/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001016static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001017makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 if (addrlen == 0) {
1020 /* No address -- may be recvfrom() from known socket */
1021 Py_INCREF(Py_None);
1022 return Py_None;
1023 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 case AF_INET:
1028 {
1029 struct sockaddr_in *a;
1030 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1031 PyObject *ret = NULL;
1032 if (addrobj) {
1033 a = (struct sockaddr_in *)addr;
1034 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1035 Py_DECREF(addrobj);
1036 }
1037 return ret;
1038 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001039
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001040#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001041 case AF_UNIX:
1042 {
1043 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001044#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001045 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1046 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001047 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 }
1049 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001050#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001051 {
1052 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001053 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 }
1055 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001056#endif /* AF_UNIX */
1057
Martin v. Löwis11017b12006-01-14 18:12:57 +00001058#if defined(AF_NETLINK)
1059 case AF_NETLINK:
1060 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1062 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001063 }
1064#endif /* AF_NETLINK */
1065
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001066#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 case AF_INET6:
1068 {
1069 struct sockaddr_in6 *a;
1070 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1071 PyObject *ret = NULL;
1072 if (addrobj) {
1073 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001074 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001075 addrobj,
1076 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001077 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001078 a->sin6_scope_id);
1079 Py_DECREF(addrobj);
1080 }
1081 return ret;
1082 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001083#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001085#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 case AF_BLUETOOTH:
1087 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001089 case BTPROTO_L2CAP:
1090 {
1091 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1092 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1093 PyObject *ret = NULL;
1094 if (addrobj) {
1095 ret = Py_BuildValue("Oi",
1096 addrobj,
1097 _BT_L2_MEMB(a, psm));
1098 Py_DECREF(addrobj);
1099 }
1100 return ret;
1101 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 case BTPROTO_RFCOMM:
1104 {
1105 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1106 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1107 PyObject *ret = NULL;
1108 if (addrobj) {
1109 ret = Py_BuildValue("Oi",
1110 addrobj,
1111 _BT_RC_MEMB(a, channel));
1112 Py_DECREF(addrobj);
1113 }
1114 return ret;
1115 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 case BTPROTO_HCI:
1118 {
1119 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001120#if defined(__NetBSD__) || defined(__DragonFly__)
1121 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1122#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001123 PyObject *ret = NULL;
1124 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1125 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001128
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001129#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 case BTPROTO_SCO:
1131 {
1132 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1133 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1134 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001135#endif
1136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001137 default:
1138 PyErr_SetString(PyExc_ValueError,
1139 "Unknown Bluetooth protocol");
1140 return NULL;
1141 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001142#endif
1143
Antoine Pitroub156a462010-10-27 20:13:57 +00001144#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001145 case AF_PACKET:
1146 {
1147 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1148 char *ifname = "";
1149 struct ifreq ifr;
1150 /* need to look up interface name give index */
1151 if (a->sll_ifindex) {
1152 ifr.ifr_ifindex = a->sll_ifindex;
1153 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1154 ifname = ifr.ifr_name;
1155 }
1156 return Py_BuildValue("shbhy#",
1157 ifname,
1158 ntohs(a->sll_protocol),
1159 a->sll_pkttype,
1160 a->sll_hatype,
1161 a->sll_addr,
1162 a->sll_halen);
1163 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001164#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001165
Christian Heimes043d6f62008-01-07 17:19:16 +00001166#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 case AF_TIPC:
1168 {
1169 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1170 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1171 return Py_BuildValue("IIIII",
1172 a->addrtype,
1173 a->addr.nameseq.type,
1174 a->addr.nameseq.lower,
1175 a->addr.nameseq.upper,
1176 a->scope);
1177 } else if (a->addrtype == TIPC_ADDR_NAME) {
1178 return Py_BuildValue("IIIII",
1179 a->addrtype,
1180 a->addr.name.name.type,
1181 a->addr.name.name.instance,
1182 a->addr.name.name.instance,
1183 a->scope);
1184 } else if (a->addrtype == TIPC_ADDR_ID) {
1185 return Py_BuildValue("IIIII",
1186 a->addrtype,
1187 a->addr.id.node,
1188 a->addr.id.ref,
1189 0,
1190 a->scope);
1191 } else {
1192 PyErr_SetString(PyExc_ValueError,
1193 "Invalid address type");
1194 return NULL;
1195 }
1196 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001197#endif
1198
Charles-François Natali30589c92011-10-07 22:47:08 +02001199#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001200 case AF_CAN:
1201 {
1202 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1203 char *ifname = "";
1204 struct ifreq ifr;
1205 /* need to look up interface name given index */
1206 if (a->can_ifindex) {
1207 ifr.ifr_ifindex = a->can_ifindex;
1208 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1209 ifname = ifr.ifr_name;
1210 }
1211
1212 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1213 ifname,
1214 a->can_family);
1215 }
1216#endif
1217
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001218#ifdef PF_SYSTEM
1219 case PF_SYSTEM:
1220 switch(proto) {
1221#ifdef SYSPROTO_CONTROL
1222 case SYSPROTO_CONTROL:
1223 {
1224 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1225 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1226 }
1227#endif
1228 default:
1229 PyErr_SetString(PyExc_ValueError,
1230 "Invalid address type");
1231 return 0;
1232 }
1233#endif
1234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001237 default:
1238 /* If we don't know the address family, don't raise an
1239 exception -- return it as an (int, bytes) tuple. */
1240 return Py_BuildValue("iy#",
1241 addr->sa_family,
1242 addr->sa_data,
1243 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001246}
1247
Guido van Rossum30a685f1991-06-27 15:51:29 +00001248
1249/* Parse a socket address argument according to the socket object's
1250 address family. Return 1 if the address was in the proper format,
1251 0 of not. The address is returned through addr_ret, its length
1252 through len_ret. */
1253
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001254static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001255getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001257{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001258 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001259
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001260#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001261 case AF_UNIX:
1262 {
1263 struct sockaddr_un* addr;
1264 char *path;
1265 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001266 int retval = 0;
1267
1268 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1269 allow embedded nulls on Linux. */
1270 if (PyUnicode_Check(args)) {
1271 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1272 return 0;
1273 }
1274 else
1275 Py_INCREF(args);
1276 if (!PyArg_Parse(args, "y#", &path, &len))
1277 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001279 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001280#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001281 if (len > 0 && path[0] == 0) {
1282 /* Linux abstract namespace extension */
1283 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001284 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001285 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001286 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001287 }
1288 }
1289 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001290#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 {
1292 /* regular NULL-terminated string */
1293 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001294 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001295 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001296 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001297 }
1298 addr->sun_path[len] = 0;
1299 }
1300 addr->sun_family = s->sock_family;
1301 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001302 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001303 retval = 1;
1304 unix_out:
1305 Py_DECREF(args);
1306 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001307 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001308#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001309
Martin v. Löwis11017b12006-01-14 18:12:57 +00001310#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001311 case AF_NETLINK:
1312 {
1313 struct sockaddr_nl* addr;
1314 int pid, groups;
1315 addr = (struct sockaddr_nl *)addr_ret;
1316 if (!PyTuple_Check(args)) {
1317 PyErr_Format(
1318 PyExc_TypeError,
1319 "getsockaddrarg: "
1320 "AF_NETLINK address must be tuple, not %.500s",
1321 Py_TYPE(args)->tp_name);
1322 return 0;
1323 }
1324 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1325 return 0;
1326 addr->nl_family = AF_NETLINK;
1327 addr->nl_pid = pid;
1328 addr->nl_groups = groups;
1329 *len_ret = sizeof(*addr);
1330 return 1;
1331 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001332#endif
1333
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001334#ifdef AF_RDS
1335 case AF_RDS:
1336 /* RDS sockets use sockaddr_in: fall-through */
1337#endif
1338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001339 case AF_INET:
1340 {
1341 struct sockaddr_in* addr;
1342 char *host;
1343 int port, result;
1344 if (!PyTuple_Check(args)) {
1345 PyErr_Format(
1346 PyExc_TypeError,
1347 "getsockaddrarg: "
1348 "AF_INET address must be tuple, not %.500s",
1349 Py_TYPE(args)->tp_name);
1350 return 0;
1351 }
1352 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1353 "idna", &host, &port))
1354 return 0;
1355 addr=(struct sockaddr_in*)addr_ret;
1356 result = setipaddr(host, (struct sockaddr *)addr,
1357 sizeof(*addr), AF_INET);
1358 PyMem_Free(host);
1359 if (result < 0)
1360 return 0;
1361 if (port < 0 || port > 0xffff) {
1362 PyErr_SetString(
1363 PyExc_OverflowError,
1364 "getsockaddrarg: port must be 0-65535.");
1365 return 0;
1366 }
1367 addr->sin_family = AF_INET;
1368 addr->sin_port = htons((short)port);
1369 *len_ret = sizeof *addr;
1370 return 1;
1371 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001373#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 case AF_INET6:
1375 {
1376 struct sockaddr_in6* addr;
1377 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001378 int port, result;
1379 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001380 flowinfo = scope_id = 0;
1381 if (!PyTuple_Check(args)) {
1382 PyErr_Format(
1383 PyExc_TypeError,
1384 "getsockaddrarg: "
1385 "AF_INET6 address must be tuple, not %.500s",
1386 Py_TYPE(args)->tp_name);
1387 return 0;
1388 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001389 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 "idna", &host, &port, &flowinfo,
1391 &scope_id)) {
1392 return 0;
1393 }
1394 addr = (struct sockaddr_in6*)addr_ret;
1395 result = setipaddr(host, (struct sockaddr *)addr,
1396 sizeof(*addr), AF_INET6);
1397 PyMem_Free(host);
1398 if (result < 0)
1399 return 0;
1400 if (port < 0 || port > 0xffff) {
1401 PyErr_SetString(
1402 PyExc_OverflowError,
1403 "getsockaddrarg: port must be 0-65535.");
1404 return 0;
1405 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001406 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001407 PyErr_SetString(
1408 PyExc_OverflowError,
1409 "getsockaddrarg: flowinfo must be 0-1048575.");
1410 return 0;
1411 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 addr->sin6_family = s->sock_family;
1413 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001414 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 addr->sin6_scope_id = scope_id;
1416 *len_ret = sizeof *addr;
1417 return 1;
1418 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001419#endif
1420
Hye-Shik Chang81268602004-02-02 06:05:24 +00001421#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 case AF_BLUETOOTH:
1423 {
1424 switch (s->sock_proto) {
1425 case BTPROTO_L2CAP:
1426 {
1427 struct sockaddr_l2 *addr;
1428 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 addr = (struct sockaddr_l2 *)addr_ret;
1431 memset(addr, 0, sizeof(struct sockaddr_l2));
1432 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1433 if (!PyArg_ParseTuple(args, "si", &straddr,
1434 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001435 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 "wrong format");
1437 return 0;
1438 }
1439 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1440 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 *len_ret = sizeof *addr;
1443 return 1;
1444 }
1445 case BTPROTO_RFCOMM:
1446 {
1447 struct sockaddr_rc *addr;
1448 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 addr = (struct sockaddr_rc *)addr_ret;
1451 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1452 if (!PyArg_ParseTuple(args, "si", &straddr,
1453 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001454 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 "wrong format");
1456 return 0;
1457 }
1458 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1459 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 *len_ret = sizeof *addr;
1462 return 1;
1463 }
1464 case BTPROTO_HCI:
1465 {
1466 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001467#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001468 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001469
Alexander Belopolskye239d232010-12-08 23:31:48 +00001470 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001471 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001472 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001473 "wrong format");
1474 return 0;
1475 }
1476 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1477 return 0;
1478#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1480 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001481 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001482 "wrong format");
1483 return 0;
1484 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 *len_ret = sizeof *addr;
1487 return 1;
1488 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001489#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 case BTPROTO_SCO:
1491 {
1492 struct sockaddr_sco *addr;
1493 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001495 addr = (struct sockaddr_sco *)addr_ret;
1496 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1497 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001498 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 "wrong format");
1500 return 0;
1501 }
1502 straddr = PyBytes_AS_STRING(args);
1503 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1504 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001506 *len_ret = sizeof *addr;
1507 return 1;
1508 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001509#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001511 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 return 0;
1513 }
1514 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001515#endif
1516
Antoine Pitroub156a462010-10-27 20:13:57 +00001517#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 case AF_PACKET:
1519 {
1520 struct sockaddr_ll* addr;
1521 struct ifreq ifr;
1522 char *interfaceName;
1523 int protoNumber;
1524 int hatype = 0;
1525 int pkttype = 0;
1526 char *haddr = NULL;
1527 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 if (!PyTuple_Check(args)) {
1530 PyErr_Format(
1531 PyExc_TypeError,
1532 "getsockaddrarg: "
1533 "AF_PACKET address must be tuple, not %.500s",
1534 Py_TYPE(args)->tp_name);
1535 return 0;
1536 }
1537 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1538 &protoNumber, &pkttype, &hatype,
1539 &haddr, &halen))
1540 return 0;
1541 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1542 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1543 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1544 s->errorhandler();
1545 return 0;
1546 }
1547 if (halen > 8) {
1548 PyErr_SetString(PyExc_ValueError,
1549 "Hardware address must be 8 bytes or less");
1550 return 0;
1551 }
1552 if (protoNumber < 0 || protoNumber > 0xffff) {
1553 PyErr_SetString(
1554 PyExc_OverflowError,
1555 "getsockaddrarg: protoNumber must be 0-65535.");
1556 return 0;
1557 }
1558 addr = (struct sockaddr_ll*)addr_ret;
1559 addr->sll_family = AF_PACKET;
1560 addr->sll_protocol = htons((short)protoNumber);
1561 addr->sll_ifindex = ifr.ifr_ifindex;
1562 addr->sll_pkttype = pkttype;
1563 addr->sll_hatype = hatype;
1564 if (halen != 0) {
1565 memcpy(&addr->sll_addr, haddr, halen);
1566 }
1567 addr->sll_halen = halen;
1568 *len_ret = sizeof *addr;
1569 return 1;
1570 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001571#endif
1572
Christian Heimes043d6f62008-01-07 17:19:16 +00001573#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 case AF_TIPC:
1575 {
1576 unsigned int atype, v1, v2, v3;
1577 unsigned int scope = TIPC_CLUSTER_SCOPE;
1578 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001580 if (!PyTuple_Check(args)) {
1581 PyErr_Format(
1582 PyExc_TypeError,
1583 "getsockaddrarg: "
1584 "AF_TIPC address must be tuple, not %.500s",
1585 Py_TYPE(args)->tp_name);
1586 return 0;
1587 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 if (!PyArg_ParseTuple(args,
1590 "IIII|I;Invalid TIPC address format",
1591 &atype, &v1, &v2, &v3, &scope))
1592 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001593
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001594 addr = (struct sockaddr_tipc *) addr_ret;
1595 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 addr->family = AF_TIPC;
1598 addr->scope = scope;
1599 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001601 if (atype == TIPC_ADDR_NAMESEQ) {
1602 addr->addr.nameseq.type = v1;
1603 addr->addr.nameseq.lower = v2;
1604 addr->addr.nameseq.upper = v3;
1605 } else if (atype == TIPC_ADDR_NAME) {
1606 addr->addr.name.name.type = v1;
1607 addr->addr.name.name.instance = v2;
1608 } else if (atype == TIPC_ADDR_ID) {
1609 addr->addr.id.node = v1;
1610 addr->addr.id.ref = v2;
1611 } else {
1612 /* Shouldn't happen */
1613 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1614 return 0;
1615 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 return 1;
1620 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001621#endif
1622
Charles-François Natali30589c92011-10-07 22:47:08 +02001623#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001624 case AF_CAN:
1625 switch (s->sock_proto) {
1626 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001627 /* fall-through */
1628 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001629 {
1630 struct sockaddr_can *addr;
1631 PyObject *interfaceName;
1632 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001633 Py_ssize_t len;
1634
Benjamin Peterson18b71912013-05-16 15:29:44 -05001635 addr = (struct sockaddr_can *)addr_ret;
1636
Charles-François Natali47413c12011-10-06 19:47:44 +02001637 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1638 &interfaceName))
1639 return 0;
1640
1641 len = PyBytes_GET_SIZE(interfaceName);
1642
1643 if (len == 0) {
1644 ifr.ifr_ifindex = 0;
1645 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001646 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1647 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001648 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1649 s->errorhandler();
1650 Py_DECREF(interfaceName);
1651 return 0;
1652 }
1653 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001654 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001655 "AF_CAN interface name too long");
1656 Py_DECREF(interfaceName);
1657 return 0;
1658 }
1659
1660 addr->can_family = AF_CAN;
1661 addr->can_ifindex = ifr.ifr_ifindex;
1662
1663 *len_ret = sizeof(*addr);
1664 Py_DECREF(interfaceName);
1665 return 1;
1666 }
1667 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001668 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001669 "getsockaddrarg: unsupported CAN protocol");
1670 return 0;
1671 }
1672#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001673
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001674#ifdef PF_SYSTEM
1675 case PF_SYSTEM:
1676 switch (s->sock_proto) {
1677#ifdef SYSPROTO_CONTROL
1678 case SYSPROTO_CONTROL:
1679 {
1680 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001681
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001682 addr = (struct sockaddr_ctl *)addr_ret;
1683 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001684 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001685
1686 if (PyUnicode_Check(args)) {
1687 struct ctl_info info;
1688 PyObject *ctl_name;
1689
1690 if (!PyArg_Parse(args, "O&",
1691 PyUnicode_FSConverter, &ctl_name)) {
1692 return 0;
1693 }
1694
1695 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1696 PyErr_SetString(PyExc_ValueError,
1697 "provided string is too long");
1698 Py_DECREF(ctl_name);
1699 return 0;
1700 }
1701 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1702 sizeof(info.ctl_name));
1703 Py_DECREF(ctl_name);
1704
1705 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1706 PyErr_SetString(PyExc_OSError,
1707 "cannot find kernel control with provided name");
1708 return 0;
1709 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001710
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001711 addr->sc_id = info.ctl_id;
1712 addr->sc_unit = 0;
1713 } else if (!PyArg_ParseTuple(args, "II",
1714 &(addr->sc_id), &(addr->sc_unit))) {
1715 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1716 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001717
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001718 return 0;
1719 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001720
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001721 *len_ret = sizeof(*addr);
1722 return 1;
1723 }
1724#endif
1725 default:
1726 PyErr_SetString(PyExc_OSError,
1727 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1728 return 0;
1729 }
1730#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001732 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001735 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001736 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001738 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001739}
1740
Guido van Rossum30a685f1991-06-27 15:51:29 +00001741
Guido van Rossum48a680c2001-03-02 06:34:14 +00001742/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001743 Return 1 if the family is known, 0 otherwise. The length is returned
1744 through len_ret. */
1745
1746static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001747getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001750
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001751#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 case AF_UNIX:
1753 {
1754 *len_ret = sizeof (struct sockaddr_un);
1755 return 1;
1756 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001757#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001758#if defined(AF_NETLINK)
1759 case AF_NETLINK:
1760 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 *len_ret = sizeof (struct sockaddr_nl);
1762 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001763 }
1764#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001765
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001766#ifdef AF_RDS
1767 case AF_RDS:
1768 /* RDS sockets use sockaddr_in: fall-through */
1769#endif
1770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 case AF_INET:
1772 {
1773 *len_ret = sizeof (struct sockaddr_in);
1774 return 1;
1775 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001776
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001777#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 case AF_INET6:
1779 {
1780 *len_ret = sizeof (struct sockaddr_in6);
1781 return 1;
1782 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001783#endif
1784
Hye-Shik Chang81268602004-02-02 06:05:24 +00001785#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001786 case AF_BLUETOOTH:
1787 {
1788 switch(s->sock_proto)
1789 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 case BTPROTO_L2CAP:
1792 *len_ret = sizeof (struct sockaddr_l2);
1793 return 1;
1794 case BTPROTO_RFCOMM:
1795 *len_ret = sizeof (struct sockaddr_rc);
1796 return 1;
1797 case BTPROTO_HCI:
1798 *len_ret = sizeof (struct sockaddr_hci);
1799 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001800#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 case BTPROTO_SCO:
1802 *len_ret = sizeof (struct sockaddr_sco);
1803 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001806 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 "unknown BT protocol");
1808 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001810 }
1811 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001812#endif
1813
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001814#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001815 case AF_PACKET:
1816 {
1817 *len_ret = sizeof (struct sockaddr_ll);
1818 return 1;
1819 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001820#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001821
Christian Heimes043d6f62008-01-07 17:19:16 +00001822#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001823 case AF_TIPC:
1824 {
1825 *len_ret = sizeof (struct sockaddr_tipc);
1826 return 1;
1827 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001828#endif
1829
Charles-François Natali30589c92011-10-07 22:47:08 +02001830#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001831 case AF_CAN:
1832 {
1833 *len_ret = sizeof (struct sockaddr_can);
1834 return 1;
1835 }
1836#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001837
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001838#ifdef PF_SYSTEM
1839 case PF_SYSTEM:
1840 switch(s->sock_proto) {
1841#ifdef SYSPROTO_CONTROL
1842 case SYSPROTO_CONTROL:
1843 *len_ret = sizeof (struct sockaddr_ctl);
1844 return 1;
1845#endif
1846 default:
1847 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1848 "unknown PF_SYSTEM protocol");
1849 return 0;
1850 }
1851#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001853 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001855 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001856 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001857 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001860}
1861
1862
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001863/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1864 Currently, these methods are only compiled if the RFC 2292/3542
1865 CMSG_LEN() macro is available. Older systems seem to have used
1866 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1867 it may be possible to define CMSG_LEN() that way if it's not
1868 provided. Some architectures might need extra padding after the
1869 cmsghdr, however, and CMSG_LEN() would have to take account of
1870 this. */
1871#ifdef CMSG_LEN
1872/* If length is in range, set *result to CMSG_LEN(length) and return
1873 true; otherwise, return false. */
1874static int
1875get_CMSG_LEN(size_t length, size_t *result)
1876{
1877 size_t tmp;
1878
1879 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1880 return 0;
1881 tmp = CMSG_LEN(length);
1882 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1883 return 0;
1884 *result = tmp;
1885 return 1;
1886}
1887
1888#ifdef CMSG_SPACE
1889/* If length is in range, set *result to CMSG_SPACE(length) and return
1890 true; otherwise, return false. */
1891static int
1892get_CMSG_SPACE(size_t length, size_t *result)
1893{
1894 size_t tmp;
1895
1896 /* Use CMSG_SPACE(1) here in order to take account of the padding
1897 necessary before *and* after the data. */
1898 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1899 return 0;
1900 tmp = CMSG_SPACE(length);
1901 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1902 return 0;
1903 *result = tmp;
1904 return 1;
1905}
1906#endif
1907
1908/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1909 pointer in msg->msg_control with at least "space" bytes after it,
1910 and its cmsg_len member inside the buffer. */
1911static int
1912cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1913{
1914 size_t cmsg_offset;
1915 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1916 sizeof(cmsgh->cmsg_len));
1917
Charles-François Natali466517d2011-08-28 18:23:43 +02001918 /* Note that POSIX allows msg_controllen to be of signed type. */
1919 if (cmsgh == NULL || msg->msg_control == NULL || msg->msg_controllen < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001920 return 0;
1921 if (space < cmsg_len_end)
1922 space = cmsg_len_end;
1923 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1924 return (cmsg_offset <= (size_t)-1 - space &&
1925 cmsg_offset + space <= msg->msg_controllen);
1926}
1927
1928/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1929 *space to number of bytes following it in the buffer and return
1930 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1931 msg->msg_controllen are valid. */
1932static int
1933get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1934{
1935 size_t data_offset;
1936 char *data_ptr;
1937
1938 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1939 return 0;
1940 data_offset = data_ptr - (char *)msg->msg_control;
1941 if (data_offset > msg->msg_controllen)
1942 return 0;
1943 *space = msg->msg_controllen - data_offset;
1944 return 1;
1945}
1946
1947/* If cmsgh is invalid or not contained in the buffer pointed to by
1948 msg->msg_control, return -1. If cmsgh is valid and its associated
1949 data is entirely contained in the buffer, set *data_len to the
1950 length of the associated data and return 0. If only part of the
1951 associated data is contained in the buffer but cmsgh is otherwise
1952 valid, set *data_len to the length contained in the buffer and
1953 return 1. */
1954static int
1955get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1956{
1957 size_t space, cmsg_data_len;
1958
1959 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1960 cmsgh->cmsg_len < CMSG_LEN(0))
1961 return -1;
1962 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1963 if (!get_cmsg_data_space(msg, cmsgh, &space))
1964 return -1;
1965 if (space >= cmsg_data_len) {
1966 *data_len = cmsg_data_len;
1967 return 0;
1968 }
1969 *data_len = space;
1970 return 1;
1971}
1972#endif /* CMSG_LEN */
1973
1974
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001975/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001976
Guido van Rossum73624e91994-10-10 17:59:00 +00001977static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001978sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001979{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001980 sock_addr_t addrbuf;
1981 SOCKET_T newfd = INVALID_SOCKET;
1982 socklen_t addrlen;
1983 PyObject *sock = NULL;
1984 PyObject *addr = NULL;
1985 PyObject *res = NULL;
1986 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001987#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1988 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
1989 static int accept4_works = -1;
1990#endif
1991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 if (!getsockaddrlen(s, &addrlen))
1993 return NULL;
1994 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 if (!IS_SELECTABLE(s))
1997 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001998
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001999 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002001 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002002 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002003 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002004#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2005 if (accept4_works != 0) {
2006 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2007 SOCK_CLOEXEC);
2008 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2009 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2010 accept4_works = (errno != ENOSYS);
2011 }
2012 }
2013 if (accept4_works == 0)
2014 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2015#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002016 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002017#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002018 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002019 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 if (timeout == 1) {
2022 PyErr_SetString(socket_timeout, "timed out");
2023 return NULL;
2024 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002025 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 if (newfd == INVALID_SOCKET)
2028 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002029
Victor Stinnerdaf45552013-08-28 00:53:59 +02002030#ifdef MS_WINDOWS
2031 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2032 PyErr_SetFromWindowsErr(0);
2033 SOCKETCLOSE(newfd);
2034 goto finally;
2035 }
2036#else
2037
2038#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2039 if (!accept4_works)
2040#endif
2041 {
2042 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2043 SOCKETCLOSE(newfd);
2044 goto finally;
2045 }
2046 }
2047#endif
2048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 sock = PyLong_FromSocket_t(newfd);
2050 if (sock == NULL) {
2051 SOCKETCLOSE(newfd);
2052 goto finally;
2053 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002055 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2056 addrlen, s->sock_proto);
2057 if (addr == NULL)
2058 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002060 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002061
Guido van Rossum67f7a382002-06-06 21:08:16 +00002062finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 Py_XDECREF(sock);
2064 Py_XDECREF(addr);
2065 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002066}
2067
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002068PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002069"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002070\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002071Wait for an incoming connection. Return a new socket file descriptor\n\
2072representing the connection, and the address of the client.\n\
2073For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002074
Guido van Rossum11ba0942002-06-13 15:07:44 +00002075/* s.setblocking(flag) method. Argument:
2076 False -- non-blocking mode; same as settimeout(0)
2077 True -- blocking mode; same as settimeout(None)
2078*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002079
Guido van Rossum73624e91994-10-10 17:59:00 +00002080static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002081sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002082{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002083 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002085 block = PyLong_AsLong(arg);
2086 if (block == -1 && PyErr_Occurred())
2087 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002089 s->sock_timeout = block ? -1.0 : 0.0;
2090 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002092 Py_INCREF(Py_None);
2093 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002094}
Guido van Rossume4485b01994-09-07 14:32:49 +00002095
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002096PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002097"setblocking(flag)\n\
2098\n\
2099Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002100setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002101setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002102
Guido van Rossum11ba0942002-06-13 15:07:44 +00002103/* s.settimeout(timeout) method. Argument:
2104 None -- no timeout, blocking mode; same as setblocking(True)
2105 0.0 -- non-blocking mode; same as setblocking(False)
2106 > 0 -- timeout mode; operations time out after timeout seconds
2107 < 0 -- illegal; raises an exception
2108*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002109static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002110sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002114 if (arg == Py_None)
2115 timeout = -1.0;
2116 else {
2117 timeout = PyFloat_AsDouble(arg);
2118 if (timeout < 0.0) {
2119 if (!PyErr_Occurred())
2120 PyErr_SetString(PyExc_ValueError,
2121 "Timeout value out of range");
2122 return NULL;
2123 }
2124 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002126 s->sock_timeout = timeout;
2127 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 Py_INCREF(Py_None);
2130 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002131}
2132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002133PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002134"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002136Set a timeout on socket operations. 'timeout' can be a float,\n\
2137giving in seconds, or None. Setting a timeout of None disables\n\
2138the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002139Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002140
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002141/* s.gettimeout() method.
2142 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002143static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002144sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 if (s->sock_timeout < 0.0) {
2147 Py_INCREF(Py_None);
2148 return Py_None;
2149 }
2150 else
2151 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002152}
2153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002154PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002155"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002156\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002157Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002159operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002160
Guido van Rossumaee08791992-09-08 09:05:33 +00002161/* s.setsockopt() method.
2162 With an integer third argument, sets an integer option.
2163 With a string third argument, sets an option from a buffer;
2164 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002165
Guido van Rossum73624e91994-10-10 17:59:00 +00002166static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002167sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002168{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002169 int level;
2170 int optname;
2171 int res;
2172 char *buf;
2173 int buflen;
2174 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 if (PyArg_ParseTuple(args, "iii:setsockopt",
2177 &level, &optname, &flag)) {
2178 buf = (char *) &flag;
2179 buflen = sizeof flag;
2180 }
2181 else {
2182 PyErr_Clear();
2183 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2184 &level, &optname, &buf, &buflen))
2185 return NULL;
2186 }
2187 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2188 if (res < 0)
2189 return s->errorhandler();
2190 Py_INCREF(Py_None);
2191 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002192}
2193
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002194PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002195"setsockopt(level, option, value)\n\
2196\n\
2197Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002198The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002199
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002200
Guido van Rossumaee08791992-09-08 09:05:33 +00002201/* s.getsockopt() method.
2202 With two arguments, retrieves an integer option.
2203 With a third integer argument, retrieves a string buffer of that size;
2204 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002205
Guido van Rossum73624e91994-10-10 17:59:00 +00002206static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002207sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 int level;
2210 int optname;
2211 int res;
2212 PyObject *buf;
2213 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2216 &level, &optname, &buflen))
2217 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002219 if (buflen == 0) {
2220 int flag = 0;
2221 socklen_t flagsize = sizeof flag;
2222 res = getsockopt(s->sock_fd, level, optname,
2223 (void *)&flag, &flagsize);
2224 if (res < 0)
2225 return s->errorhandler();
2226 return PyLong_FromLong(flag);
2227 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002228#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 /* socklen_t is unsigned so no negative test is needed,
2230 test buflen == 0 is previously done */
2231 if (buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002232#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 if (buflen <= 0 || buflen > 1024) {
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002234#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002235 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 "getsockopt buflen out of range");
2237 return NULL;
2238 }
2239 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2240 if (buf == NULL)
2241 return NULL;
2242 res = getsockopt(s->sock_fd, level, optname,
2243 (void *)PyBytes_AS_STRING(buf), &buflen);
2244 if (res < 0) {
2245 Py_DECREF(buf);
2246 return s->errorhandler();
2247 }
2248 _PyBytes_Resize(&buf, buflen);
2249 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002250}
2251
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002252PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002253"getsockopt(level, option[, buffersize]) -> value\n\
2254\n\
2255Get a socket option. See the Unix manual for level and option.\n\
2256If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002257string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002259
Fred Drake728819a2000-07-01 03:40:12 +00002260/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002261
Guido van Rossum73624e91994-10-10 17:59:00 +00002262static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002263sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002264{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002265 sock_addr_t addrbuf;
2266 int addrlen;
2267 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2270 return NULL;
2271 Py_BEGIN_ALLOW_THREADS
2272 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2273 Py_END_ALLOW_THREADS
2274 if (res < 0)
2275 return s->errorhandler();
2276 Py_INCREF(Py_None);
2277 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002278}
2279
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002280PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002281"bind(address)\n\
2282\n\
2283Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002284pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002285sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002286
Guido van Rossum30a685f1991-06-27 15:51:29 +00002287
2288/* s.close() method.
2289 Set the file descriptor to -1 so operations tried subsequently
2290 will surely fail. */
2291
Guido van Rossum73624e91994-10-10 17:59:00 +00002292static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002293sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if ((fd = s->sock_fd) != -1) {
2298 s->sock_fd = -1;
2299 Py_BEGIN_ALLOW_THREADS
2300 (void) SOCKETCLOSE(fd);
2301 Py_END_ALLOW_THREADS
2302 }
2303 Py_INCREF(Py_None);
2304 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002305}
2306
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002307PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002308"close()\n\
2309\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002310Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002311
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002312static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002313sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002314{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002315 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002316 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002317 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002318}
2319
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002320PyDoc_STRVAR(detach_doc,
2321"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002322\n\
2323Close the socket object without closing the underlying file descriptor.\
2324The object cannot be used after this call, but the file descriptor\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002325can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002326
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002327static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002328internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002329 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002330{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 timeout = 0;
2334 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002335
2336#ifdef MS_WINDOWS
2337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 if (s->sock_timeout > 0.0) {
2339 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2340 IS_SELECTABLE(s)) {
2341 /* This is a mess. Best solution: trust select */
2342 fd_set fds;
2343 fd_set fds_exc;
2344 struct timeval tv;
2345 tv.tv_sec = (int)s->sock_timeout;
2346 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2347 FD_ZERO(&fds);
2348 FD_SET(s->sock_fd, &fds);
2349 FD_ZERO(&fds_exc);
2350 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002351 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2352 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002353 if (res == 0) {
2354 res = WSAEWOULDBLOCK;
2355 timeout = 1;
2356 } else if (res > 0) {
2357 if (FD_ISSET(s->sock_fd, &fds))
2358 /* The socket is in the writable set - this
2359 means connected */
2360 res = 0;
2361 else {
2362 /* As per MS docs, we need to call getsockopt()
2363 to get the underlying error */
2364 int res_size = sizeof res;
2365 /* It must be in the exception set */
2366 assert(FD_ISSET(s->sock_fd, &fds_exc));
2367 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2368 (char *)&res, &res_size))
2369 /* getsockopt also clears WSAGetLastError,
2370 so reset it back. */
2371 WSASetLastError(res);
2372 else
2373 res = WSAGetLastError();
2374 }
2375 }
2376 /* else if (res < 0) an error occurred */
2377 }
2378 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002379
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 if (res < 0)
2381 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002382
2383#else
2384
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 if (s->sock_timeout > 0.0) {
2386 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2387 timeout = internal_select(s, 1);
2388 if (timeout == 0) {
2389 /* Bug #1019808: in case of an EINPROGRESS,
2390 use getsockopt(SO_ERROR) to get the real
2391 error. */
2392 socklen_t res_size = sizeof res;
2393 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2394 SO_ERROR, &res, &res_size);
2395 if (res == EISCONN)
2396 res = 0;
2397 errno = res;
2398 }
2399 else if (timeout == -1) {
2400 res = errno; /* had error */
2401 }
2402 else
2403 res = EWOULDBLOCK; /* timed out */
2404 }
2405 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002407 if (res < 0)
2408 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002409
2410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002411 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002414}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002415
Fred Drake728819a2000-07-01 03:40:12 +00002416/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002417
Guido van Rossum73624e91994-10-10 17:59:00 +00002418static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002419sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002420{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 sock_addr_t addrbuf;
2422 int addrlen;
2423 int res;
2424 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2427 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 Py_BEGIN_ALLOW_THREADS
2430 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2431 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 if (timeout == 1) {
2434 PyErr_SetString(socket_timeout, "timed out");
2435 return NULL;
2436 }
2437 if (res != 0)
2438 return s->errorhandler();
2439 Py_INCREF(Py_None);
2440 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002441}
2442
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002443PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002444"connect(address)\n\
2445\n\
2446Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002447is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002448
Guido van Rossum30a685f1991-06-27 15:51:29 +00002449
Fred Drake728819a2000-07-01 03:40:12 +00002450/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002451
2452static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002453sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002454{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 sock_addr_t addrbuf;
2456 int addrlen;
2457 int res;
2458 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2461 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 Py_BEGIN_ALLOW_THREADS
2464 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2465 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 /* Signals are not errors (though they may raise exceptions). Adapted
2468 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002469#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 if (res == EINTR && PyErr_CheckSignals())
2471 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002472#endif
2473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002475}
2476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002477PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002478"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002479\n\
2480This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002481instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002482
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002483
Guido van Rossumed233a51992-06-23 09:07:03 +00002484/* s.fileno() method */
2485
Guido van Rossum73624e91994-10-10 17:59:00 +00002486static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002487sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002489 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002490}
2491
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002492PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002493"fileno() -> integer\n\
2494\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002495Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002496
Guido van Rossumed233a51992-06-23 09:07:03 +00002497
Guido van Rossumc89705d1992-11-26 08:54:07 +00002498/* s.getsockname() method */
2499
Guido van Rossum73624e91994-10-10 17:59:00 +00002500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002501sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 sock_addr_t addrbuf;
2504 int res;
2505 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002506
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 if (!getsockaddrlen(s, &addrlen))
2508 return NULL;
2509 memset(&addrbuf, 0, addrlen);
2510 Py_BEGIN_ALLOW_THREADS
2511 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2512 Py_END_ALLOW_THREADS
2513 if (res < 0)
2514 return s->errorhandler();
2515 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2516 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002517}
2518
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002520"getsockname() -> address info\n\
2521\n\
2522Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002523info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524
Guido van Rossumc89705d1992-11-26 08:54:07 +00002525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002527/* s.getpeername() method */
2528
Guido van Rossum73624e91994-10-10 17:59:00 +00002529static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002530sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002531{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 sock_addr_t addrbuf;
2533 int res;
2534 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 if (!getsockaddrlen(s, &addrlen))
2537 return NULL;
2538 memset(&addrbuf, 0, addrlen);
2539 Py_BEGIN_ALLOW_THREADS
2540 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2541 Py_END_ALLOW_THREADS
2542 if (res < 0)
2543 return s->errorhandler();
2544 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2545 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002546}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002547
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002549"getpeername() -> address info\n\
2550\n\
2551Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002552info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002553
Guido van Rossumb6775db1994-08-01 11:34:53 +00002554#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002555
2556
Guido van Rossum30a685f1991-06-27 15:51:29 +00002557/* s.listen(n) method */
2558
Guido van Rossum73624e91994-10-10 17:59:00 +00002559static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002560sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 int backlog;
2563 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002564
Serhiy Storchaka78980432013-01-15 01:12:17 +02002565 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 if (backlog == -1 && PyErr_Occurred())
2567 return NULL;
2568 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002569 /* To avoid problems on systems that don't allow a negative backlog
2570 * (which doesn't make sense anyway) we force a minimum value of 0. */
2571 if (backlog < 0)
2572 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 res = listen(s->sock_fd, backlog);
2574 Py_END_ALLOW_THREADS
2575 if (res < 0)
2576 return s->errorhandler();
2577 Py_INCREF(Py_None);
2578 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002579}
2580
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002581PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002582"listen(backlog)\n\
2583\n\
2584Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002585least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2586unaccepted connections that the system will allow before refusing new\n\
2587connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002588
2589
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002591 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002592 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002593 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002594 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002595 * also possible that we return a number of bytes smaller than the request
2596 * bytes.
2597 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002598
Antoine Pitrou19467d22010-08-17 19:33:30 +00002599static Py_ssize_t
2600sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002601{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002602 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002604#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 int remaining;
2606 char *read_buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002607#endif
2608
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 if (!IS_SELECTABLE(s)) {
2610 select_error();
2611 return -1;
2612 }
2613 if (len == 0) {
2614 /* If 0 bytes were requested, do nothing. */
2615 return 0;
2616 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002617
2618#ifndef __VMS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002619 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002621 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002622 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002623#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002624 if (len > INT_MAX)
2625 len = INT_MAX;
2626 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2627#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002628 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002629#endif
2630 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002633 if (timeout == 1) {
2634 PyErr_SetString(socket_timeout, "timed out");
2635 return -1;
2636 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002637 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 if (outlen < 0) {
2639 /* Note: the call to errorhandler() ALWAYS indirectly returned
2640 NULL, so ignore its return value */
2641 s->errorhandler();
2642 return -1;
2643 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002644#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002645 read_buf = cbuf;
2646 remaining = len;
2647 while (remaining != 0) {
2648 unsigned int segment;
2649 int nread = -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002651 segment = remaining /SEGMENT_SIZE;
2652 if (segment != 0) {
2653 segment = SEGMENT_SIZE;
2654 }
2655 else {
2656 segment = remaining;
2657 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002658
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002659 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002661 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 if (!timeout)
2663 nread = recv(s->sock_fd, read_buf, segment, flags);
2664 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002665 if (timeout == 1) {
2666 PyErr_SetString(socket_timeout, "timed out");
2667 return -1;
2668 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002669 END_SELECT_LOOP(s)
2670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 if (nread < 0) {
2672 s->errorhandler();
2673 return -1;
2674 }
2675 if (nread != remaining) {
2676 read_buf += nread;
2677 break;
2678 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002680 remaining -= segment;
2681 read_buf += segment;
2682 }
2683 outlen = read_buf - cbuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002684#endif /* !__VMS */
2685
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002686 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002687}
2688
Guido van Rossum48a680c2001-03-02 06:34:14 +00002689
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002690/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002691
Guido van Rossum73624e91994-10-10 17:59:00 +00002692static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002693sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002694{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002695 Py_ssize_t recvlen, outlen;
2696 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002698
Antoine Pitrou19467d22010-08-17 19:33:30 +00002699 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002702 if (recvlen < 0) {
2703 PyErr_SetString(PyExc_ValueError,
2704 "negative buffersize in recv");
2705 return NULL;
2706 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 /* Allocate a new string. */
2709 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2710 if (buf == NULL)
2711 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002713 /* Call the guts */
2714 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2715 if (outlen < 0) {
2716 /* An error occurred, release the string and return an
2717 error. */
2718 Py_DECREF(buf);
2719 return NULL;
2720 }
2721 if (outlen != recvlen) {
2722 /* We did not read as many bytes as we anticipated, resize the
2723 string if possible and be successful. */
2724 _PyBytes_Resize(&buf, outlen);
2725 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002726
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002727 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002728}
2729
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002730PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002731"recv(buffersize[, flags]) -> data\n\
2732\n\
2733Receive up to buffersize bytes from the socket. For the optional flags\n\
2734argument, see the Unix manual. When no data is available, block until\n\
2735at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002736the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002737
Guido van Rossum30a685f1991-06-27 15:51:29 +00002738
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002739/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002740
Thomas Wouters477c8d52006-05-27 19:21:47 +00002741static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002742sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002745
Antoine Pitrou19467d22010-08-17 19:33:30 +00002746 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 Py_buffer pbuf;
2748 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002749 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002752 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 &pbuf, &recvlen, &flags))
2754 return NULL;
2755 buf = pbuf.buf;
2756 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002758 if (recvlen < 0) {
2759 PyBuffer_Release(&pbuf);
2760 PyErr_SetString(PyExc_ValueError,
2761 "negative buffersize in recv_into");
2762 return NULL;
2763 }
2764 if (recvlen == 0) {
2765 /* If nbytes was not specified, use the buffer's length */
2766 recvlen = buflen;
2767 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 /* Check if the buffer is large enough */
2770 if (buflen < recvlen) {
2771 PyBuffer_Release(&pbuf);
2772 PyErr_SetString(PyExc_ValueError,
2773 "buffer too small for requested bytes");
2774 return NULL;
2775 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 /* Call the guts */
2778 readlen = sock_recv_guts(s, buf, recvlen, flags);
2779 if (readlen < 0) {
2780 /* Return an error. */
2781 PyBuffer_Release(&pbuf);
2782 return NULL;
2783 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 PyBuffer_Release(&pbuf);
2786 /* Return the number of bytes read. Note that we do not do anything
2787 special here in the case that readlen < recvlen. */
2788 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002789}
2790
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002791PyDoc_STRVAR(recv_into_doc,
2792"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002793\n\
2794A version of recv() that stores its data into a buffer rather than creating \n\
2795a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2796is not specified (or 0), receive up to the size available in the given buffer.\n\
2797\n\
2798See recv() for documentation about the flags.");
2799
2800
2801/*
Christian Heimes99170a52007-12-19 02:07:34 +00002802 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2803 * into a char buffer. If you have any inc/def ref to do to the objects that
2804 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002805 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002806 * that it is also possible that we return a number of bytes smaller than the
2807 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808 *
2809 * 'addr' is a return value for the address object. Note that you must decref
2810 * it yourself.
2811 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002812static Py_ssize_t
2813sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002814 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002816 sock_addr_t addrbuf;
2817 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002818 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002822
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002823 if (!getsockaddrlen(s, &addrlen))
2824 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002825
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 if (!IS_SELECTABLE(s)) {
2827 select_error();
2828 return -1;
2829 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002830
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002831 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 Py_BEGIN_ALLOW_THREADS
2833 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002834 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002836#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002837 if (len > INT_MAX)
2838 len = INT_MAX;
2839 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002840 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002841#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 n = recvfrom(s->sock_fd, cbuf, len, flags,
2843 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002845 }
2846 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002848 if (timeout == 1) {
2849 PyErr_SetString(socket_timeout, "timed out");
2850 return -1;
2851 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002852 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002853 if (n < 0) {
2854 s->errorhandler();
2855 return -1;
2856 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2859 addrlen, s->sock_proto)))
2860 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002863}
2864
2865/* s.recvfrom(nbytes [,flags]) method */
2866
2867static PyObject *
2868sock_recvfrom(PySocketSockObject *s, PyObject *args)
2869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002870 PyObject *buf = NULL;
2871 PyObject *addr = NULL;
2872 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002873 int flags = 0;
2874 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002875
Antoine Pitrou19467d22010-08-17 19:33:30 +00002876 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002879 if (recvlen < 0) {
2880 PyErr_SetString(PyExc_ValueError,
2881 "negative buffersize in recvfrom");
2882 return NULL;
2883 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2886 if (buf == NULL)
2887 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002888
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002889 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2890 recvlen, flags, &addr);
2891 if (outlen < 0) {
2892 goto finally;
2893 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002894
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002895 if (outlen != recvlen) {
2896 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002897 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002899 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002900 goto finally;
2901 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002904
2905finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002906 Py_XDECREF(buf);
2907 Py_XDECREF(addr);
2908 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002909}
2910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2913\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002915
Thomas Wouters477c8d52006-05-27 19:21:47 +00002916
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002917/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918
2919static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002920sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002923
Antoine Pitrou19467d22010-08-17 19:33:30 +00002924 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 Py_buffer pbuf;
2926 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002927 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002930
Antoine Pitrou19467d22010-08-17 19:33:30 +00002931 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002932 kwlist, &pbuf,
2933 &recvlen, &flags))
2934 return NULL;
2935 buf = pbuf.buf;
2936 buflen = pbuf.len;
2937 assert(buf != 0 && buflen > 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002938
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002939 if (recvlen < 0) {
2940 PyBuffer_Release(&pbuf);
2941 PyErr_SetString(PyExc_ValueError,
2942 "negative buffersize in recvfrom_into");
2943 return NULL;
2944 }
2945 if (recvlen == 0) {
2946 /* If nbytes was not specified, use the buffer's length */
2947 recvlen = buflen;
2948 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002950 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2951 if (readlen < 0) {
2952 PyBuffer_Release(&pbuf);
2953 /* Return an error */
2954 Py_XDECREF(addr);
2955 return NULL;
2956 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 PyBuffer_Release(&pbuf);
2959 /* Return the number of bytes read and the address. Note that we do
2960 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002961 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002962}
2963
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002964PyDoc_STRVAR(recvfrom_into_doc,
2965"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002966\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002967Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002968
2969
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002970/* The sendmsg() and recvmsg[_into]() methods require a working
2971 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2972#ifdef CMSG_LEN
2973/*
2974 * Call recvmsg() with the supplied iovec structures, flags, and
2975 * ancillary data buffer size (controllen). Returns the tuple return
2976 * value for recvmsg() or recvmsg_into(), with the first item provided
2977 * by the supplied makeval() function. makeval() will be called with
2978 * the length read and makeval_data as arguments, and must return a
2979 * new reference (which will be decrefed if there is a subsequent
2980 * error). On error, closes any file descriptors received via
2981 * SCM_RIGHTS.
2982 */
2983static PyObject *
2984sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2985 int flags, Py_ssize_t controllen,
2986 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2987{
2988 ssize_t bytes_received = -1;
2989 int timeout;
2990 sock_addr_t addrbuf;
2991 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002992 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002993 PyObject *cmsg_list = NULL, *retval = NULL;
2994 void *controlbuf = NULL;
2995 struct cmsghdr *cmsgh;
2996 size_t cmsgdatalen = 0;
2997 int cmsg_status;
2998
2999 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3000 ignored" when the socket is connected (Linux fills them in
3001 anyway for AF_UNIX sockets at least). Normally msg_namelen
3002 seems to be set to 0 if there's no address, but try to
3003 initialize msg_name to something that won't be mistaken for a
3004 real address if that doesn't happen. */
3005 if (!getsockaddrlen(s, &addrbuflen))
3006 return NULL;
3007 memset(&addrbuf, 0, addrbuflen);
3008 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3009
3010 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3011 PyErr_SetString(PyExc_ValueError,
3012 "invalid ancillary data buffer length");
3013 return NULL;
3014 }
3015 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3016 return PyErr_NoMemory();
3017
3018 /* Make the system call. */
3019 if (!IS_SELECTABLE(s)) {
3020 select_error();
3021 goto finally;
3022 }
3023
3024 BEGIN_SELECT_LOOP(s)
3025 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003026 msg.msg_name = SAS2SA(&addrbuf);
3027 msg.msg_namelen = addrbuflen;
3028 msg.msg_iov = iov;
3029 msg.msg_iovlen = iovlen;
3030 msg.msg_control = controlbuf;
3031 msg.msg_controllen = controllen;
3032 timeout = internal_select_ex(s, 0, interval);
3033 if (!timeout)
3034 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3035 Py_END_ALLOW_THREADS;
3036 if (timeout == 1) {
3037 PyErr_SetString(socket_timeout, "timed out");
3038 goto finally;
3039 }
3040 END_SELECT_LOOP(s)
3041
3042 if (bytes_received < 0) {
3043 s->errorhandler();
3044 goto finally;
3045 }
3046
3047 /* Make list of (level, type, data) tuples from control messages. */
3048 if ((cmsg_list = PyList_New(0)) == NULL)
3049 goto err_closefds;
3050 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3051 implementations didn't do so. */
3052 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3053 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3054 PyObject *bytes, *tuple;
3055 int tmp;
3056
3057 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3058 if (cmsg_status != 0) {
3059 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3060 "received malformed or improperly-truncated "
3061 "ancillary data", 1) == -1)
3062 goto err_closefds;
3063 }
3064 if (cmsg_status < 0)
3065 break;
3066 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003067 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003068 goto err_closefds;
3069 }
3070
3071 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3072 cmsgdatalen);
3073 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3074 (int)cmsgh->cmsg_type, bytes);
3075 if (tuple == NULL)
3076 goto err_closefds;
3077 tmp = PyList_Append(cmsg_list, tuple);
3078 Py_DECREF(tuple);
3079 if (tmp != 0)
3080 goto err_closefds;
3081
3082 if (cmsg_status != 0)
3083 break;
3084 }
3085
3086 retval = Py_BuildValue("NOiN",
3087 (*makeval)(bytes_received, makeval_data),
3088 cmsg_list,
3089 (int)msg.msg_flags,
3090 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3091 ((msg.msg_namelen > addrbuflen) ?
3092 addrbuflen : msg.msg_namelen),
3093 s->sock_proto));
3094 if (retval == NULL)
3095 goto err_closefds;
3096
3097finally:
3098 Py_XDECREF(cmsg_list);
3099 PyMem_Free(controlbuf);
3100 return retval;
3101
3102err_closefds:
3103#ifdef SCM_RIGHTS
3104 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3105 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3106 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3107 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3108 if (cmsg_status < 0)
3109 break;
3110 if (cmsgh->cmsg_level == SOL_SOCKET &&
3111 cmsgh->cmsg_type == SCM_RIGHTS) {
3112 size_t numfds;
3113 int *fdp;
3114
3115 numfds = cmsgdatalen / sizeof(int);
3116 fdp = (int *)CMSG_DATA(cmsgh);
3117 while (numfds-- > 0)
3118 close(*fdp++);
3119 }
3120 if (cmsg_status != 0)
3121 break;
3122 }
3123#endif /* SCM_RIGHTS */
3124 goto finally;
3125}
3126
3127
3128static PyObject *
3129makeval_recvmsg(ssize_t received, void *data)
3130{
3131 PyObject **buf = data;
3132
3133 if (received < PyBytes_GET_SIZE(*buf))
3134 _PyBytes_Resize(buf, received);
3135 Py_XINCREF(*buf);
3136 return *buf;
3137}
3138
3139/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3140
3141static PyObject *
3142sock_recvmsg(PySocketSockObject *s, PyObject *args)
3143{
3144 Py_ssize_t bufsize, ancbufsize = 0;
3145 int flags = 0;
3146 struct iovec iov;
3147 PyObject *buf = NULL, *retval = NULL;
3148
3149 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3150 return NULL;
3151
3152 if (bufsize < 0) {
3153 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3154 return NULL;
3155 }
3156 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3157 return NULL;
3158 iov.iov_base = PyBytes_AS_STRING(buf);
3159 iov.iov_len = bufsize;
3160
3161 /* Note that we're passing a pointer to *our pointer* to the bytes
3162 object here (&buf); makeval_recvmsg() may incref the object, or
3163 deallocate it and set our pointer to NULL. */
3164 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3165 &makeval_recvmsg, &buf);
3166 Py_XDECREF(buf);
3167 return retval;
3168}
3169
3170PyDoc_STRVAR(recvmsg_doc,
3171"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3172\n\
3173Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3174socket. The ancbufsize argument sets the size in bytes of the\n\
3175internal buffer used to receive the ancillary data; it defaults to 0,\n\
3176meaning that no ancillary data will be received. Appropriate buffer\n\
3177sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3178CMSG_LEN(), and items which do not fit into the buffer might be\n\
3179truncated or discarded. The flags argument defaults to 0 and has the\n\
3180same meaning as for recv().\n\
3181\n\
3182The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3183The data item is a bytes object holding the non-ancillary data\n\
3184received. The ancdata item is a list of zero or more tuples\n\
3185(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3186(control messages) received: cmsg_level and cmsg_type are integers\n\
3187specifying the protocol level and protocol-specific type respectively,\n\
3188and cmsg_data is a bytes object holding the associated data. The\n\
3189msg_flags item is the bitwise OR of various flags indicating\n\
3190conditions on the received message; see your system documentation for\n\
3191details. If the receiving socket is unconnected, address is the\n\
3192address of the sending socket, if available; otherwise, its value is\n\
3193unspecified.\n\
3194\n\
3195If recvmsg() raises an exception after the system call returns, it\n\
3196will first attempt to close any file descriptors received via the\n\
3197SCM_RIGHTS mechanism.");
3198
3199
3200static PyObject *
3201makeval_recvmsg_into(ssize_t received, void *data)
3202{
3203 return PyLong_FromSsize_t(received);
3204}
3205
3206/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3207
3208static PyObject *
3209sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3210{
3211 Py_ssize_t ancbufsize = 0;
3212 int flags = 0;
3213 struct iovec *iovs = NULL;
3214 Py_ssize_t i, nitems, nbufs = 0;
3215 Py_buffer *bufs = NULL;
3216 PyObject *buffers_arg, *fast, *retval = NULL;
3217
3218 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3219 &buffers_arg, &ancbufsize, &flags))
3220 return NULL;
3221
3222 if ((fast = PySequence_Fast(buffers_arg,
3223 "recvmsg_into() argument 1 must be an "
3224 "iterable")) == NULL)
3225 return NULL;
3226 nitems = PySequence_Fast_GET_SIZE(fast);
3227 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003228 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003229 goto finally;
3230 }
3231
3232 /* Fill in an iovec for each item, and save the Py_buffer
3233 structs to release afterwards. */
3234 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3235 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3236 PyErr_NoMemory();
3237 goto finally;
3238 }
3239 for (; nbufs < nitems; nbufs++) {
3240 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3241 "w*;recvmsg_into() argument 1 must be an iterable "
3242 "of single-segment read-write buffers",
3243 &bufs[nbufs]))
3244 goto finally;
3245 iovs[nbufs].iov_base = bufs[nbufs].buf;
3246 iovs[nbufs].iov_len = bufs[nbufs].len;
3247 }
3248
3249 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3250 &makeval_recvmsg_into, NULL);
3251finally:
3252 for (i = 0; i < nbufs; i++)
3253 PyBuffer_Release(&bufs[i]);
3254 PyMem_Free(bufs);
3255 PyMem_Free(iovs);
3256 Py_DECREF(fast);
3257 return retval;
3258}
3259
3260PyDoc_STRVAR(recvmsg_into_doc,
3261"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3262\n\
3263Receive normal data and ancillary data from the socket, scattering the\n\
3264non-ancillary data into a series of buffers. The buffers argument\n\
3265must be an iterable of objects that export writable buffers\n\
3266(e.g. bytearray objects); these will be filled with successive chunks\n\
3267of the non-ancillary data until it has all been written or there are\n\
3268no more buffers. The ancbufsize argument sets the size in bytes of\n\
3269the internal buffer used to receive the ancillary data; it defaults to\n\
32700, meaning that no ancillary data will be received. Appropriate\n\
3271buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3272or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3273truncated or discarded. The flags argument defaults to 0 and has the\n\
3274same meaning as for recv().\n\
3275\n\
3276The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3277The nbytes item is the total number of bytes of non-ancillary data\n\
3278written into the buffers. The ancdata item is a list of zero or more\n\
3279tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3280data (control messages) received: cmsg_level and cmsg_type are\n\
3281integers specifying the protocol level and protocol-specific type\n\
3282respectively, and cmsg_data is a bytes object holding the associated\n\
3283data. The msg_flags item is the bitwise OR of various flags\n\
3284indicating conditions on the received message; see your system\n\
3285documentation for details. If the receiving socket is unconnected,\n\
3286address is the address of the sending socket, if available; otherwise,\n\
3287its value is unspecified.\n\
3288\n\
3289If recvmsg_into() raises an exception after the system call returns,\n\
3290it will first attempt to close any file descriptors received via the\n\
3291SCM_RIGHTS mechanism.");
3292#endif /* CMSG_LEN */
3293
3294
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003295/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003296
Guido van Rossum73624e91994-10-10 17:59:00 +00003297static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003298sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003300 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003301 Py_ssize_t len, n = -1;
3302 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3306 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003308 if (!IS_SELECTABLE(s)) {
3309 PyBuffer_Release(&pbuf);
3310 return select_error();
3311 }
3312 buf = pbuf.buf;
3313 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003314
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003315 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003316 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003317 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003318 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003319#ifdef __VMS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003320 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003321#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003322 if (len > INT_MAX)
3323 len = INT_MAX;
3324 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003326 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003327#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003328 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003331 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003332 PyErr_SetString(socket_timeout, "timed out");
3333 return NULL;
3334 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003335 END_SELECT_LOOP(s)
3336
3337 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003338 if (n < 0)
3339 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003340 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003341}
3342
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003343PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003344"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003345\n\
3346Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003347argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003348sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003349
3350
3351/* s.sendall(data [,flags]) method */
3352
3353static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003354sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003355{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003357 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003358 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003361 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3362 return NULL;
3363 buf = pbuf.buf;
3364 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003366 if (!IS_SELECTABLE(s)) {
3367 PyBuffer_Release(&pbuf);
3368 return select_error();
3369 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003372 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003373 timeout = internal_select(s, 1);
3374 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003375 if (!timeout) {
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003376#ifdef __VMS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003377 n = sendsegmented(s->sock_fd, buf, len, flags);
Victor Stinner14b9b112013-06-25 00:37:25 +02003378#elif defined(MS_WINDOWS)
Victor Stinner9a644b22013-06-24 23:47:41 +02003379 if (len > INT_MAX)
3380 len = INT_MAX;
3381 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003382#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003383 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003384#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003385 }
3386 Py_END_ALLOW_THREADS
3387 if (timeout == 1) {
3388 PyBuffer_Release(&pbuf);
3389 PyErr_SetString(socket_timeout, "timed out");
3390 return NULL;
3391 }
3392 /* PyErr_CheckSignals() might change errno */
3393 saved_errno = errno;
3394 /* We must run our signal handlers before looping again.
3395 send() can return a successful partial write when it is
3396 interrupted, so we can't restrict ourselves to EINTR. */
3397 if (PyErr_CheckSignals()) {
3398 PyBuffer_Release(&pbuf);
3399 return NULL;
3400 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003401 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003402 /* If interrupted, try again */
3403 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003404 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003405 else
3406 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 }
3408 buf += n;
3409 len -= n;
3410 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003412
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003413 if (n < 0)
3414 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003416 Py_INCREF(Py_None);
3417 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003418}
3419
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003420PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003421"sendall(data[, flags])\n\
3422\n\
3423Send a data string to the socket. For the optional flags\n\
3424argument, see the Unix manual. This calls send() repeatedly\n\
3425until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003426to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003427
Guido van Rossum30a685f1991-06-27 15:51:29 +00003428
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003429/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003430
Guido van Rossum73624e91994-10-10 17:59:00 +00003431static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003432sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003433{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 Py_buffer pbuf;
3435 PyObject *addro;
3436 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003437 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003438 sock_addr_t addrbuf;
3439 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003441 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003442 arglen = PyTuple_Size(args);
3443 switch (arglen) {
3444 case 2:
3445 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3446 break;
3447 case 3:
3448 PyArg_ParseTuple(args, "y*iO:sendto",
3449 &pbuf, &flags, &addro);
3450 break;
3451 default:
3452 PyErr_Format(PyExc_TypeError,
3453 "sendto() takes 2 or 3 arguments (%d given)",
3454 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003455 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003457 if (PyErr_Occurred())
3458 return NULL;
3459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003460 buf = pbuf.buf;
3461 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 if (!IS_SELECTABLE(s)) {
3464 PyBuffer_Release(&pbuf);
3465 return select_error();
3466 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3469 PyBuffer_Release(&pbuf);
3470 return NULL;
3471 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003473 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003475 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003476 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003477#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003478 if (len > INT_MAX)
3479 len = INT_MAX;
3480 n = sendto(s->sock_fd, buf, (int)len, flags,
3481 SAS2SA(&addrbuf), addrlen);
3482#else
3483 n = sendto(s->sock_fd, buf, len, flags,
3484 SAS2SA(&addrbuf), addrlen);
3485#endif
3486 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003488
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003489 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003490 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003491 PyErr_SetString(socket_timeout, "timed out");
3492 return NULL;
3493 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003494 END_SELECT_LOOP(s)
3495 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003496 if (n < 0)
3497 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003498 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003499}
3500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003501PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003502"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003503\n\
3504Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003505For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003506
Guido van Rossum30a685f1991-06-27 15:51:29 +00003507
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003508/* The sendmsg() and recvmsg[_into]() methods require a working
3509 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3510#ifdef CMSG_LEN
3511/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3512
3513static PyObject *
3514sock_sendmsg(PySocketSockObject *s, PyObject *args)
3515{
3516 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3517 Py_buffer *databufs = NULL;
3518 struct iovec *iovs = NULL;
3519 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003520 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003521 struct cmsginfo {
3522 int level;
3523 int type;
3524 Py_buffer data;
3525 } *cmsgs = NULL;
3526 void *controlbuf = NULL;
3527 size_t controllen, controllen_last;
3528 ssize_t bytes_sent = -1;
3529 int addrlen, timeout, flags = 0;
3530 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3531 *cmsg_fast = NULL, *retval = NULL;
3532
3533 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3534 &data_arg, &cmsg_arg, &flags, &addr_arg))
3535 return NULL;
3536
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003537 /* Parse destination address. */
3538 if (addr_arg != NULL && addr_arg != Py_None) {
3539 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3540 goto finally;
3541 msg.msg_name = &addrbuf;
3542 msg.msg_namelen = addrlen;
3543 }
3544
3545 /* Fill in an iovec for each message part, and save the Py_buffer
3546 structs to release afterwards. */
3547 if ((data_fast = PySequence_Fast(data_arg,
3548 "sendmsg() argument 1 must be an "
3549 "iterable")) == NULL)
3550 goto finally;
3551 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3552 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003553 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003554 goto finally;
3555 }
3556 msg.msg_iovlen = ndataparts;
3557 if (ndataparts > 0 &&
3558 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3559 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3560 PyErr_NoMemory();
3561 goto finally;
3562 }
3563 for (; ndatabufs < ndataparts; ndatabufs++) {
3564 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3565 "y*;sendmsg() argument 1 must be an iterable of "
3566 "buffer-compatible objects",
3567 &databufs[ndatabufs]))
3568 goto finally;
3569 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3570 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3571 }
3572
3573 if (cmsg_arg == NULL)
3574 ncmsgs = 0;
3575 else {
3576 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3577 "sendmsg() argument 2 must be an "
3578 "iterable")) == NULL)
3579 goto finally;
3580 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3581 }
3582
3583#ifndef CMSG_SPACE
3584 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003585 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003586 "sending multiple control messages is not supported "
3587 "on this system");
3588 goto finally;
3589 }
3590#endif
3591 /* Save level, type and Py_buffer for each control message,
3592 and calculate total size. */
3593 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3594 PyErr_NoMemory();
3595 goto finally;
3596 }
3597 controllen = controllen_last = 0;
3598 while (ncmsgbufs < ncmsgs) {
3599 size_t bufsize, space;
3600
3601 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3602 "(iiy*):[sendmsg() ancillary data items]",
3603 &cmsgs[ncmsgbufs].level,
3604 &cmsgs[ncmsgbufs].type,
3605 &cmsgs[ncmsgbufs].data))
3606 goto finally;
3607 bufsize = cmsgs[ncmsgbufs++].data.len;
3608
3609#ifdef CMSG_SPACE
3610 if (!get_CMSG_SPACE(bufsize, &space)) {
3611#else
3612 if (!get_CMSG_LEN(bufsize, &space)) {
3613#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003614 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003615 goto finally;
3616 }
3617 controllen += space;
3618 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003619 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003620 goto finally;
3621 }
3622 controllen_last = controllen;
3623 }
3624
3625 /* Construct ancillary data block from control message info. */
3626 if (ncmsgbufs > 0) {
3627 struct cmsghdr *cmsgh = NULL;
3628
3629 if ((msg.msg_control = controlbuf =
3630 PyMem_Malloc(controllen)) == NULL) {
3631 PyErr_NoMemory();
3632 goto finally;
3633 }
3634 msg.msg_controllen = controllen;
3635
3636 /* Need to zero out the buffer as a workaround for glibc's
3637 CMSG_NXTHDR() implementation. After getting the pointer to
3638 the next header, it checks its (uninitialized) cmsg_len
3639 member to see if the "message" fits in the buffer, and
3640 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003641 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003642 memset(controlbuf, 0, controllen);
3643
3644 for (i = 0; i < ncmsgbufs; i++) {
3645 size_t msg_len, data_len = cmsgs[i].data.len;
3646 int enough_space = 0;
3647
3648 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3649 if (cmsgh == NULL) {
3650 PyErr_Format(PyExc_RuntimeError,
3651 "unexpected NULL result from %s()",
3652 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3653 goto finally;
3654 }
3655 if (!get_CMSG_LEN(data_len, &msg_len)) {
3656 PyErr_SetString(PyExc_RuntimeError,
3657 "item size out of range for CMSG_LEN()");
3658 goto finally;
3659 }
3660 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3661 size_t space;
3662
3663 cmsgh->cmsg_len = msg_len;
3664 if (get_cmsg_data_space(&msg, cmsgh, &space))
3665 enough_space = (space >= data_len);
3666 }
3667 if (!enough_space) {
3668 PyErr_SetString(PyExc_RuntimeError,
3669 "ancillary data does not fit in calculated "
3670 "space");
3671 goto finally;
3672 }
3673 cmsgh->cmsg_level = cmsgs[i].level;
3674 cmsgh->cmsg_type = cmsgs[i].type;
3675 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3676 }
3677 }
3678
3679 /* Make the system call. */
3680 if (!IS_SELECTABLE(s)) {
3681 select_error();
3682 goto finally;
3683 }
3684
3685 BEGIN_SELECT_LOOP(s)
3686 Py_BEGIN_ALLOW_THREADS;
3687 timeout = internal_select_ex(s, 1, interval);
3688 if (!timeout)
3689 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3690 Py_END_ALLOW_THREADS;
3691 if (timeout == 1) {
3692 PyErr_SetString(socket_timeout, "timed out");
3693 goto finally;
3694 }
3695 END_SELECT_LOOP(s)
3696
3697 if (bytes_sent < 0) {
3698 s->errorhandler();
3699 goto finally;
3700 }
3701 retval = PyLong_FromSsize_t(bytes_sent);
3702
3703finally:
3704 PyMem_Free(controlbuf);
3705 for (i = 0; i < ncmsgbufs; i++)
3706 PyBuffer_Release(&cmsgs[i].data);
3707 PyMem_Free(cmsgs);
3708 Py_XDECREF(cmsg_fast);
3709 for (i = 0; i < ndatabufs; i++)
3710 PyBuffer_Release(&databufs[i]);
3711 PyMem_Free(databufs);
3712 PyMem_Free(iovs);
3713 Py_XDECREF(data_fast);
3714 return retval;
3715}
3716
3717PyDoc_STRVAR(sendmsg_doc,
3718"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3719\n\
3720Send normal and ancillary data to the socket, gathering the\n\
3721non-ancillary data from a series of buffers and concatenating it into\n\
3722a single message. The buffers argument specifies the non-ancillary\n\
3723data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3724The ancdata argument specifies the ancillary data (control messages)\n\
3725as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3726cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3727protocol level and protocol-specific type respectively, and cmsg_data\n\
3728is a buffer-compatible object holding the associated data. The flags\n\
3729argument defaults to 0 and has the same meaning as for send(). If\n\
3730address is supplied and not None, it sets a destination address for\n\
3731the message. The return value is the number of bytes of non-ancillary\n\
3732data sent.");
3733#endif /* CMSG_LEN */
3734
3735
Guido van Rossum30a685f1991-06-27 15:51:29 +00003736/* s.shutdown(how) method */
3737
Guido van Rossum73624e91994-10-10 17:59:00 +00003738static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003739sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003740{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 int how;
3742 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003743
Serhiy Storchaka78980432013-01-15 01:12:17 +02003744 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003745 if (how == -1 && PyErr_Occurred())
3746 return NULL;
3747 Py_BEGIN_ALLOW_THREADS
3748 res = shutdown(s->sock_fd, how);
3749 Py_END_ALLOW_THREADS
3750 if (res < 0)
3751 return s->errorhandler();
3752 Py_INCREF(Py_None);
3753 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003754}
3755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003756PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003757"shutdown(flag)\n\
3758\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003759Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3760of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003761
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003762#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003763static PyObject*
3764sock_ioctl(PySocketSockObject *s, PyObject *arg)
3765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 unsigned long cmd = SIO_RCVALL;
3767 PyObject *argO;
3768 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003770 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3771 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003773 switch (cmd) {
3774 case SIO_RCVALL: {
3775 unsigned int option = RCVALL_ON;
3776 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3777 return NULL;
3778 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3779 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3780 return set_error();
3781 }
3782 return PyLong_FromUnsignedLong(recv); }
3783 case SIO_KEEPALIVE_VALS: {
3784 struct tcp_keepalive ka;
3785 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3786 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3787 return NULL;
3788 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3789 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3790 return set_error();
3791 }
3792 return PyLong_FromUnsignedLong(recv); }
3793 default:
3794 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3795 return NULL;
3796 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003797}
3798PyDoc_STRVAR(sock_ioctl_doc,
3799"ioctl(cmd, option) -> long\n\
3800\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003801Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3802SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3803SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003804#endif
3805
3806#if defined(MS_WINDOWS)
3807static PyObject*
3808sock_share(PySocketSockObject *s, PyObject *arg)
3809{
3810 WSAPROTOCOL_INFO info;
3811 DWORD processId;
3812 int result;
3813
3814 if (!PyArg_ParseTuple(arg, "I", &processId))
3815 return NULL;
3816
3817 Py_BEGIN_ALLOW_THREADS
3818 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3819 Py_END_ALLOW_THREADS
3820 if (result == SOCKET_ERROR)
3821 return set_error();
3822 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3823}
3824PyDoc_STRVAR(sock_share_doc,
3825"share(process_id) -> bytes\n\
3826\n\
3827Share the socket with another process. The target process id\n\
3828must be provided and the resulting bytes object passed to the target\n\
3829process. There the shared socket can be instantiated by calling\n\
3830socket.fromshare().");
3831
Christian Heimesfaf2f632008-01-06 16:59:19 +00003832
3833#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003834
3835/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003836
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003837static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3839 accept_doc},
3840 {"bind", (PyCFunction)sock_bind, METH_O,
3841 bind_doc},
3842 {"close", (PyCFunction)sock_close, METH_NOARGS,
3843 close_doc},
3844 {"connect", (PyCFunction)sock_connect, METH_O,
3845 connect_doc},
3846 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3847 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003848 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3849 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3851 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003852#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003853 {"getpeername", (PyCFunction)sock_getpeername,
3854 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003856 {"getsockname", (PyCFunction)sock_getsockname,
3857 METH_NOARGS, getsockname_doc},
3858 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3859 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003860#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003861 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3862 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003863#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003864#if defined(MS_WINDOWS)
3865 {"share", (PyCFunction)sock_share, METH_VARARGS,
3866 sock_share_doc},
3867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 {"listen", (PyCFunction)sock_listen, METH_O,
3869 listen_doc},
3870 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3871 recv_doc},
3872 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3873 recv_into_doc},
3874 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3875 recvfrom_doc},
3876 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3877 recvfrom_into_doc},
3878 {"send", (PyCFunction)sock_send, METH_VARARGS,
3879 send_doc},
3880 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3881 sendall_doc},
3882 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3883 sendto_doc},
3884 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3885 setblocking_doc},
3886 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3887 settimeout_doc},
3888 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3889 gettimeout_doc},
3890 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3891 setsockopt_doc},
3892 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3893 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003894#ifdef CMSG_LEN
3895 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3896 recvmsg_doc},
3897 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3898 recvmsg_into_doc,},
3899 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3900 sendmsg_doc},
3901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003902 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003903};
3904
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003905/* SockObject members */
3906static PyMemberDef sock_memberlist[] = {
3907 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3908 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3909 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3910 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3911 {0},
3912};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003913
Guido van Rossum73624e91994-10-10 17:59:00 +00003914/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003915 First close the file description. */
3916
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003917static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003918sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003919{
Antoine Pitroue033e062010-10-29 10:38:18 +00003920 if (s->sock_fd != -1) {
3921 PyObject *exc, *val, *tb;
3922 Py_ssize_t old_refcount = Py_REFCNT(s);
3923 ++Py_REFCNT(s);
3924 PyErr_Fetch(&exc, &val, &tb);
3925 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3926 "unclosed %R", s))
3927 /* Spurious errors can appear at shutdown */
3928 if (PyErr_ExceptionMatches(PyExc_Warning))
3929 PyErr_WriteUnraisable((PyObject *) s);
3930 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003931 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003932 Py_REFCNT(s) = old_refcount;
3933 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003934 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003935}
3936
Guido van Rossum30a685f1991-06-27 15:51:29 +00003937
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003938static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003939sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003940{
Fred Drakea04eaad2000-06-30 02:46:07 +00003941#if SIZEOF_SOCKET_T > SIZEOF_LONG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003942 if (s->sock_fd > LONG_MAX) {
3943 /* this can occur on Win64, and actually there is a special
3944 ugly printf formatter for decimal pointer length integer
3945 printing, only bother if necessary*/
3946 PyErr_SetString(PyExc_OverflowError,
3947 "no printf formatter to display "
3948 "the socket descriptor in decimal");
3949 return NULL;
3950 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003951#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003952 return PyUnicode_FromFormat(
3953 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
3954 (long)s->sock_fd, s->sock_family,
3955 s->sock_type,
3956 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003957}
3958
3959
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003960/* Create a new, uninitialized socket object. */
3961
3962static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003963sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 new = type->tp_alloc(type, 0);
3968 if (new != NULL) {
3969 ((PySocketSockObject *)new)->sock_fd = -1;
3970 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3971 ((PySocketSockObject *)new)->errorhandler = &set_error;
3972 }
3973 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003974}
3975
3976
3977/* Initialize a new socket object. */
3978
Victor Stinnerdaf45552013-08-28 00:53:59 +02003979#ifdef SOCK_CLOEXEC
3980/* socket() and socketpair() fail with EINVAL on Linux kernel older
3981 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3982static int sock_cloexec_works = -1;
3983#endif
3984
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003985/*ARGSUSED*/
3986static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003987sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 PySocketSockObject *s = (PySocketSockObject *)self;
3990 PyObject *fdobj = NULL;
3991 SOCKET_T fd = INVALID_SOCKET;
3992 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3993 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003994#ifndef MS_WINDOWS
3995#ifdef SOCK_CLOEXEC
3996 int *atomic_flag_works = &sock_cloexec_works;
3997#else
3998 int *atomic_flag_works = NULL;
3999#endif
4000#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004002 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4003 "|iiiO:socket", keywords,
4004 &family, &type, &proto, &fdobj))
4005 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004006
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004007 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004008#ifdef MS_WINDOWS
4009 /* recreate a socket that was duplicated */
4010 if (PyBytes_Check(fdobj)) {
4011 WSAPROTOCOL_INFO info;
4012 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4013 PyErr_Format(PyExc_ValueError,
4014 "socket descriptor string has wrong size, "
4015 "should be %zu bytes.", sizeof(info));
4016 return -1;
4017 }
4018 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4019 Py_BEGIN_ALLOW_THREADS
4020 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4021 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4022 Py_END_ALLOW_THREADS
4023 if (fd == INVALID_SOCKET) {
4024 set_error();
4025 return -1;
4026 }
4027 family = info.iAddressFamily;
4028 type = info.iSocketType;
4029 proto = info.iProtocol;
4030 }
4031 else
4032#endif
4033 {
4034 fd = PyLong_AsSocket_t(fdobj);
4035 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4036 return -1;
4037 if (fd == INVALID_SOCKET) {
4038 PyErr_SetString(PyExc_ValueError,
4039 "can't use invalid socket value");
4040 return -1;
4041 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004042 }
4043 }
4044 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004045#ifdef MS_WINDOWS
4046 /* Windows implementation */
4047#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4048#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4049#endif
4050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004052 if (support_wsa_no_inherit) {
4053 fd = WSASocket(family, type, proto,
4054 NULL, 0,
4055 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4056 if (fd == INVALID_SOCKET) {
4057 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4058 support_wsa_no_inherit = 0;
4059 fd = socket(family, type, proto);
4060 }
4061 }
4062 else {
4063 fd = socket(family, type, proto);
4064 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004067 if (fd == INVALID_SOCKET) {
4068 set_error();
4069 return -1;
4070 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004071
4072 if (!support_wsa_no_inherit) {
4073 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4074 closesocket(fd);
4075 PyErr_SetFromWindowsErr(0);
4076 return -1;
4077 }
4078 }
4079#else
4080 /* UNIX */
4081 Py_BEGIN_ALLOW_THREADS
4082#ifdef SOCK_CLOEXEC
4083 if (sock_cloexec_works != 0) {
4084 fd = socket(family, type | SOCK_CLOEXEC, proto);
4085 if (sock_cloexec_works == -1) {
4086 if (fd >= 0) {
4087 sock_cloexec_works = 1;
4088 }
4089 else if (errno == EINVAL) {
4090 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4091 sock_cloexec_works = 0;
4092 fd = socket(family, type, proto);
4093 }
4094 }
4095 }
4096 else
4097#endif
4098 {
4099 fd = socket(family, type, proto);
4100 }
4101 Py_END_ALLOW_THREADS
4102
4103 if (fd == INVALID_SOCKET) {
4104 set_error();
4105 return -1;
4106 }
4107
4108 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4109 SOCKETCLOSE(fd);
4110 return -1;
4111 }
4112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 }
4114 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004117
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004118}
4119
4120
Guido van Rossumb6775db1994-08-01 11:34:53 +00004121/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004122
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004123static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4125 "_socket.socket", /* tp_name */
4126 sizeof(PySocketSockObject), /* tp_basicsize */
4127 0, /* tp_itemsize */
4128 (destructor)sock_dealloc, /* tp_dealloc */
4129 0, /* tp_print */
4130 0, /* tp_getattr */
4131 0, /* tp_setattr */
4132 0, /* tp_reserved */
4133 (reprfunc)sock_repr, /* tp_repr */
4134 0, /* tp_as_number */
4135 0, /* tp_as_sequence */
4136 0, /* tp_as_mapping */
4137 0, /* tp_hash */
4138 0, /* tp_call */
4139 0, /* tp_str */
4140 PyObject_GenericGetAttr, /* tp_getattro */
4141 0, /* tp_setattro */
4142 0, /* tp_as_buffer */
4143 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4144 sock_doc, /* tp_doc */
4145 0, /* tp_traverse */
4146 0, /* tp_clear */
4147 0, /* tp_richcompare */
4148 0, /* tp_weaklistoffset */
4149 0, /* tp_iter */
4150 0, /* tp_iternext */
4151 sock_methods, /* tp_methods */
4152 sock_memberlist, /* tp_members */
4153 0, /* tp_getset */
4154 0, /* tp_base */
4155 0, /* tp_dict */
4156 0, /* tp_descr_get */
4157 0, /* tp_descr_set */
4158 0, /* tp_dictoffset */
4159 sock_initobj, /* tp_init */
4160 PyType_GenericAlloc, /* tp_alloc */
4161 sock_new, /* tp_new */
4162 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004163};
4164
Guido van Rossum30a685f1991-06-27 15:51:29 +00004165
Guido van Rossum81194471991-07-27 21:42:02 +00004166/* Python interface to gethostname(). */
4167
4168/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004169static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004170socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004171{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004172#ifdef MS_WINDOWS
4173 /* Don't use winsock's gethostname, as this returns the ANSI
4174 version of the hostname, whereas we need a Unicode string.
4175 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004176 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004177 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004178 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004179 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004180
4181 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004182 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004183
4184 if (GetLastError() != ERROR_MORE_DATA)
4185 return PyErr_SetFromWindowsErr(0);
4186
4187 if (size == 0)
4188 return PyUnicode_New(0, 0);
4189
4190 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4191 names */
4192 name = PyMem_Malloc(size * sizeof(wchar_t));
4193 if (!name)
4194 return NULL;
4195 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4196 name,
4197 &size))
4198 {
4199 PyMem_Free(name);
4200 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004201 }
Victor Stinner74168972011-11-17 01:11:36 +01004202
4203 result = PyUnicode_FromWideChar(name, size);
4204 PyMem_Free(name);
4205 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004206#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 char buf[1024];
4208 int res;
4209 Py_BEGIN_ALLOW_THREADS
4210 res = gethostname(buf, (int) sizeof buf - 1);
4211 Py_END_ALLOW_THREADS
4212 if (res < 0)
4213 return set_error();
4214 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004215 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004216#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004217}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004219PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004220"gethostname() -> string\n\
4221\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004222Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004223
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004224#ifdef HAVE_SETHOSTNAME
4225PyDoc_STRVAR(sethostname_doc,
4226"sethostname(name)\n\n\
4227Sets the hostname to name.");
4228
4229static PyObject *
4230socket_sethostname(PyObject *self, PyObject *args)
4231{
4232 PyObject *hnobj;
4233 Py_buffer buf;
4234 int res, flag = 0;
4235
Christian Heimesd2774c72013-06-19 02:06:29 +02004236#ifdef _AIX
4237/* issue #18259, not declared in any useful header file */
4238extern int sethostname(const char *, size_t);
4239#endif
4240
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004241 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4242 PyErr_Clear();
4243 if (!PyArg_ParseTuple(args, "O&:sethostname",
4244 PyUnicode_FSConverter, &hnobj))
4245 return NULL;
4246 flag = 1;
4247 }
4248 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4249 if (!res) {
4250 res = sethostname(buf.buf, buf.len);
4251 PyBuffer_Release(&buf);
4252 }
4253 if (flag)
4254 Py_DECREF(hnobj);
4255 if (res)
4256 return set_error();
4257 Py_RETURN_NONE;
4258}
4259#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004260
Guido van Rossum30a685f1991-06-27 15:51:29 +00004261/* Python interface to gethostbyname(name). */
4262
4263/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004264static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004265socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004266{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 char *name;
4268 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004269 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004270
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004271 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004272 return NULL;
4273 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004274 goto finally;
4275 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4276finally:
4277 PyMem_Free(name);
4278 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004279}
4280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004281PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004282"gethostbyname(host) -> address\n\
4283\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004284Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004285
4286
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004287/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4288
4289static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004290gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 char **pch;
4293 PyObject *rtn_tuple = (PyObject *)NULL;
4294 PyObject *name_list = (PyObject *)NULL;
4295 PyObject *addr_list = (PyObject *)NULL;
4296 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 if (h == NULL) {
4299 /* Let's get real error message to return */
4300 set_herror(h_errno);
4301 return NULL;
4302 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004303
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004304 if (h->h_addrtype != af) {
4305 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004306 errno = EAFNOSUPPORT;
4307 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 return NULL;
4309 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004313 case AF_INET:
4314 if (alen < sizeof(struct sockaddr_in))
4315 return NULL;
4316 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004317
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004318#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 case AF_INET6:
4320 if (alen < sizeof(struct sockaddr_in6))
4321 return NULL;
4322 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004323#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004326
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004327 if ((name_list = PyList_New(0)) == NULL)
4328 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 if ((addr_list = PyList_New(0)) == NULL)
4331 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004332
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 /* SF #1511317: h_aliases can be NULL */
4334 if (h->h_aliases) {
4335 for (pch = h->h_aliases; *pch != NULL; pch++) {
4336 int status;
4337 tmp = PyUnicode_FromString(*pch);
4338 if (tmp == NULL)
4339 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 status = PyList_Append(name_list, tmp);
4342 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 if (status)
4345 goto err;
4346 }
4347 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4350 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004354 case AF_INET:
4355 {
4356 struct sockaddr_in sin;
4357 memset(&sin, 0, sizeof(sin));
4358 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004359#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004361#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004362 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4363 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 if (pch == h->h_addr_list && alen >= sizeof(sin))
4366 memcpy((char *) addr, &sin, sizeof(sin));
4367 break;
4368 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004369
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004370#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004371 case AF_INET6:
4372 {
4373 struct sockaddr_in6 sin6;
4374 memset(&sin6, 0, sizeof(sin6));
4375 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004376#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004377 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004379 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4380 tmp = makeipaddr((struct sockaddr *)&sin6,
4381 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004382
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4384 memcpy((char *) addr, &sin6, sizeof(sin6));
4385 break;
4386 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004387#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004390 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 "unsupported address family");
4392 return NULL;
4393 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004395 if (tmp == NULL)
4396 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 status = PyList_Append(addr_list, tmp);
4399 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 if (status)
4402 goto err;
4403 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004405 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004406
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004407 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 Py_XDECREF(name_list);
4409 Py_XDECREF(addr_list);
4410 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004411}
4412
4413
4414/* Python interface to gethostbyname_ex(name). */
4415
4416/*ARGSUSED*/
4417static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004418socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 char *name;
4421 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004422 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004424 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004425#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004427#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004429#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 char buf[16384];
4431 int buf_len = (sizeof buf) - 1;
4432 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004433#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004434#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004436#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004437#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004438
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004439 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004440 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004441 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004442 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004444#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004445#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004446 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004448#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004450#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004451 memset((void *) &data, '\0', sizeof(data));
4452 result = gethostbyname_r(name, &hp_allocated, &data);
4453 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004454#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004455#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004456#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004460#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 Py_END_ALLOW_THREADS
4462 /* Some C libraries would require addr.__ss_family instead of
4463 addr.ss_family.
4464 Therefore, we cast the sockaddr_storage into sockaddr to
4465 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004466 sa = SAS2SA(&addr);
4467 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004469#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004471#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004472finally:
4473 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004475}
4476
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004477PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004478"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4479\n\
4480Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004481for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004482
4483
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004484/* Python interface to gethostbyaddr(IP). */
4485
4486/*ARGSUSED*/
4487static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004488socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004489{
Charles-François Natali8b759652011-12-23 16:44:51 +01004490 sock_addr_t addr;
4491 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004492 char *ip_num;
4493 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004494 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004495#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004497#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004499#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 /* glibcs up to 2.10 assume that the buf argument to
4501 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4502 does not ensure. The attribute below instructs the compiler
4503 to maintain this alignment. */
4504 char buf[16384] Py_ALIGNED(8);
4505 int buf_len = (sizeof buf) - 1;
4506 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004507#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004508#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004509 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004510#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004511#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004512 char *ap;
4513 int al;
4514 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004515
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004516 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 return NULL;
4518 af = AF_UNSPEC;
4519 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004520 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004521 af = sa->sa_family;
4522 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004523 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 switch (af) {
4525 case AF_INET:
4526 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4527 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4528 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004529#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 case AF_INET6:
4531 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4532 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4533 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004534#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004536 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004537 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 }
4539 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004540#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004541#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004542 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 &hp_allocated, buf, buf_len,
4544 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004545#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 h = gethostbyaddr_r(ap, al, af,
4547 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004548#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 memset((void *) &data, '\0', sizeof(data));
4550 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4551 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004552#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004553#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004554#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004558#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004560 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004561#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004563#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004564finally:
4565 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004567}
4568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004569PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004570"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4571\n\
4572Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004573for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004574
Guido van Rossum30a685f1991-06-27 15:51:29 +00004575
4576/* Python interface to getservbyname(name).
4577 This only returns the port number, since the other info is already
4578 known or not useful (like the list of aliases). */
4579
4580/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004581static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004582socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 char *name, *proto=NULL;
4585 struct servent *sp;
4586 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4587 return NULL;
4588 Py_BEGIN_ALLOW_THREADS
4589 sp = getservbyname(name, proto);
4590 Py_END_ALLOW_THREADS
4591 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004592 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 return NULL;
4594 }
4595 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004596}
4597
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004598PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004599"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004600\n\
4601Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004602The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4603otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004604
Guido van Rossum30a685f1991-06-27 15:51:29 +00004605
Barry Warsaw11b91a02004-06-28 00:50:43 +00004606/* Python interface to getservbyport(port).
4607 This only returns the service name, since the other info is already
4608 known or not useful (like the list of aliases). */
4609
4610/*ARGSUSED*/
4611static PyObject *
4612socket_getservbyport(PyObject *self, PyObject *args)
4613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 int port;
4615 char *proto=NULL;
4616 struct servent *sp;
4617 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4618 return NULL;
4619 if (port < 0 || port > 0xffff) {
4620 PyErr_SetString(
4621 PyExc_OverflowError,
4622 "getservbyport: port must be 0-65535.");
4623 return NULL;
4624 }
4625 Py_BEGIN_ALLOW_THREADS
4626 sp = getservbyport(htons((short)port), proto);
4627 Py_END_ALLOW_THREADS
4628 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004629 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 return NULL;
4631 }
4632 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004633}
4634
4635PyDoc_STRVAR(getservbyport_doc,
4636"getservbyport(port[, protocolname]) -> string\n\
4637\n\
4638Return the service name from a port number and protocol name.\n\
4639The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4640otherwise any protocol will match.");
4641
Guido van Rossum3901d851996-12-19 16:35:04 +00004642/* Python interface to getprotobyname(name).
4643 This only returns the protocol number, since the other info is
4644 already known or not useful (like the list of aliases). */
4645
4646/*ARGSUSED*/
4647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004648socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 char *name;
4651 struct protoent *sp;
4652 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4653 return NULL;
4654 Py_BEGIN_ALLOW_THREADS
4655 sp = getprotobyname(name);
4656 Py_END_ALLOW_THREADS
4657 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004658 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 return NULL;
4660 }
4661 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004662}
4663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004664PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004665"getprotobyname(name) -> integer\n\
4666\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004667Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004668
Guido van Rossum3901d851996-12-19 16:35:04 +00004669
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004670#ifndef NO_DUP
4671/* dup() function for socket fds */
4672
4673static PyObject *
4674socket_dup(PyObject *self, PyObject *fdobj)
4675{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 SOCKET_T fd, newfd;
4677 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004678#ifdef MS_WINDOWS
4679 WSAPROTOCOL_INFO info;
4680#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 fd = PyLong_AsSocket_t(fdobj);
4683 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4684 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004685
Victor Stinnerdaf45552013-08-28 00:53:59 +02004686#ifdef MS_WINDOWS
4687 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4688 return set_error();
4689
4690 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4691 FROM_PROTOCOL_INFO,
4692 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 if (newfd == INVALID_SOCKET)
4694 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004695
Victor Stinnerdaf45552013-08-28 00:53:59 +02004696 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4697 closesocket(newfd);
4698 PyErr_SetFromWindowsErr(0);
4699 return NULL;
4700 }
4701#else
4702 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4703 newfd = _Py_dup(fd);
4704 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004705 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004706#endif
4707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 newfdobj = PyLong_FromSocket_t(newfd);
4709 if (newfdobj == NULL)
4710 SOCKETCLOSE(newfd);
4711 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004712}
4713
4714PyDoc_STRVAR(dup_doc,
4715"dup(integer) -> integer\n\
4716\n\
4717Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4718sockets; on some platforms os.dup() won't work for socket file descriptors.");
4719#endif
4720
4721
Dave Cole331708b2004-08-09 04:51:41 +00004722#ifdef HAVE_SOCKETPAIR
4723/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004724 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004725 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004726
4727/*ARGSUSED*/
4728static PyObject *
4729socket_socketpair(PyObject *self, PyObject *args)
4730{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 PySocketSockObject *s0 = NULL, *s1 = NULL;
4732 SOCKET_T sv[2];
4733 int family, type = SOCK_STREAM, proto = 0;
4734 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004735#ifdef SOCK_CLOEXEC
4736 int *atomic_flag_works = &sock_cloexec_works;
4737#else
4738 int *atomic_flag_works = NULL;
4739#endif
4740 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004741
4742#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004744#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4748 &family, &type, &proto))
4749 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004751 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004752 Py_BEGIN_ALLOW_THREADS
4753#ifdef SOCK_CLOEXEC
4754 if (sock_cloexec_works != 0) {
4755 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4756 if (sock_cloexec_works == -1) {
4757 if (ret >= 0) {
4758 sock_cloexec_works = 1;
4759 }
4760 else if (errno == EINVAL) {
4761 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4762 sock_cloexec_works = 0;
4763 ret = socketpair(family, type, proto, sv);
4764 }
4765 }
4766 }
4767 else
4768#endif
4769 {
4770 ret = socketpair(family, type, proto, sv);
4771 }
4772 Py_END_ALLOW_THREADS
4773
4774 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004775 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004776
4777 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4778 goto finally;
4779 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4780 goto finally;
4781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 s0 = new_sockobject(sv[0], family, type, proto);
4783 if (s0 == NULL)
4784 goto finally;
4785 s1 = new_sockobject(sv[1], family, type, proto);
4786 if (s1 == NULL)
4787 goto finally;
4788 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004789
4790finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004791 if (res == NULL) {
4792 if (s0 == NULL)
4793 SOCKETCLOSE(sv[0]);
4794 if (s1 == NULL)
4795 SOCKETCLOSE(sv[1]);
4796 }
4797 Py_XDECREF(s0);
4798 Py_XDECREF(s1);
4799 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004800}
4801
4802PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004803"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004804\n\
4805Create a pair of socket objects from the sockets returned by the platform\n\
4806socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004807The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004808AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004809
4810#endif /* HAVE_SOCKETPAIR */
4811
4812
Guido van Rossum006bf911996-06-12 04:04:55 +00004813static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004814socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004815{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004816 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4819 return NULL;
4820 }
4821 if (x1 < 0) {
4822 PyErr_SetString(PyExc_OverflowError,
4823 "can't convert negative number to unsigned long");
4824 return NULL;
4825 }
4826 x2 = (unsigned int)ntohs((unsigned short)x1);
4827 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004828}
4829
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004830PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004831"ntohs(integer) -> integer\n\
4832\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004833Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004834
4835
Guido van Rossum006bf911996-06-12 04:04:55 +00004836static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004837socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004838{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004839 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004841 if (PyLong_Check(arg)) {
4842 x = PyLong_AsUnsignedLong(arg);
4843 if (x == (unsigned long) -1 && PyErr_Occurred())
4844 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004845#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004846 {
4847 unsigned long y;
4848 /* only want the trailing 32 bits */
4849 y = x & 0xFFFFFFFFUL;
4850 if (y ^ x)
4851 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004852 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 x = y;
4854 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 }
4857 else
4858 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004859 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004860 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004861 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004862}
4863
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004864PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004865"ntohl(integer) -> integer\n\
4866\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004867Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004868
4869
Guido van Rossum006bf911996-06-12 04:04:55 +00004870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004871socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004875 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4876 return NULL;
4877 }
4878 if (x1 < 0) {
4879 PyErr_SetString(PyExc_OverflowError,
4880 "can't convert negative number to unsigned long");
4881 return NULL;
4882 }
4883 x2 = (unsigned int)htons((unsigned short)x1);
4884 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004885}
4886
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004887PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004888"htons(integer) -> integer\n\
4889\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004890Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004891
4892
Guido van Rossum006bf911996-06-12 04:04:55 +00004893static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004894socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004895{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004896 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 if (PyLong_Check(arg)) {
4899 x = PyLong_AsUnsignedLong(arg);
4900 if (x == (unsigned long) -1 && PyErr_Occurred())
4901 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004902#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 {
4904 unsigned long y;
4905 /* only want the trailing 32 bits */
4906 y = x & 0xFFFFFFFFUL;
4907 if (y ^ x)
4908 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004909 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 x = y;
4911 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 }
4914 else
4915 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004916 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004917 Py_TYPE(arg)->tp_name);
4918 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004919}
4920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004921PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004922"htonl(integer) -> integer\n\
4923\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004924Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004925
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004926/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004927
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004928PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004929"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004930\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004931Convert 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 +00004932binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004933
4934static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004935socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004936{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004937#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004939#endif
4940
4941#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004942#if (SIZEOF_INT != 4)
4943#error "Not sure if in_addr_t exists and int is not 32-bits."
4944#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 /* Have to use inet_addr() instead */
4946 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004950 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4951 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004952
Tim Peters1df9fdd2003-02-13 03:13:40 +00004953
4954#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004955
4956#ifdef USE_INET_ATON_WEAKLINK
4957 if (inet_aton != NULL) {
4958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 if (inet_aton(ip_addr, &buf))
4960 return PyBytes_FromStringAndSize((char *)(&buf),
4961 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004962
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004963 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 "illegal IP address string passed to inet_aton");
4965 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004966
Thomas Wouters477c8d52006-05-27 19:21:47 +00004967#ifdef USE_INET_ATON_WEAKLINK
4968 } else {
4969#endif
4970
4971#endif
4972
4973#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 /* special-case this address as inet_addr might return INADDR_NONE
4976 * for this */
4977 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004978 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004982
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004984 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004985 "illegal IP address string passed to inet_aton");
4986 return NULL;
4987 }
4988 }
4989 return PyBytes_FromStringAndSize((char *) &packed_addr,
4990 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004991
4992#ifdef USE_INET_ATON_WEAKLINK
4993 }
4994#endif
4995
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004996#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004997}
4998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004999PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005000"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005001\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005002Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005003
5004static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005005socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 char *packed_str;
5008 int addr_len;
5009 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005011 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
5012 return NULL;
5013 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005016 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 "packed IP wrong length for inet_ntoa");
5018 return NULL;
5019 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005023 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005024}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005025
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005026#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005027
5028PyDoc_STRVAR(inet_pton_doc,
5029"inet_pton(af, ip) -> packed IP address string\n\
5030\n\
5031Convert an IP address from string format to a packed string suitable\n\
5032for use with low-level network functions.");
5033
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005034#endif
5035
5036#ifdef HAVE_INET_PTON
5037
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005038static PyObject *
5039socket_inet_pton(PyObject *self, PyObject *args)
5040{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005041 int af;
5042 char* ip;
5043 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005044#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005045 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005046#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005047 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005049 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5050 return NULL;
5051 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005052
Martin v. Löwis04697e82004-06-02 12:35:29 +00005053#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005054 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005055 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 "can't use AF_INET6, IPv6 is disabled");
5057 return NULL;
5058 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005059#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005061 retval = inet_pton(af, ip, packed);
5062 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005063 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 return NULL;
5065 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005066 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 "illegal IP address string passed to inet_pton");
5068 return NULL;
5069 } else if (af == AF_INET) {
5070 return PyBytes_FromStringAndSize(packed,
5071 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005072#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 } else if (af == AF_INET6) {
5074 return PyBytes_FromStringAndSize(packed,
5075 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005076#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005078 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005079 return NULL;
5080 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005081}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005082#elif defined(MS_WINDOWS)
5083
5084static PyObject *
5085socket_inet_pton(PyObject *self, PyObject *args)
5086{
5087 int af;
5088 char* ip;
5089 struct sockaddr_in6 addr;
5090 INT ret, size;
5091
5092 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5093 return NULL;
5094 }
5095
Victor Stinnere990c6e2013-11-16 00:18:58 +01005096 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005097 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5098
5099 if (ret) {
5100 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5101 return NULL;
5102 } else if(af == AF_INET) {
5103 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005104 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005105 sizeof(addr4->sin_addr));
5106 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005107 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005108 sizeof(addr.sin6_addr));
5109 } else {
5110 PyErr_SetString(PyExc_OSError, "unknown address family");
5111 return NULL;
5112 }
5113}
5114
5115#endif
5116
5117#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005118
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005119PyDoc_STRVAR(inet_ntop_doc,
5120"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5121\n\
5122Convert a packed IP address of the given family to string format.");
5123
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005124#endif
5125
5126
5127#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005128static PyObject *
5129socket_inet_ntop(PyObject *self, PyObject *args)
5130{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 int af;
5132 char* packed;
5133 int len;
5134 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005135#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005136 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005137#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005139#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5142 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5145 return NULL;
5146 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005147
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 if (af == AF_INET) {
5149 if (len != sizeof(struct in_addr)) {
5150 PyErr_SetString(PyExc_ValueError,
5151 "invalid length of packed IP address string");
5152 return NULL;
5153 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005154#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 } else if (af == AF_INET6) {
5156 if (len != sizeof(struct in6_addr)) {
5157 PyErr_SetString(PyExc_ValueError,
5158 "invalid length of packed IP address string");
5159 return NULL;
5160 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 } else {
5163 PyErr_Format(PyExc_ValueError,
5164 "unknown address family %d", af);
5165 return NULL;
5166 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 retval = inet_ntop(af, packed, ip, sizeof(ip));
5169 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005170 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 return NULL;
5172 } else {
5173 return PyUnicode_FromString(retval);
5174 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 /* NOTREACHED */
5177 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5178 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005179}
5180
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005181#elif defined(MS_WINDOWS)
5182
5183static PyObject *
5184socket_inet_ntop(PyObject *self, PyObject *args)
5185{
5186 int af;
5187 char* packed;
5188 int len;
5189 struct sockaddr_in6 addr;
5190 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005191#ifdef ENABLE_IPV6
5192 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5193#else
5194 char ip[INET_ADDRSTRLEN + 1];
5195#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005196
5197 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5198 memset((void *) &ip[0], '\0', sizeof(ip));
5199
5200 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5201 return NULL;
5202 }
5203
5204 if (af == AF_INET) {
5205 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5206
5207 if (len != sizeof(struct in_addr)) {
5208 PyErr_SetString(PyExc_ValueError,
5209 "invalid length of packed IP address string");
5210 return NULL;
5211 }
5212 memset(addr4, 0, sizeof(struct sockaddr_in));
5213 addr4->sin_family = AF_INET;
5214 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5215 addrlen = sizeof(struct sockaddr_in);
5216 } else if (af == AF_INET6) {
5217 if (len != sizeof(struct in6_addr)) {
5218 PyErr_SetString(PyExc_ValueError,
5219 "invalid length of packed IP address string");
5220 return NULL;
5221 }
5222
5223 memset(&addr, 0, sizeof(addr));
5224 addr.sin6_family = AF_INET6;
5225 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5226 addrlen = sizeof(addr);
5227 } else {
5228 PyErr_Format(PyExc_ValueError,
5229 "unknown address family %d", af);
5230 return NULL;
5231 }
5232
5233 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005234 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005235 ip, &retlen);
5236
5237 if (ret) {
5238 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5239 return NULL;
5240 } else {
5241 return PyUnicode_FromString(ip);
5242 }
5243}
5244
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005245#endif /* HAVE_INET_PTON */
5246
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005247/* Python interface to getaddrinfo(host, port). */
5248
5249/*ARGSUSED*/
5250static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005251socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005252{
Victor Stinner77af1722011-05-26 14:05:59 +02005253 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005254 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 struct addrinfo hints, *res;
5256 struct addrinfo *res0 = NULL;
5257 PyObject *hobj = NULL;
5258 PyObject *pobj = (PyObject *)NULL;
5259 char pbuf[30];
5260 char *hptr, *pptr;
5261 int family, socktype, protocol, flags;
5262 int error;
5263 PyObject *all = (PyObject *)NULL;
5264 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005265
Georg Brandl6083a4b2013-10-14 06:51:46 +02005266 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005268 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005269 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 &protocol, &flags)) {
5271 return NULL;
5272 }
5273 if (hobj == Py_None) {
5274 hptr = NULL;
5275 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005276 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005277
5278 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 if (!idna)
5280 return NULL;
5281 assert(PyBytes_Check(idna));
5282 hptr = PyBytes_AS_STRING(idna);
5283 } else if (PyBytes_Check(hobj)) {
5284 hptr = PyBytes_AsString(hobj);
5285 } else {
5286 PyErr_SetString(PyExc_TypeError,
5287 "getaddrinfo() argument 1 must be string or None");
5288 return NULL;
5289 }
5290 if (PyLong_CheckExact(pobj)) {
5291 long value = PyLong_AsLong(pobj);
5292 if (value == -1 && PyErr_Occurred())
5293 goto err;
5294 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5295 pptr = pbuf;
5296 } else if (PyUnicode_Check(pobj)) {
5297 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005298 if (pptr == NULL)
5299 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005301 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 } else if (pobj == Py_None) {
5303 pptr = (char *)NULL;
5304 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005305 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 goto err;
5307 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005308#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005309 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5310 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
5311 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5312 * This workaround avoids a segfault in libsystem.
5313 */
5314 pptr = "00";
5315 }
5316#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 memset(&hints, 0, sizeof(hints));
5318 hints.ai_family = family;
5319 hints.ai_socktype = socktype;
5320 hints.ai_protocol = protocol;
5321 hints.ai_flags = flags;
5322 Py_BEGIN_ALLOW_THREADS
5323 ACQUIRE_GETADDRINFO_LOCK
5324 error = getaddrinfo(hptr, pptr, &hints, &res0);
5325 Py_END_ALLOW_THREADS
5326 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5327 if (error) {
5328 set_gaierror(error);
5329 goto err;
5330 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 if ((all = PyList_New(0)) == NULL)
5333 goto err;
5334 for (res = res0; res; res = res->ai_next) {
5335 PyObject *single;
5336 PyObject *addr =
5337 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5338 if (addr == NULL)
5339 goto err;
5340 single = Py_BuildValue("iiisO", res->ai_family,
5341 res->ai_socktype, res->ai_protocol,
5342 res->ai_canonname ? res->ai_canonname : "",
5343 addr);
5344 Py_DECREF(addr);
5345 if (single == NULL)
5346 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 if (PyList_Append(all, single))
5349 goto err;
5350 Py_XDECREF(single);
5351 }
5352 Py_XDECREF(idna);
5353 if (res0)
5354 freeaddrinfo(res0);
5355 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005356 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 Py_XDECREF(all);
5358 Py_XDECREF(idna);
5359 if (res0)
5360 freeaddrinfo(res0);
5361 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005362}
5363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005364PyDoc_STRVAR(getaddrinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005365"getaddrinfo(host, port [, family, socktype, proto, flags])\n\
5366 -> list of (family, socktype, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005367\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005368Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005369
5370/* Python interface to getnameinfo(sa, flags). */
5371
5372/*ARGSUSED*/
5373static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005374socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 PyObject *sa = (PyObject *)NULL;
5377 int flags;
5378 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005379 int port;
5380 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5382 struct addrinfo hints, *res = NULL;
5383 int error;
5384 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 flags = flowinfo = scope_id = 0;
5387 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5388 return NULL;
5389 if (!PyTuple_Check(sa)) {
5390 PyErr_SetString(PyExc_TypeError,
5391 "getnameinfo() argument 1 must be a tuple");
5392 return NULL;
5393 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005394 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 &hostp, &port, &flowinfo, &scope_id))
5396 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005397 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005398 PyErr_SetString(PyExc_OverflowError,
5399 "getsockaddrarg: flowinfo must be 0-1048575.");
5400 return NULL;
5401 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5403 memset(&hints, 0, sizeof(hints));
5404 hints.ai_family = AF_UNSPEC;
5405 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005406 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005407 Py_BEGIN_ALLOW_THREADS
5408 ACQUIRE_GETADDRINFO_LOCK
5409 error = getaddrinfo(hostp, pbuf, &hints, &res);
5410 Py_END_ALLOW_THREADS
5411 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5412 if (error) {
5413 set_gaierror(error);
5414 goto fail;
5415 }
5416 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005417 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005418 "sockaddr resolved to multiple addresses");
5419 goto fail;
5420 }
5421 switch (res->ai_family) {
5422 case AF_INET:
5423 {
5424 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005425 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 "IPv4 sockaddr must be 2 tuple");
5427 goto fail;
5428 }
5429 break;
5430 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005431#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 case AF_INET6:
5433 {
5434 struct sockaddr_in6 *sin6;
5435 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005436 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 sin6->sin6_scope_id = scope_id;
5438 break;
5439 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005441 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005442 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5444 if (error) {
5445 set_gaierror(error);
5446 goto fail;
5447 }
5448 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005449
5450fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005451 if (res)
5452 freeaddrinfo(res);
5453 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005454}
5455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005456PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005457"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005458\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005459Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005460
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005461
5462/* Python API to getting and setting the default timeout value. */
5463
5464static PyObject *
5465socket_getdefaulttimeout(PyObject *self)
5466{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 if (defaulttimeout < 0.0) {
5468 Py_INCREF(Py_None);
5469 return Py_None;
5470 }
5471 else
5472 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005473}
5474
5475PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005476"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005477\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005478Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005479A value of None indicates that new socket objects have no timeout.\n\
5480When the socket module is first imported, the default is None.");
5481
5482static PyObject *
5483socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5484{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005485 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005487 if (arg == Py_None)
5488 timeout = -1.0;
5489 else {
5490 timeout = PyFloat_AsDouble(arg);
5491 if (timeout < 0.0) {
5492 if (!PyErr_Occurred())
5493 PyErr_SetString(PyExc_ValueError,
5494 "Timeout value out of range");
5495 return NULL;
5496 }
5497 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 Py_INCREF(Py_None);
5502 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005503}
5504
5505PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005506"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005507\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005508Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005509A value of None indicates that new socket objects have no timeout.\n\
5510When the socket module is first imported, the default is None.");
5511
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005512#ifdef HAVE_IF_NAMEINDEX
5513/* Python API for getting interface indices and names */
5514
5515static PyObject *
5516socket_if_nameindex(PyObject *self, PyObject *arg)
5517{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005518 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005519 int i;
5520 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005521
Charles-François Natali60713592011-05-20 16:55:06 +02005522 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005523 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005524 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005525 return NULL;
5526 }
5527
5528 list = PyList_New(0);
5529 if (list == NULL) {
5530 if_freenameindex(ni);
5531 return NULL;
5532 }
5533
Charles-François Natali60713592011-05-20 16:55:06 +02005534 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5535 PyObject *ni_tuple = Py_BuildValue("IO&",
5536 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005537
5538 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5539 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005540 Py_DECREF(list);
5541 if_freenameindex(ni);
5542 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005543 }
5544 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005545 }
5546
5547 if_freenameindex(ni);
5548 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005549}
5550
5551PyDoc_STRVAR(if_nameindex_doc,
5552"if_nameindex()\n\
5553\n\
5554Returns a list of network interface information (index, name) tuples.");
5555
Charles-François Natali60713592011-05-20 16:55:06 +02005556static PyObject *
5557socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005558{
Charles-François Natali60713592011-05-20 16:55:06 +02005559 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005560 unsigned long index;
5561
Charles-François Natali60713592011-05-20 16:55:06 +02005562 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5563 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005564 return NULL;
5565
Charles-François Natali60713592011-05-20 16:55:06 +02005566 index = if_nametoindex(PyBytes_AS_STRING(oname));
5567 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005568 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005569 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005570 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005571 return NULL;
5572 }
5573
5574 return PyLong_FromUnsignedLong(index);
5575}
5576
5577PyDoc_STRVAR(if_nametoindex_doc,
5578"if_nametoindex(if_name)\n\
5579\n\
5580Returns the interface index corresponding to the interface name if_name.");
5581
Charles-François Natali60713592011-05-20 16:55:06 +02005582static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005583socket_if_indextoname(PyObject *self, PyObject *arg)
5584{
Charles-François Natali60713592011-05-20 16:55:06 +02005585 unsigned long index;
5586 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005587
Charles-François Natali60713592011-05-20 16:55:06 +02005588 index = PyLong_AsUnsignedLong(arg);
5589 if (index == (unsigned long) -1)
5590 return NULL;
5591
5592 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005593 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005594 return NULL;
5595 }
5596
Charles-François Natali60713592011-05-20 16:55:06 +02005597 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005598}
5599
5600PyDoc_STRVAR(if_indextoname_doc,
5601"if_indextoname(if_index)\n\
5602\n\
5603Returns the interface name corresponding to the interface index if_index.");
5604
5605#endif /* HAVE_IF_NAMEINDEX */
5606
5607
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005608#ifdef CMSG_LEN
5609/* Python interface to CMSG_LEN(length). */
5610
5611static PyObject *
5612socket_CMSG_LEN(PyObject *self, PyObject *args)
5613{
5614 Py_ssize_t length;
5615 size_t result;
5616
5617 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5618 return NULL;
5619 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5620 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5621 return NULL;
5622 }
5623 return PyLong_FromSize_t(result);
5624}
5625
5626PyDoc_STRVAR(CMSG_LEN_doc,
5627"CMSG_LEN(length) -> control message length\n\
5628\n\
5629Return the total length, without trailing padding, of an ancillary\n\
5630data item with associated data of the given length. This value can\n\
5631often be used as the buffer size for recvmsg() to receive a single\n\
5632item of ancillary data, but RFC 3542 requires portable applications to\n\
5633use CMSG_SPACE() and thus include space for padding, even when the\n\
5634item will be the last in the buffer. Raises OverflowError if length\n\
5635is outside the permissible range of values.");
5636
5637
5638#ifdef CMSG_SPACE
5639/* Python interface to CMSG_SPACE(length). */
5640
5641static PyObject *
5642socket_CMSG_SPACE(PyObject *self, PyObject *args)
5643{
5644 Py_ssize_t length;
5645 size_t result;
5646
5647 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5648 return NULL;
5649 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5650 PyErr_SetString(PyExc_OverflowError,
5651 "CMSG_SPACE() argument out of range");
5652 return NULL;
5653 }
5654 return PyLong_FromSize_t(result);
5655}
5656
5657PyDoc_STRVAR(CMSG_SPACE_doc,
5658"CMSG_SPACE(length) -> buffer size\n\
5659\n\
5660Return the buffer size needed for recvmsg() to receive an ancillary\n\
5661data item with associated data of the given length, along with any\n\
5662trailing padding. The buffer space needed to receive multiple items\n\
5663is the sum of the CMSG_SPACE() values for their associated data\n\
5664lengths. Raises OverflowError if length is outside the permissible\n\
5665range of values.");
5666#endif /* CMSG_SPACE */
5667#endif /* CMSG_LEN */
5668
5669
Guido van Rossum30a685f1991-06-27 15:51:29 +00005670/* List of functions exported by this module. */
5671
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005672static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 {"gethostbyname", socket_gethostbyname,
5674 METH_VARARGS, gethostbyname_doc},
5675 {"gethostbyname_ex", socket_gethostbyname_ex,
5676 METH_VARARGS, ghbn_ex_doc},
5677 {"gethostbyaddr", socket_gethostbyaddr,
5678 METH_VARARGS, gethostbyaddr_doc},
5679 {"gethostname", socket_gethostname,
5680 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005681#ifdef HAVE_SETHOSTNAME
5682 {"sethostname", socket_sethostname,
5683 METH_VARARGS, sethostname_doc},
5684#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 {"getservbyname", socket_getservbyname,
5686 METH_VARARGS, getservbyname_doc},
5687 {"getservbyport", socket_getservbyport,
5688 METH_VARARGS, getservbyport_doc},
5689 {"getprotobyname", socket_getprotobyname,
5690 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005691#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 {"dup", socket_dup,
5693 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005694#endif
Dave Cole331708b2004-08-09 04:51:41 +00005695#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 {"socketpair", socket_socketpair,
5697 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 {"ntohs", socket_ntohs,
5700 METH_VARARGS, ntohs_doc},
5701 {"ntohl", socket_ntohl,
5702 METH_O, ntohl_doc},
5703 {"htons", socket_htons,
5704 METH_VARARGS, htons_doc},
5705 {"htonl", socket_htonl,
5706 METH_O, htonl_doc},
5707 {"inet_aton", socket_inet_aton,
5708 METH_VARARGS, inet_aton_doc},
5709 {"inet_ntoa", socket_inet_ntoa,
5710 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005711#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 {"inet_pton", socket_inet_pton,
5713 METH_VARARGS, inet_pton_doc},
5714 {"inet_ntop", socket_inet_ntop,
5715 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005716#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005717 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5718 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005719 {"getnameinfo", socket_getnameinfo,
5720 METH_VARARGS, getnameinfo_doc},
5721 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5722 METH_NOARGS, getdefaulttimeout_doc},
5723 {"setdefaulttimeout", socket_setdefaulttimeout,
5724 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005725#ifdef HAVE_IF_NAMEINDEX
5726 {"if_nameindex", socket_if_nameindex,
5727 METH_NOARGS, if_nameindex_doc},
5728 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005729 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005730 {"if_indextoname", socket_if_indextoname,
5731 METH_O, if_indextoname_doc},
5732#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005733#ifdef CMSG_LEN
5734 {"CMSG_LEN", socket_CMSG_LEN,
5735 METH_VARARGS, CMSG_LEN_doc},
5736#ifdef CMSG_SPACE
5737 {"CMSG_SPACE", socket_CMSG_SPACE,
5738 METH_VARARGS, CMSG_SPACE_doc},
5739#endif
5740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005741 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005742};
5743
Guido van Rossum30a685f1991-06-27 15:51:29 +00005744
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005745#ifdef MS_WINDOWS
5746#define OS_INIT_DEFINED
5747
5748/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005749
5750static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005751os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005753 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005754}
5755
5756static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005757os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005759 WSADATA WSAData;
5760 int ret;
5761 ret = WSAStartup(0x0101, &WSAData);
5762 switch (ret) {
5763 case 0: /* No error */
5764 Py_AtExit(os_cleanup);
5765 return 1; /* Success */
5766 case WSASYSNOTREADY:
5767 PyErr_SetString(PyExc_ImportError,
5768 "WSAStartup failed: network not ready");
5769 break;
5770 case WSAVERNOTSUPPORTED:
5771 case WSAEINVAL:
5772 PyErr_SetString(
5773 PyExc_ImportError,
5774 "WSAStartup failed: requested version not supported");
5775 break;
5776 default:
5777 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5778 break;
5779 }
5780 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005781}
5782
Guido van Rossum8d665e61996-06-26 18:22:49 +00005783#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005784
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005785
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005786
5787#ifndef OS_INIT_DEFINED
5788static int
5789os_init(void)
5790{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005792}
5793#endif
5794
5795
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005796/* C API table - always add new things to the end for binary
5797 compatibility. */
5798static
5799PySocketModule_APIObject PySocketModuleAPI =
5800{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005801 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005802 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005803 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005804};
5805
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005806
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005807/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005808
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005809 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005810 "socket.py" which implements some additional functionality.
5811 The import of "_socket" may fail with an ImportError exception if
5812 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005813 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005814 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005815*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005816
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005817PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005818"Implementation module for socket operations.\n\
5819\n\
5820See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005821
Martin v. Löwis1a214512008-06-11 05:26:20 +00005822static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005823 PyModuleDef_HEAD_INIT,
5824 PySocket_MODULE_NAME,
5825 socket_doc,
5826 -1,
5827 socket_methods,
5828 NULL,
5829 NULL,
5830 NULL,
5831 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005832};
5833
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005834PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005835PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005836{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005837 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005839 if (!os_init())
5840 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005841
Victor Stinnerdaf45552013-08-28 00:53:59 +02005842#ifdef MS_WINDOWS
5843 if (support_wsa_no_inherit == -1) {
5844 DWORD version = GetVersion();
5845 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5846 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5847 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5848 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5849 }
5850#endif
5851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005852 Py_TYPE(&sock_type) = &PyType_Type;
5853 m = PyModule_Create(&socketmodule);
5854 if (m == NULL)
5855 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005856
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005857 Py_INCREF(PyExc_OSError);
5858 PySocketModuleAPI.error = PyExc_OSError;
5859 Py_INCREF(PyExc_OSError);
5860 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005862 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 if (socket_herror == NULL)
5864 return NULL;
5865 Py_INCREF(socket_herror);
5866 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005867 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005868 NULL);
5869 if (socket_gaierror == NULL)
5870 return NULL;
5871 Py_INCREF(socket_gaierror);
5872 PyModule_AddObject(m, "gaierror", socket_gaierror);
5873 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005874 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 if (socket_timeout == NULL)
5876 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005877 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 Py_INCREF(socket_timeout);
5879 PyModule_AddObject(m, "timeout", socket_timeout);
5880 Py_INCREF((PyObject *)&sock_type);
5881 if (PyModule_AddObject(m, "SocketType",
5882 (PyObject *)&sock_type) != 0)
5883 return NULL;
5884 Py_INCREF((PyObject *)&sock_type);
5885 if (PyModule_AddObject(m, "socket",
5886 (PyObject *)&sock_type) != 0)
5887 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005888
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005889#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005890 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005891#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 Py_INCREF(has_ipv6);
5895 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 /* Export C API */
5898 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5899 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5900 ) != 0)
5901 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005903 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005904#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005905 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005906#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005907 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005908#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005909 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005910#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005911#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005912 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005913#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005914#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005916 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005917#endif
5918#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005919 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005920#endif
5921#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005923 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005924#endif
5925#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005927 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005928#endif
5929#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005931 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005932#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005933#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005934 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005935 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005936#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005937#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005938 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005939 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005940#endif
5941#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005943 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005944#endif
5945#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005946 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005947#endif
5948#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005949 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005950 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005951#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005952#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005953 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005954 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005955#endif
5956#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005958 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005959#endif
5960#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005962 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005963#endif
5964#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005965 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005966 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005967#endif
5968#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005969 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005970 PyModule_AddIntMacro(m, AF_NETLINK);
5971 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005972#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005973 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005974#endif
5975#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005976 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005977#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005978 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5979 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005980#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005982#endif
5983#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005984 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005985#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005986#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005987 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005988#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005989#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005990 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005991#endif
5992#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005993 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005994#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005995 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005996#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005997 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005998#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005999#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006000 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006001#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006002#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006003#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006005 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006006#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006007#ifdef AF_LINK
6008 PyModule_AddIntMacro(m, AF_LINK);
6009#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006010#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006011 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006012 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006013#endif
6014#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006016 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006017#endif
6018#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006019 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006020 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006021#endif
6022#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006024 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006025#endif
6026#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006027 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006028 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006029#endif
6030#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006031 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006032 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006033#endif
6034#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006036 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006037#endif
6038#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006040 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006041#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006042
Hye-Shik Chang81268602004-02-02 06:05:24 +00006043#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006044 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6045 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6046 PyModule_AddIntMacro(m, BTPROTO_HCI);
6047 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006048#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006049 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006050#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006051#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006052#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006053 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006054#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006055 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6056 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006057#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006058 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6060 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006061#endif
6062
Charles-François Natali47413c12011-10-06 19:47:44 +02006063#ifdef AF_CAN
6064 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006065 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006066#endif
6067#ifdef PF_CAN
6068 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006069 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006070#endif
6071
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006072/* Reliable Datagram Sockets */
6073#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006075#endif
6076#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006077 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006078#endif
6079
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006080/* Kernel event messages */
6081#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006082 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006083#endif
6084#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006085 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006086#endif
6087
Antoine Pitroub156a462010-10-27 20:13:57 +00006088#ifdef AF_PACKET
6089 PyModule_AddIntMacro(m, AF_PACKET);
6090#endif
6091#ifdef PF_PACKET
6092 PyModule_AddIntMacro(m, PF_PACKET);
6093#endif
6094#ifdef PACKET_HOST
6095 PyModule_AddIntMacro(m, PACKET_HOST);
6096#endif
6097#ifdef PACKET_BROADCAST
6098 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6099#endif
6100#ifdef PACKET_MULTICAST
6101 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6102#endif
6103#ifdef PACKET_OTHERHOST
6104 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6105#endif
6106#ifdef PACKET_OUTGOING
6107 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6108#endif
6109#ifdef PACKET_LOOPBACK
6110 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6111#endif
6112#ifdef PACKET_FASTROUTE
6113 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006114#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006115
Christian Heimes043d6f62008-01-07 17:19:16 +00006116#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006117 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006120 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6121 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6122 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006123
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006124 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6125 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6126 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006129 PyModule_AddIntMacro(m, SOL_TIPC);
6130 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6131 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6132 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6133 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006134
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006135 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6136 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6137 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6138 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006141 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6142 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006143#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006146#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006147 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6148 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6149 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6150 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6151 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6152 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006153#endif
6154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006156 PyModule_AddIntMacro(m, SOCK_STREAM);
6157 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006158/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006159 PyModule_AddIntMacro(m, SOCK_RAW);
6160 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006161#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006163#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006164#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006165 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006166#endif
6167#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006168 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006169#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006173#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006179#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006180#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006182#endif
6183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006188 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006194 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006200 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006212 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006215 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006221 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006224 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006227 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006231#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006232#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006234#endif
6235#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006236 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006237#endif
6238#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006239 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006240#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006241#ifdef SO_BINDTODEVICE
6242 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6243#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 /* Maximum number of connections for "listen" */
6246#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006248#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006250#endif
6251
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006252 /* Ancilliary message types */
6253#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006254 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006255#endif
6256#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006258#endif
6259#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006261#endif
6262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 /* Flags for send, recv */
6264#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006266#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006268 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006269#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006274 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006277 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006293#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006294#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006295 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006296#endif
6297#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006299#endif
6300#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006302#endif
6303#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006305#endif
6306#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006307 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006308#endif
6309#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006311#endif
6312#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006314#endif
6315#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006317#endif
6318#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006319 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006320#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006321#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006322 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006323#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325 /* Protocol level and numbers, usable for [gs]etsockopt */
6326#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006327 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006328#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006329#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006330 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006331#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006332 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006351#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006353#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006354#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006355 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006356#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006358#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006359#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006361#endif
6362#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006363 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6364 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006365#endif
6366#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006367 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6368 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6369 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006370
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006371 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6372 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6373 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006374#endif
6375#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6377 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6378 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6379 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006380#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006381#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006383 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6384 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6385 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6386 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6387 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6388 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6389 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6390 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6391 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6392 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6393 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6394 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6395#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006396#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006398#endif
6399#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006401#endif
6402#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006404#endif
6405#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006407#endif
6408#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006410#endif
6411#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006413#endif
6414#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006419#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006426 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006427#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006434 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006437 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006440 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006443 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006446 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006447#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006458#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006463#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006465 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006468 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006477 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006483 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006492 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006518#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006520#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006521#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006526#endif
6527/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006530#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006531 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006535#endif
6536
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006537#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006539#endif
6540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006541 /* Some port configuration */
6542#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006544#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006546#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006548 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006549#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006550 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
6552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553 /* Some reserved IP v.4 addresses */
6554#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006556#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006561#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006566#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006571#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef INADDR_ALLHOSTS_GROUP
6575 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6576 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006581 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006582#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006583 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006587#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006589#endif
6590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 /* IPv4 [gs]etsockopt options */
6592#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006597#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006639#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006640#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006642#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6645#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006650#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006664#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006666#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006668#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006670#endif
6671#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006673#endif
6674#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006676#endif
6677#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006679#endif
6680#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006682#endif
6683#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006685#endif
6686#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006688#endif
6689#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006691#endif
6692#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006694#endif
6695#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006697#endif
6698#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006700#endif
6701#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006703#endif
6704#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006706#endif
6707#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006709#endif
6710#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006712#endif
6713#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006715#endif
6716#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006718#endif
6719#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006721#endif
6722#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006723 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006724#endif
6725#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006727#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006728
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006729 /* TCP options */
6730#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006765#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006766#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006768#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 /* IPX options */
6771#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006773#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006774
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006775/* Reliable Datagram Sockets */
6776#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006778#endif
6779#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006780 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006781#endif
6782#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006784#endif
6785#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006787#endif
6788#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006790#endif
6791#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006793#endif
6794#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006796#endif
6797#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006799#endif
6800#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006802#endif
6803#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006805#endif
6806#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006808#endif
6809#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006811#endif
6812
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006814#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006815 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006816#endif
6817#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006818 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006819#endif
6820#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006821 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006822#endif
6823#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006825#endif
6826#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006828#endif
6829#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006831#endif
6832#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006834#endif
6835#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006837#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006838#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006840#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006841#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006843#endif
6844#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006846#endif
6847#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006849#endif
6850#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006852#endif
6853#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006855#endif
6856#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006858#endif
6859#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006861#endif
6862#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006864#endif
6865#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006867#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006868#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006870#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006871#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006873#endif
6874#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006876#endif
6877#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006879#endif
6880#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006882#endif
6883#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006885#endif
6886#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006888#endif
6889#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006891#endif
6892#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006894#endif
6895#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006897#endif
6898#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006900#endif
6901#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006903#endif
6904#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006906#endif
6907#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006909#endif
6910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006911 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006912#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006914#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006915 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006916#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006918#endif
6919#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006921#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006923#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006924 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006925#endif
6926#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006928#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006930#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006931 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006932#endif
6933
Christian Heimesfaf2f632008-01-06 16:59:19 +00006934#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935 {
6936 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6937 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6938 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006939 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006940 PyObject *tmp;
6941 tmp = PyLong_FromUnsignedLong(codes[i]);
6942 if (tmp == NULL)
6943 return NULL;
6944 PyModule_AddObject(m, names[i], tmp);
6945 }
6946 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, RCVALL_OFF);
6948 PyModule_AddIntMacro(m, RCVALL_ON);
6949 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006950#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006952#endif
6953#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006955#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006956#endif /* _MSTCPIP_ */
6957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006958 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006959#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006960 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006963}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006964
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006965
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006966#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006967#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006968
6969/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006970/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006971
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006972int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006973inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006976#if (SIZEOF_INT != 4)
6977#error "Not sure if in_addr_t exists and int is not 32-bits."
6978#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006979 unsigned int packed_addr;
6980 packed_addr = inet_addr(src);
6981 if (packed_addr == INADDR_NONE)
6982 return 0;
6983 memcpy(dst, &packed_addr, 4);
6984 return 1;
6985 }
6986 /* Should set errno to EAFNOSUPPORT */
6987 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006988}
6989
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006990const char *
6991inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006992{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993 if (af == AF_INET) {
6994 struct in_addr packed_addr;
6995 if (size < 16)
6996 /* Should set errno to ENOSPC. */
6997 return NULL;
6998 memcpy(&packed_addr, src, sizeof(packed_addr));
6999 return strncpy(dst, inet_ntoa(packed_addr), size);
7000 }
7001 /* Should set errno to EAFNOSUPPORT */
7002 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007003}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007004
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007005#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007006#endif