blob: f87ebe0b257ab87b0bd33ccfa3541f02da0d1f92 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Jeremy Hylton22308652001-02-02 03:23:09 +0000287#endif
288
Skip Montanaro7befb992004-02-10 16:50:21 +0000289#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000290
Neal Norwitz39d22e52002-11-02 19:55:21 +0000291#ifndef O_NONBLOCK
292# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000293#endif
294
Trent Micka708d6e2004-09-07 17:48:26 +0000295/* include Python's addrinfo.h unless it causes trouble */
296#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
297 /* Do not include addinfo.h on some newer IRIX versions.
298 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
299 * for example, but not by 6.5.10.
300 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000301#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000302 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
303 * EAI_* constants are defined in (the already included) ws2tcpip.h.
304 */
305#else
306# include "addrinfo.h"
307#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000308
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000309#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000310#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000311int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000312const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000313#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000314#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000315
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000316#ifdef __APPLE__
317/* On OS X, getaddrinfo returns no error indication of lookup
318 failure, so we must use the emulation instead of the libinfo
319 implementation. Unfortunately, performing an autoconf test
320 for this bug would require DNS access for the machine performing
321 the configuration, which is not acceptable. Therefore, we
322 determine the bug just by checking for __APPLE__. If this bug
323 gets ever fixed, perhaps checking for sys/version.h would be
324 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000325#ifndef HAVE_GETNAMEINFO
326/* This bug seems to be fixed in Jaguar. Ths easiest way I could
327 Find to check for Jaguar is that it has getnameinfo(), which
328 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000329#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000330#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000331
332#ifdef HAVE_INET_ATON
333#define USE_INET_ATON_WEAKLINK
334#endif
335
Jack Jansen84262fb2002-07-02 14:40:42 +0000336#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000337
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000338/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000339#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000340/* avoid clashes with the C library definition of the symbol. */
341#define getaddrinfo fake_getaddrinfo
342#define gai_strerror fake_gai_strerror
343#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000344#include "getaddrinfo.c"
345#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000346#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000347#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348#include "getnameinfo.c"
349#endif
350
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000351#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000352#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000353#endif
354
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000355#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000356#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000357#define EAFNOSUPPORT WSAEAFNOSUPPORT
358#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000359#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000360
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000361#ifndef SOCKETCLOSE
362#define SOCKETCLOSE close
363#endif
364
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000365#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000366#define USE_BLUETOOTH 1
367#if defined(__FreeBSD__)
368#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
369#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000370#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371#define SOL_HCI SOL_HCI_RAW
372#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000373#define sockaddr_l2 sockaddr_l2cap
374#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000375#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000376#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
377#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000378#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000379#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000380#define sockaddr_l2 sockaddr_bt
381#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000382#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000383#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#define SOL_HCI BTPROTO_HCI
385#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000386#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
387#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000388#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000389#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000390#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
395#endif
396#endif
397
Charles-François Natali8b759652011-12-23 16:44:51 +0100398/* Convert "sock_addr_t *" to "struct sockaddr *". */
399#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000400
Martin v. Löwise9416172003-05-03 10:12:45 +0000401/*
402 * Constants for getnameinfo()
403 */
404#if !defined(NI_MAXHOST)
405#define NI_MAXHOST 1025
406#endif
407#if !defined(NI_MAXSERV)
408#define NI_MAXSERV 32
409#endif
410
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000411#ifndef INVALID_SOCKET /* MS defines this */
412#define INVALID_SOCKET (-1)
413#endif
414
Charles-François Natali0cc86852013-09-13 19:53:08 +0200415#ifndef INADDR_NONE
416#define INADDR_NONE (-1)
417#endif
418
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000419/* XXX There's a problem here: *static* functions are not supposed to have
420 a Py prefix (or use CapitalizedWords). Later... */
421
Guido van Rossum30a685f1991-06-27 15:51:29 +0000422/* Global variable holding the exception type for errors detected
423 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000424static PyObject *socket_herror;
425static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000426static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427
Tim Peters643a7fc2002-02-17 04:13:21 +0000428/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429 The sock_type variable contains pointers to various functions,
430 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000431 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000432static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000433
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000434#if defined(HAVE_POLL_H)
435#include <poll.h>
436#elif defined(HAVE_SYS_POLL_H)
437#include <sys/poll.h>
438#endif
439
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000440/* Largest value to try to store in a socklen_t (used when handling
441 ancillary data). POSIX requires socklen_t to hold at least
442 (2**31)-1 and recommends against storing larger values, but
443 socklen_t was originally int in the BSD interface, so to be on the
444 safe side we use the smaller of (2**31)-1 and INT_MAX. */
445#if INT_MAX > 0x7fffffff
446#define SOCKLEN_T_LIMIT 0x7fffffff
447#else
448#define SOCKLEN_T_LIMIT INT_MAX
449#endif
450
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200451#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000452/* Instead of select(), we'll use poll() since poll() works on any fd. */
453#define IS_SELECTABLE(s) 1
454/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000455#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456/* If there's no timeout left, we don't have to call select, so it's a safe,
457 * little white lie. */
458#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000459#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000460
461static PyObject*
462select_error(void)
463{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200464 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000466}
467
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000468#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000469#ifndef WSAEAGAIN
470#define WSAEAGAIN WSAEWOULDBLOCK
471#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000472#define CHECK_ERRNO(expected) \
473 (WSAGetLastError() == WSA ## expected)
474#else
475#define CHECK_ERRNO(expected) \
476 (errno == expected)
477#endif
478
Victor Stinnerdaf45552013-08-28 00:53:59 +0200479#ifdef MS_WINDOWS
480/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
481static int support_wsa_no_inherit = -1;
482#endif
483
Guido van Rossum30a685f1991-06-27 15:51:29 +0000484/* Convenience function to raise an error according to errno
485 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000486
Guido van Rossum73624e91994-10-10 17:59:00 +0000487static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000488set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000489{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000490#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 int err_no = WSAGetLastError();
492 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
493 recognizes the error codes used by both GetLastError() and
494 WSAGetLastError */
495 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200496 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000497#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000498
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200499 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000500}
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000504set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000507
508#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 if (v != NULL) {
514 PyErr_SetObject(socket_herror, v);
515 Py_DECREF(v);
516 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000519}
520
521
522static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000523set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000526
Martin v. Löwis272cb402002-03-01 08:31:07 +0000527#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 /* EAI_SYSTEM is not available on Windows XP. */
529 if (error == EAI_SYSTEM)
530 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000531#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000532
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000533#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000535#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (v != NULL) {
539 PyErr_SetObject(socket_gaierror, v);
540 Py_DECREF(v);
541 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544}
545
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000546/* Function to perform the setting of socket blocking mode
547 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000548static int
549internal_setblocking(PySocketSockObject *s, int block)
550{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200551#ifdef MS_WINDOWS
552 u_long arg;
553#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100554#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100555 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100556 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000557#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000558#ifdef SOCK_NONBLOCK
559 if (block)
560 s->sock_type &= (~SOCK_NONBLOCK);
561 else
562 s->sock_type |= SOCK_NONBLOCK;
563#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000566#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100567#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 block = !block;
569 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100570#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
572 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100573 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 else
Victor Stinner9a954832013-12-04 00:41:24 +0100575 new_delay_flag = delay_flag | O_NONBLOCK;
576 if (new_delay_flag != delay_flag)
577 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
578#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000579#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200580 arg = !block;
581 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 /* Since these don't return anything */
586 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587}
588
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000589/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000590 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000591 This does not raise an exception; we'll let our caller do that
592 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000593 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000594static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000595internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000596{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000598
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 /* Nothing to do unless we're in timeout mode (not non-blocking) */
600 if (s->sock_timeout <= 0.0)
601 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Guard against closed socket */
604 if (s->sock_fd < 0)
605 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000606
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000607 /* Handling this condition here simplifies the select loops */
608 if (interval < 0.0)
609 return 1;
610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 /* Prefer poll, if available, since you can poll() any fd
612 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000613#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 {
615 struct pollfd pollfd;
616 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 pollfd.fd = s->sock_fd;
619 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000622 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 n = poll(&pollfd, 1, timeout);
624 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000625#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 {
627 /* Construct the arguments to select */
628 fd_set fds;
629 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000630 tv.tv_sec = (int)interval;
631 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 FD_ZERO(&fds);
633 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 /* See if the socket is ready */
636 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000637 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
638 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000640 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
641 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000643#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 if (n < 0)
646 return -1;
647 if (n == 0)
648 return 1;
649 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000650}
651
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000652static int
653internal_select(PySocketSockObject *s, int writing)
654{
655 return internal_select_ex(s, writing, s->sock_timeout);
656}
657
658/*
659 Two macros for automatic retry of select() in case of false positives
660 (for example, select() could indicate a socket is ready for reading
661 but the data then discarded by the OS because of a wrong checksum).
662 Here is an example of use:
663
664 BEGIN_SELECT_LOOP(s)
665 Py_BEGIN_ALLOW_THREADS
666 timeout = internal_select_ex(s, 0, interval);
667 if (!timeout)
668 outlen = recv(s->sock_fd, cbuf, len, flags);
669 Py_END_ALLOW_THREADS
670 if (timeout == 1) {
671 PyErr_SetString(socket_timeout, "timed out");
672 return -1;
673 }
674 END_SELECT_LOOP(s)
675*/
676
677#define BEGIN_SELECT_LOOP(s) \
678 { \
679 _PyTime_timeval now, deadline = {0, 0}; \
680 double interval = s->sock_timeout; \
681 int has_timeout = s->sock_timeout > 0.0; \
682 if (has_timeout) { \
683 _PyTime_gettimeofday(&now); \
684 deadline = now; \
685 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
686 } \
687 while (1) { \
688 errno = 0; \
689
690#define END_SELECT_LOOP(s) \
691 if (!has_timeout || \
692 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
693 break; \
694 _PyTime_gettimeofday(&now); \
695 interval = _PyTime_INTERVAL(now, deadline); \
696 } \
697 } \
698
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000699/* Initialize a new socket object. */
700
Tim Petersa12b4cf2002-07-18 22:38:44 +0000701static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000702
Martin v. Löwis1a214512008-06-11 05:26:20 +0000703static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000704init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000705 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 s->sock_fd = fd;
708 s->sock_family = family;
709 s->sock_type = type;
710 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000713#ifdef SOCK_NONBLOCK
714 if (type & SOCK_NONBLOCK)
715 s->sock_timeout = 0.0;
716 else
717#endif
718 {
719 s->sock_timeout = defaulttimeout;
720 if (defaulttimeout >= 0.0)
721 internal_setblocking(s, 0);
722 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000723
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000724}
725
726
Guido van Rossum30a685f1991-06-27 15:51:29 +0000727/* Create a new socket object.
728 This just creates the object and initializes it.
729 If the creation fails, return NULL and set an exception (implicit
730 in NEWOBJ()). */
731
Guido van Rossum73624e91994-10-10 17:59:00 +0000732static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000733new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000735 PySocketSockObject *s;
736 s = (PySocketSockObject *)
737 PyType_GenericNew(&sock_type, NULL, NULL);
738 if (s != NULL)
739 init_sockobject(s, fd, family, type, proto);
740 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000741}
742
Guido van Rossum30a685f1991-06-27 15:51:29 +0000743
Guido van Rossum48a680c2001-03-02 06:34:14 +0000744/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000745 thread to be in gethostbyname or getaddrinfo */
746#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200747static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000748#endif
749
750
Guido van Rossum30a685f1991-06-27 15:51:29 +0000751/* Convert a string specifying a host name or one of a few symbolic
752 names to a numeric IP address. This usually calls gethostbyname()
753 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000754 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000755 an error occurred; then an exception is raised. */
756
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000757static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000758setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 struct addrinfo hints, *res;
761 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
764 if (name[0] == '\0') {
765 int siz;
766 memset(&hints, 0, sizeof(hints));
767 hints.ai_family = af;
768 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
769 hints.ai_flags = AI_PASSIVE;
770 Py_BEGIN_ALLOW_THREADS
771 ACQUIRE_GETADDRINFO_LOCK
772 error = getaddrinfo(NULL, "0", &hints, &res);
773 Py_END_ALLOW_THREADS
774 /* We assume that those thread-unsafe getaddrinfo() versions
775 *are* safe regarding their return value, ie. that a
776 subsequent call to getaddrinfo() does not destroy the
777 outcome of the first call. */
778 RELEASE_GETADDRINFO_LOCK
779 if (error) {
780 set_gaierror(error);
781 return -1;
782 }
783 switch (res->ai_family) {
784 case AF_INET:
785 siz = 4;
786 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000787#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 case AF_INET6:
789 siz = 16;
790 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000792 default:
793 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200794 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000795 "unsupported address family");
796 return -1;
797 }
798 if (res->ai_next) {
799 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200800 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000801 "wildcard resolved to multiple address");
802 return -1;
803 }
804 if (res->ai_addrlen < addr_ret_size)
805 addr_ret_size = res->ai_addrlen;
806 memcpy(addr_ret, res->ai_addr, addr_ret_size);
807 freeaddrinfo(res);
808 return siz;
809 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200810 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100811 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200812 if (strcmp(name, "255.255.255.255") == 0 ||
813 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 struct sockaddr_in *sin;
815 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200816 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 "address family mismatched");
818 return -1;
819 }
820 sin = (struct sockaddr_in *)addr_ret;
821 memset((void *) sin, '\0', sizeof(*sin));
822 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000823#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000825#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 sin->sin_addr.s_addr = INADDR_BROADCAST;
827 return sizeof(sin->sin_addr);
828 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200829
830 /* avoid a name resolution in case of numeric address */
831#ifdef HAVE_INET_PTON
832 /* check for an IPv4 address */
833 if (af == AF_UNSPEC || af == AF_INET) {
834 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
835 memset(sin, 0, sizeof(*sin));
836 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
837 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000838#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200839 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000840#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200841 return 4;
842 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000843 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200844#ifdef ENABLE_IPV6
845 /* check for an IPv6 address - if the address contains a scope ID, we
846 * fallback to getaddrinfo(), which can handle translation from interface
847 * name to interface index */
848 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
849 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
850 memset(sin, 0, sizeof(*sin));
851 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
852 sin->sin6_family = AF_INET6;
853#ifdef HAVE_SOCKADDR_SA_LEN
854 sin->sin6_len = sizeof(*sin);
855#endif
856 return 16;
857 }
858 }
859#endif /* ENABLE_IPV6 */
860#else /* HAVE_INET_PTON */
861 /* check for an IPv4 address */
862 if (af == AF_INET || af == AF_UNSPEC) {
863 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
864 memset(sin, 0, sizeof(*sin));
865 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
866 sin->sin_family = AF_INET;
867#ifdef HAVE_SOCKADDR_SA_LEN
868 sin->sin_len = sizeof(*sin);
869#endif
870 return 4;
871 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100872 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200873#endif /* HAVE_INET_PTON */
874
875 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 memset(&hints, 0, sizeof(hints));
877 hints.ai_family = af;
878 Py_BEGIN_ALLOW_THREADS
879 ACQUIRE_GETADDRINFO_LOCK
880 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000881#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 if (error == EAI_NONAME && af == AF_UNSPEC) {
883 /* On Tru64 V5.1, numeric-to-addr conversion fails
884 if no address family is given. Assume IPv4 for now.*/
885 hints.ai_family = AF_INET;
886 error = getaddrinfo(name, NULL, &hints, &res);
887 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 Py_END_ALLOW_THREADS
890 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
891 if (error) {
892 set_gaierror(error);
893 return -1;
894 }
895 if (res->ai_addrlen < addr_ret_size)
896 addr_ret_size = res->ai_addrlen;
897 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
898 freeaddrinfo(res);
899 switch (addr_ret->sa_family) {
900 case AF_INET:
901 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000902#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 case AF_INET6:
904 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000906 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200907 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 return -1;
909 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000910}
911
Guido van Rossum30a685f1991-06-27 15:51:29 +0000912
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913/* Create a string object representing an IP address.
914 This is always a string of the form 'dd.dd.dd.dd' (with variable
915 size numbers). */
916
Guido van Rossum73624e91994-10-10 17:59:00 +0000917static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000918makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 char buf[NI_MAXHOST];
921 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
924 NI_NUMERICHOST);
925 if (error) {
926 set_gaierror(error);
927 return NULL;
928 }
929 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000930}
931
932
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000933#ifdef USE_BLUETOOTH
934/* Convert a string representation of a Bluetooth address into a numeric
935 address. Returns the length (6), or raises an exception and returns -1 if
936 an error occurred. */
937
938static int
939setbdaddr(char *name, bdaddr_t *bdaddr)
940{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 unsigned int b0, b1, b2, b3, b4, b5;
942 char ch;
943 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000945 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
946 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
947 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
948 bdaddr->b[0] = b0;
949 bdaddr->b[1] = b1;
950 bdaddr->b[2] = b2;
951 bdaddr->b[3] = b3;
952 bdaddr->b[4] = b4;
953 bdaddr->b[5] = b5;
954 return 6;
955 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200956 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 return -1;
958 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000959}
960
961/* Create a string representation of the Bluetooth address. This is always a
962 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
963 value (zero padded if necessary). */
964
965static PyObject *
966makebdaddr(bdaddr_t *bdaddr)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
971 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
972 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
973 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000974}
975#endif
976
977
Guido van Rossum30a685f1991-06-27 15:51:29 +0000978/* Create an object representing the given socket address,
979 suitable for passing it back to bind(), connect() etc.
980 The family field of the sockaddr structure is inspected
981 to determine what kind of address it really is. */
982
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000983/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000984static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000985makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000986{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 if (addrlen == 0) {
988 /* No address -- may be recvfrom() from known socket */
989 Py_INCREF(Py_None);
990 return Py_None;
991 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000993 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 case AF_INET:
996 {
997 struct sockaddr_in *a;
998 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
999 PyObject *ret = NULL;
1000 if (addrobj) {
1001 a = (struct sockaddr_in *)addr;
1002 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1003 Py_DECREF(addrobj);
1004 }
1005 return ret;
1006 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001008#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001009 case AF_UNIX:
1010 {
1011 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001012#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001013 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1014 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001015 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 }
1017 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001018#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 {
1020 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001021 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 }
1023 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001024#endif /* AF_UNIX */
1025
Martin v. Löwis11017b12006-01-14 18:12:57 +00001026#if defined(AF_NETLINK)
1027 case AF_NETLINK:
1028 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1030 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001031 }
1032#endif /* AF_NETLINK */
1033
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001034#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 case AF_INET6:
1036 {
1037 struct sockaddr_in6 *a;
1038 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1039 PyObject *ret = NULL;
1040 if (addrobj) {
1041 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001042 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 addrobj,
1044 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001045 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 a->sin6_scope_id);
1047 Py_DECREF(addrobj);
1048 }
1049 return ret;
1050 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001051#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001052
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001053#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001054 case AF_BLUETOOTH:
1055 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case BTPROTO_L2CAP:
1058 {
1059 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1060 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1061 PyObject *ret = NULL;
1062 if (addrobj) {
1063 ret = Py_BuildValue("Oi",
1064 addrobj,
1065 _BT_L2_MEMB(a, psm));
1066 Py_DECREF(addrobj);
1067 }
1068 return ret;
1069 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001070
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001071 case BTPROTO_RFCOMM:
1072 {
1073 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1074 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1075 PyObject *ret = NULL;
1076 if (addrobj) {
1077 ret = Py_BuildValue("Oi",
1078 addrobj,
1079 _BT_RC_MEMB(a, channel));
1080 Py_DECREF(addrobj);
1081 }
1082 return ret;
1083 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 case BTPROTO_HCI:
1086 {
1087 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001088#if defined(__NetBSD__) || defined(__DragonFly__)
1089 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1090#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 PyObject *ret = NULL;
1092 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1093 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001094#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001096
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case BTPROTO_SCO:
1099 {
1100 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1101 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1102 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001103#endif
1104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001105 default:
1106 PyErr_SetString(PyExc_ValueError,
1107 "Unknown Bluetooth protocol");
1108 return NULL;
1109 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001110#endif
1111
Antoine Pitroub156a462010-10-27 20:13:57 +00001112#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001113 case AF_PACKET:
1114 {
1115 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1116 char *ifname = "";
1117 struct ifreq ifr;
1118 /* need to look up interface name give index */
1119 if (a->sll_ifindex) {
1120 ifr.ifr_ifindex = a->sll_ifindex;
1121 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1122 ifname = ifr.ifr_name;
1123 }
1124 return Py_BuildValue("shbhy#",
1125 ifname,
1126 ntohs(a->sll_protocol),
1127 a->sll_pkttype,
1128 a->sll_hatype,
1129 a->sll_addr,
1130 a->sll_halen);
1131 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001132#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001133
Christian Heimes043d6f62008-01-07 17:19:16 +00001134#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 case AF_TIPC:
1136 {
1137 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1138 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1139 return Py_BuildValue("IIIII",
1140 a->addrtype,
1141 a->addr.nameseq.type,
1142 a->addr.nameseq.lower,
1143 a->addr.nameseq.upper,
1144 a->scope);
1145 } else if (a->addrtype == TIPC_ADDR_NAME) {
1146 return Py_BuildValue("IIIII",
1147 a->addrtype,
1148 a->addr.name.name.type,
1149 a->addr.name.name.instance,
1150 a->addr.name.name.instance,
1151 a->scope);
1152 } else if (a->addrtype == TIPC_ADDR_ID) {
1153 return Py_BuildValue("IIIII",
1154 a->addrtype,
1155 a->addr.id.node,
1156 a->addr.id.ref,
1157 0,
1158 a->scope);
1159 } else {
1160 PyErr_SetString(PyExc_ValueError,
1161 "Invalid address type");
1162 return NULL;
1163 }
1164 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001165#endif
1166
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001167#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001168 case AF_CAN:
1169 {
1170 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1171 char *ifname = "";
1172 struct ifreq ifr;
1173 /* need to look up interface name given index */
1174 if (a->can_ifindex) {
1175 ifr.ifr_ifindex = a->can_ifindex;
1176 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1177 ifname = ifr.ifr_name;
1178 }
1179
1180 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1181 ifname,
1182 a->can_family);
1183 }
1184#endif
1185
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001186#ifdef PF_SYSTEM
1187 case PF_SYSTEM:
1188 switch(proto) {
1189#ifdef SYSPROTO_CONTROL
1190 case SYSPROTO_CONTROL:
1191 {
1192 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1193 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1194 }
1195#endif
1196 default:
1197 PyErr_SetString(PyExc_ValueError,
1198 "Invalid address type");
1199 return 0;
1200 }
1201#endif
1202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001205 default:
1206 /* If we don't know the address family, don't raise an
1207 exception -- return it as an (int, bytes) tuple. */
1208 return Py_BuildValue("iy#",
1209 addr->sa_family,
1210 addr->sa_data,
1211 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001214}
1215
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001216/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1217 (in particular, numeric IP addresses). */
1218struct maybe_idna {
1219 PyObject *obj;
1220 char *buf;
1221};
1222
1223static void
1224idna_cleanup(struct maybe_idna *data)
1225{
1226 Py_CLEAR(data->obj);
1227}
1228
1229static int
1230idna_converter(PyObject *obj, struct maybe_idna *data)
1231{
1232 size_t len;
1233 PyObject *obj2, *obj3;
1234 if (obj == NULL) {
1235 idna_cleanup(data);
1236 return 1;
1237 }
1238 data->obj = NULL;
1239 len = -1;
1240 if (PyBytes_Check(obj)) {
1241 data->buf = PyBytes_AsString(obj);
1242 len = PyBytes_Size(obj);
1243 }
1244 else if (PyByteArray_Check(obj)) {
1245 data->buf = PyByteArray_AsString(obj);
1246 len = PyByteArray_Size(obj);
1247 }
1248 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1249 data->buf = PyUnicode_DATA(obj);
1250 len = PyUnicode_GET_LENGTH(obj);
1251 }
1252 else {
1253 obj2 = PyUnicode_FromObject(obj);
1254 if (!obj2) {
1255 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1256 obj->ob_type->tp_name);
1257 return 0;
1258 }
1259 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1260 Py_DECREF(obj2);
1261 if (!obj3) {
1262 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1263 return 0;
1264 }
1265 if (!PyBytes_Check(obj3)) {
1266 Py_DECREF(obj2);
1267 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1268 return 0;
1269 }
1270 data->obj = obj3;
1271 data->buf = PyBytes_AS_STRING(obj3);
1272 len = PyBytes_GET_SIZE(obj3);
1273 }
1274 if (strlen(data->buf) != len) {
1275 Py_CLEAR(data->obj);
1276 PyErr_SetString(PyExc_TypeError, "host name must not contain NUL character");
1277 return 0;
1278 }
1279 return Py_CLEANUP_SUPPORTED;
1280}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001281
1282/* Parse a socket address argument according to the socket object's
1283 address family. Return 1 if the address was in the proper format,
1284 0 of not. The address is returned through addr_ret, its length
1285 through len_ret. */
1286
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001287static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001288getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001291 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001292
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001293#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001294 case AF_UNIX:
1295 {
1296 struct sockaddr_un* addr;
1297 char *path;
1298 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001299 int retval = 0;
1300
1301 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1302 allow embedded nulls on Linux. */
1303 if (PyUnicode_Check(args)) {
1304 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1305 return 0;
1306 }
1307 else
1308 Py_INCREF(args);
1309 if (!PyArg_Parse(args, "y#", &path, &len))
1310 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001312 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001313#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001314 if (len > 0 && path[0] == 0) {
1315 /* Linux abstract namespace extension */
1316 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001317 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001319 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001320 }
1321 }
1322 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001323#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001324 {
1325 /* regular NULL-terminated string */
1326 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001327 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001328 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001329 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001330 }
1331 addr->sun_path[len] = 0;
1332 }
1333 addr->sun_family = s->sock_family;
1334 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001335 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001336 retval = 1;
1337 unix_out:
1338 Py_DECREF(args);
1339 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001340 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001341#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001342
Martin v. Löwis11017b12006-01-14 18:12:57 +00001343#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 case AF_NETLINK:
1345 {
1346 struct sockaddr_nl* addr;
1347 int pid, groups;
1348 addr = (struct sockaddr_nl *)addr_ret;
1349 if (!PyTuple_Check(args)) {
1350 PyErr_Format(
1351 PyExc_TypeError,
1352 "getsockaddrarg: "
1353 "AF_NETLINK address must be tuple, not %.500s",
1354 Py_TYPE(args)->tp_name);
1355 return 0;
1356 }
1357 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1358 return 0;
1359 addr->nl_family = AF_NETLINK;
1360 addr->nl_pid = pid;
1361 addr->nl_groups = groups;
1362 *len_ret = sizeof(*addr);
1363 return 1;
1364 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001365#endif
1366
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001367#ifdef AF_RDS
1368 case AF_RDS:
1369 /* RDS sockets use sockaddr_in: fall-through */
1370#endif
1371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001372 case AF_INET:
1373 {
1374 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001375 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 int port, result;
1377 if (!PyTuple_Check(args)) {
1378 PyErr_Format(
1379 PyExc_TypeError,
1380 "getsockaddrarg: "
1381 "AF_INET address must be tuple, not %.500s",
1382 Py_TYPE(args)->tp_name);
1383 return 0;
1384 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001385 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1386 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 return 0;
1388 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001389 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001390 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001391 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001392 if (result < 0)
1393 return 0;
1394 if (port < 0 || port > 0xffff) {
1395 PyErr_SetString(
1396 PyExc_OverflowError,
1397 "getsockaddrarg: port must be 0-65535.");
1398 return 0;
1399 }
1400 addr->sin_family = AF_INET;
1401 addr->sin_port = htons((short)port);
1402 *len_ret = sizeof *addr;
1403 return 1;
1404 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001405
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001406#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001407 case AF_INET6:
1408 {
1409 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001410 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001411 int port, result;
1412 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001413 flowinfo = scope_id = 0;
1414 if (!PyTuple_Check(args)) {
1415 PyErr_Format(
1416 PyExc_TypeError,
1417 "getsockaddrarg: "
1418 "AF_INET6 address must be tuple, not %.500s",
1419 Py_TYPE(args)->tp_name);
1420 return 0;
1421 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001422 if (!PyArg_ParseTuple(args, "O&i|II",
1423 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 &scope_id)) {
1425 return 0;
1426 }
1427 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001428 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001430 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 if (result < 0)
1432 return 0;
1433 if (port < 0 || port > 0xffff) {
1434 PyErr_SetString(
1435 PyExc_OverflowError,
1436 "getsockaddrarg: port must be 0-65535.");
1437 return 0;
1438 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001439 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001440 PyErr_SetString(
1441 PyExc_OverflowError,
1442 "getsockaddrarg: flowinfo must be 0-1048575.");
1443 return 0;
1444 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 addr->sin6_family = s->sock_family;
1446 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001447 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 addr->sin6_scope_id = scope_id;
1449 *len_ret = sizeof *addr;
1450 return 1;
1451 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001452#endif
1453
Hye-Shik Chang81268602004-02-02 06:05:24 +00001454#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 case AF_BLUETOOTH:
1456 {
1457 switch (s->sock_proto) {
1458 case BTPROTO_L2CAP:
1459 {
1460 struct sockaddr_l2 *addr;
1461 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 addr = (struct sockaddr_l2 *)addr_ret;
1464 memset(addr, 0, sizeof(struct sockaddr_l2));
1465 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1466 if (!PyArg_ParseTuple(args, "si", &straddr,
1467 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001468 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 "wrong format");
1470 return 0;
1471 }
1472 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1473 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
1478 case BTPROTO_RFCOMM:
1479 {
1480 struct sockaddr_rc *addr;
1481 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 addr = (struct sockaddr_rc *)addr_ret;
1484 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1485 if (!PyArg_ParseTuple(args, "si", &straddr,
1486 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001487 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 "wrong format");
1489 return 0;
1490 }
1491 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1492 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001493
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 *len_ret = sizeof *addr;
1495 return 1;
1496 }
1497 case BTPROTO_HCI:
1498 {
1499 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001500#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001501 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001502
Alexander Belopolskye239d232010-12-08 23:31:48 +00001503 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001504 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001505 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001506 "wrong format");
1507 return 0;
1508 }
1509 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1510 return 0;
1511#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1513 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001514 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 "wrong format");
1516 return 0;
1517 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001518#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 *len_ret = sizeof *addr;
1520 return 1;
1521 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001522#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001523 case BTPROTO_SCO:
1524 {
1525 struct sockaddr_sco *addr;
1526 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 addr = (struct sockaddr_sco *)addr_ret;
1529 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1530 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001531 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001532 "wrong format");
1533 return 0;
1534 }
1535 straddr = PyBytes_AS_STRING(args);
1536 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1537 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 *len_ret = sizeof *addr;
1540 return 1;
1541 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001544 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 return 0;
1546 }
1547 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001548#endif
1549
Antoine Pitroub156a462010-10-27 20:13:57 +00001550#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 case AF_PACKET:
1552 {
1553 struct sockaddr_ll* addr;
1554 struct ifreq ifr;
1555 char *interfaceName;
1556 int protoNumber;
1557 int hatype = 0;
1558 int pkttype = 0;
1559 char *haddr = NULL;
1560 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 if (!PyTuple_Check(args)) {
1563 PyErr_Format(
1564 PyExc_TypeError,
1565 "getsockaddrarg: "
1566 "AF_PACKET address must be tuple, not %.500s",
1567 Py_TYPE(args)->tp_name);
1568 return 0;
1569 }
1570 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1571 &protoNumber, &pkttype, &hatype,
1572 &haddr, &halen))
1573 return 0;
1574 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1575 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1576 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1577 s->errorhandler();
1578 return 0;
1579 }
1580 if (halen > 8) {
1581 PyErr_SetString(PyExc_ValueError,
1582 "Hardware address must be 8 bytes or less");
1583 return 0;
1584 }
1585 if (protoNumber < 0 || protoNumber > 0xffff) {
1586 PyErr_SetString(
1587 PyExc_OverflowError,
1588 "getsockaddrarg: protoNumber must be 0-65535.");
1589 return 0;
1590 }
1591 addr = (struct sockaddr_ll*)addr_ret;
1592 addr->sll_family = AF_PACKET;
1593 addr->sll_protocol = htons((short)protoNumber);
1594 addr->sll_ifindex = ifr.ifr_ifindex;
1595 addr->sll_pkttype = pkttype;
1596 addr->sll_hatype = hatype;
1597 if (halen != 0) {
1598 memcpy(&addr->sll_addr, haddr, halen);
1599 }
1600 addr->sll_halen = halen;
1601 *len_ret = sizeof *addr;
1602 return 1;
1603 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001604#endif
1605
Christian Heimes043d6f62008-01-07 17:19:16 +00001606#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 case AF_TIPC:
1608 {
1609 unsigned int atype, v1, v2, v3;
1610 unsigned int scope = TIPC_CLUSTER_SCOPE;
1611 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 if (!PyTuple_Check(args)) {
1614 PyErr_Format(
1615 PyExc_TypeError,
1616 "getsockaddrarg: "
1617 "AF_TIPC address must be tuple, not %.500s",
1618 Py_TYPE(args)->tp_name);
1619 return 0;
1620 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001622 if (!PyArg_ParseTuple(args,
1623 "IIII|I;Invalid TIPC address format",
1624 &atype, &v1, &v2, &v3, &scope))
1625 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 addr = (struct sockaddr_tipc *) addr_ret;
1628 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001629
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 addr->family = AF_TIPC;
1631 addr->scope = scope;
1632 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001633
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001634 if (atype == TIPC_ADDR_NAMESEQ) {
1635 addr->addr.nameseq.type = v1;
1636 addr->addr.nameseq.lower = v2;
1637 addr->addr.nameseq.upper = v3;
1638 } else if (atype == TIPC_ADDR_NAME) {
1639 addr->addr.name.name.type = v1;
1640 addr->addr.name.name.instance = v2;
1641 } else if (atype == TIPC_ADDR_ID) {
1642 addr->addr.id.node = v1;
1643 addr->addr.id.ref = v2;
1644 } else {
1645 /* Shouldn't happen */
1646 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1647 return 0;
1648 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001650 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001652 return 1;
1653 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001654#endif
1655
Vinay Sajiped6783f2014-03-21 11:44:32 +00001656#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001657 case AF_CAN:
1658 switch (s->sock_proto) {
1659 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001660 /* fall-through */
1661 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001662 {
1663 struct sockaddr_can *addr;
1664 PyObject *interfaceName;
1665 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001666 Py_ssize_t len;
1667
Benjamin Peterson18b71912013-05-16 15:29:44 -05001668 addr = (struct sockaddr_can *)addr_ret;
1669
Charles-François Natali47413c12011-10-06 19:47:44 +02001670 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1671 &interfaceName))
1672 return 0;
1673
1674 len = PyBytes_GET_SIZE(interfaceName);
1675
1676 if (len == 0) {
1677 ifr.ifr_ifindex = 0;
1678 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001679 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1680 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001681 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1682 s->errorhandler();
1683 Py_DECREF(interfaceName);
1684 return 0;
1685 }
1686 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001687 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001688 "AF_CAN interface name too long");
1689 Py_DECREF(interfaceName);
1690 return 0;
1691 }
1692
1693 addr->can_family = AF_CAN;
1694 addr->can_ifindex = ifr.ifr_ifindex;
1695
1696 *len_ret = sizeof(*addr);
1697 Py_DECREF(interfaceName);
1698 return 1;
1699 }
1700 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001701 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001702 "getsockaddrarg: unsupported CAN protocol");
1703 return 0;
1704 }
1705#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001706
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001707#ifdef PF_SYSTEM
1708 case PF_SYSTEM:
1709 switch (s->sock_proto) {
1710#ifdef SYSPROTO_CONTROL
1711 case SYSPROTO_CONTROL:
1712 {
1713 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001714
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001715 addr = (struct sockaddr_ctl *)addr_ret;
1716 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001717 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001718
1719 if (PyUnicode_Check(args)) {
1720 struct ctl_info info;
1721 PyObject *ctl_name;
1722
1723 if (!PyArg_Parse(args, "O&",
1724 PyUnicode_FSConverter, &ctl_name)) {
1725 return 0;
1726 }
1727
1728 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1729 PyErr_SetString(PyExc_ValueError,
1730 "provided string is too long");
1731 Py_DECREF(ctl_name);
1732 return 0;
1733 }
1734 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1735 sizeof(info.ctl_name));
1736 Py_DECREF(ctl_name);
1737
1738 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1739 PyErr_SetString(PyExc_OSError,
1740 "cannot find kernel control with provided name");
1741 return 0;
1742 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001743
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001744 addr->sc_id = info.ctl_id;
1745 addr->sc_unit = 0;
1746 } else if (!PyArg_ParseTuple(args, "II",
1747 &(addr->sc_id), &(addr->sc_unit))) {
1748 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1749 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001750
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001751 return 0;
1752 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001753
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001754 *len_ret = sizeof(*addr);
1755 return 1;
1756 }
1757#endif
1758 default:
1759 PyErr_SetString(PyExc_OSError,
1760 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1761 return 0;
1762 }
1763#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001765 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001767 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001768 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001772}
1773
Guido van Rossum30a685f1991-06-27 15:51:29 +00001774
Guido van Rossum48a680c2001-03-02 06:34:14 +00001775/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001776 Return 1 if the family is known, 0 otherwise. The length is returned
1777 through len_ret. */
1778
1779static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001780getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001781{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001783
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001784#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 case AF_UNIX:
1786 {
1787 *len_ret = sizeof (struct sockaddr_un);
1788 return 1;
1789 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001790#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001791#if defined(AF_NETLINK)
1792 case AF_NETLINK:
1793 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001794 *len_ret = sizeof (struct sockaddr_nl);
1795 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001796 }
1797#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001798
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001799#ifdef AF_RDS
1800 case AF_RDS:
1801 /* RDS sockets use sockaddr_in: fall-through */
1802#endif
1803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 case AF_INET:
1805 {
1806 *len_ret = sizeof (struct sockaddr_in);
1807 return 1;
1808 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001809
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001810#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001811 case AF_INET6:
1812 {
1813 *len_ret = sizeof (struct sockaddr_in6);
1814 return 1;
1815 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001816#endif
1817
Hye-Shik Chang81268602004-02-02 06:05:24 +00001818#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001819 case AF_BLUETOOTH:
1820 {
1821 switch(s->sock_proto)
1822 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 case BTPROTO_L2CAP:
1825 *len_ret = sizeof (struct sockaddr_l2);
1826 return 1;
1827 case BTPROTO_RFCOMM:
1828 *len_ret = sizeof (struct sockaddr_rc);
1829 return 1;
1830 case BTPROTO_HCI:
1831 *len_ret = sizeof (struct sockaddr_hci);
1832 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001833#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 case BTPROTO_SCO:
1835 *len_ret = sizeof (struct sockaddr_sco);
1836 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001838 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001839 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 "unknown BT protocol");
1841 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001842
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001843 }
1844 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001845#endif
1846
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001847#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 case AF_PACKET:
1849 {
1850 *len_ret = sizeof (struct sockaddr_ll);
1851 return 1;
1852 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001853#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001854
Christian Heimes043d6f62008-01-07 17:19:16 +00001855#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001856 case AF_TIPC:
1857 {
1858 *len_ret = sizeof (struct sockaddr_tipc);
1859 return 1;
1860 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001861#endif
1862
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001863#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001864 case AF_CAN:
1865 {
1866 *len_ret = sizeof (struct sockaddr_can);
1867 return 1;
1868 }
1869#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001870
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001871#ifdef PF_SYSTEM
1872 case PF_SYSTEM:
1873 switch(s->sock_proto) {
1874#ifdef SYSPROTO_CONTROL
1875 case SYSPROTO_CONTROL:
1876 *len_ret = sizeof (struct sockaddr_ctl);
1877 return 1;
1878#endif
1879 default:
1880 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1881 "unknown PF_SYSTEM protocol");
1882 return 0;
1883 }
1884#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001886 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001889 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001890 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001892 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001893}
1894
1895
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001896/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1897 Currently, these methods are only compiled if the RFC 2292/3542
1898 CMSG_LEN() macro is available. Older systems seem to have used
1899 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1900 it may be possible to define CMSG_LEN() that way if it's not
1901 provided. Some architectures might need extra padding after the
1902 cmsghdr, however, and CMSG_LEN() would have to take account of
1903 this. */
1904#ifdef CMSG_LEN
1905/* If length is in range, set *result to CMSG_LEN(length) and return
1906 true; otherwise, return false. */
1907static int
1908get_CMSG_LEN(size_t length, size_t *result)
1909{
1910 size_t tmp;
1911
1912 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1913 return 0;
1914 tmp = CMSG_LEN(length);
1915 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1916 return 0;
1917 *result = tmp;
1918 return 1;
1919}
1920
1921#ifdef CMSG_SPACE
1922/* If length is in range, set *result to CMSG_SPACE(length) and return
1923 true; otherwise, return false. */
1924static int
1925get_CMSG_SPACE(size_t length, size_t *result)
1926{
1927 size_t tmp;
1928
1929 /* Use CMSG_SPACE(1) here in order to take account of the padding
1930 necessary before *and* after the data. */
1931 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1932 return 0;
1933 tmp = CMSG_SPACE(length);
1934 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1935 return 0;
1936 *result = tmp;
1937 return 1;
1938}
1939#endif
1940
1941/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1942 pointer in msg->msg_control with at least "space" bytes after it,
1943 and its cmsg_len member inside the buffer. */
1944static int
1945cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1946{
1947 size_t cmsg_offset;
1948 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1949 sizeof(cmsgh->cmsg_len));
1950
Charles-François Natali466517d2011-08-28 18:23:43 +02001951 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001952 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001953 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001954 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1955 annoying under OS X as it's unsigned there and so it triggers a
1956 tautological comparison warning under Clang when compared against 0.
1957 Since the check is valid on other platforms, silence the warning under
1958 Clang. */
1959 #ifdef __clang__
1960 #pragma clang diagnostic push
1961 #pragma clang diagnostic ignored "-Wtautological-compare"
1962 #endif
1963 if (msg->msg_controllen < 0)
1964 return 0;
1965 #ifdef __clang__
1966 #pragma clang diagnostic pop
1967 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001968 if (space < cmsg_len_end)
1969 space = cmsg_len_end;
1970 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1971 return (cmsg_offset <= (size_t)-1 - space &&
1972 cmsg_offset + space <= msg->msg_controllen);
1973}
1974
1975/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1976 *space to number of bytes following it in the buffer and return
1977 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1978 msg->msg_controllen are valid. */
1979static int
1980get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1981{
1982 size_t data_offset;
1983 char *data_ptr;
1984
1985 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1986 return 0;
1987 data_offset = data_ptr - (char *)msg->msg_control;
1988 if (data_offset > msg->msg_controllen)
1989 return 0;
1990 *space = msg->msg_controllen - data_offset;
1991 return 1;
1992}
1993
1994/* If cmsgh is invalid or not contained in the buffer pointed to by
1995 msg->msg_control, return -1. If cmsgh is valid and its associated
1996 data is entirely contained in the buffer, set *data_len to the
1997 length of the associated data and return 0. If only part of the
1998 associated data is contained in the buffer but cmsgh is otherwise
1999 valid, set *data_len to the length contained in the buffer and
2000 return 1. */
2001static int
2002get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2003{
2004 size_t space, cmsg_data_len;
2005
2006 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2007 cmsgh->cmsg_len < CMSG_LEN(0))
2008 return -1;
2009 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2010 if (!get_cmsg_data_space(msg, cmsgh, &space))
2011 return -1;
2012 if (space >= cmsg_data_len) {
2013 *data_len = cmsg_data_len;
2014 return 0;
2015 }
2016 *data_len = space;
2017 return 1;
2018}
2019#endif /* CMSG_LEN */
2020
2021
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002022/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002023
Guido van Rossum73624e91994-10-10 17:59:00 +00002024static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002025sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002026{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002027 sock_addr_t addrbuf;
2028 SOCKET_T newfd = INVALID_SOCKET;
2029 socklen_t addrlen;
2030 PyObject *sock = NULL;
2031 PyObject *addr = NULL;
2032 PyObject *res = NULL;
2033 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002034#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2035 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2036 static int accept4_works = -1;
2037#endif
2038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 if (!getsockaddrlen(s, &addrlen))
2040 return NULL;
2041 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 if (!IS_SELECTABLE(s))
2044 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002045
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002046 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002049 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00002050 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02002051#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2052 if (accept4_works != 0) {
2053 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2054 SOCK_CLOEXEC);
2055 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2056 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2057 accept4_works = (errno != ENOSYS);
2058 }
2059 }
2060 if (accept4_works == 0)
2061 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2062#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002063 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002064#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002065 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002066 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 if (timeout == 1) {
2069 PyErr_SetString(socket_timeout, "timed out");
2070 return NULL;
2071 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002072 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002074 if (newfd == INVALID_SOCKET)
2075 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002076
Victor Stinnerdaf45552013-08-28 00:53:59 +02002077#ifdef MS_WINDOWS
2078 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2079 PyErr_SetFromWindowsErr(0);
2080 SOCKETCLOSE(newfd);
2081 goto finally;
2082 }
2083#else
2084
2085#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2086 if (!accept4_works)
2087#endif
2088 {
2089 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2090 SOCKETCLOSE(newfd);
2091 goto finally;
2092 }
2093 }
2094#endif
2095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 sock = PyLong_FromSocket_t(newfd);
2097 if (sock == NULL) {
2098 SOCKETCLOSE(newfd);
2099 goto finally;
2100 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002102 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2103 addrlen, s->sock_proto);
2104 if (addr == NULL)
2105 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002107 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002108
Guido van Rossum67f7a382002-06-06 21:08:16 +00002109finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002110 Py_XDECREF(sock);
2111 Py_XDECREF(addr);
2112 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002113}
2114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002115PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002116"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002117\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002118Wait for an incoming connection. Return a new socket file descriptor\n\
2119representing the connection, and the address of the client.\n\
2120For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002121
Guido van Rossum11ba0942002-06-13 15:07:44 +00002122/* s.setblocking(flag) method. Argument:
2123 False -- non-blocking mode; same as settimeout(0)
2124 True -- blocking mode; same as settimeout(None)
2125*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002126
Guido van Rossum73624e91994-10-10 17:59:00 +00002127static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002128sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002129{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002130 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002132 block = PyLong_AsLong(arg);
2133 if (block == -1 && PyErr_Occurred())
2134 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002136 s->sock_timeout = block ? -1.0 : 0.0;
2137 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 Py_INCREF(Py_None);
2140 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002141}
Guido van Rossume4485b01994-09-07 14:32:49 +00002142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002143PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002144"setblocking(flag)\n\
2145\n\
2146Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002147setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002148setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002149
Guido van Rossum11ba0942002-06-13 15:07:44 +00002150/* s.settimeout(timeout) method. Argument:
2151 None -- no timeout, blocking mode; same as setblocking(True)
2152 0.0 -- non-blocking mode; same as setblocking(False)
2153 > 0 -- timeout mode; operations time out after timeout seconds
2154 < 0 -- illegal; raises an exception
2155*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002156static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002157sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002158{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 if (arg == Py_None)
2162 timeout = -1.0;
2163 else {
2164 timeout = PyFloat_AsDouble(arg);
2165 if (timeout < 0.0) {
2166 if (!PyErr_Occurred())
2167 PyErr_SetString(PyExc_ValueError,
2168 "Timeout value out of range");
2169 return NULL;
2170 }
2171 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002173 s->sock_timeout = timeout;
2174 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 Py_INCREF(Py_None);
2177 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002178}
2179
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002180PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002181"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002182\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002183Set a timeout on socket operations. 'timeout' can be a float,\n\
2184giving in seconds, or None. Setting a timeout of None disables\n\
2185the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002186Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002187
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002188/* s.gettimeout() method.
2189 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002190static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002191sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002193 if (s->sock_timeout < 0.0) {
2194 Py_INCREF(Py_None);
2195 return Py_None;
2196 }
2197 else
2198 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002199}
2200
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002201PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002202"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002203\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002204Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002205operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002206operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002207
Guido van Rossumaee08791992-09-08 09:05:33 +00002208/* s.setsockopt() method.
2209 With an integer third argument, sets an integer option.
2210 With a string third argument, sets an option from a buffer;
2211 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002212
Guido van Rossum73624e91994-10-10 17:59:00 +00002213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002214sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 int level;
2217 int optname;
2218 int res;
2219 char *buf;
2220 int buflen;
2221 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (PyArg_ParseTuple(args, "iii:setsockopt",
2224 &level, &optname, &flag)) {
2225 buf = (char *) &flag;
2226 buflen = sizeof flag;
2227 }
2228 else {
2229 PyErr_Clear();
2230 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2231 &level, &optname, &buf, &buflen))
2232 return NULL;
2233 }
2234 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2235 if (res < 0)
2236 return s->errorhandler();
2237 Py_INCREF(Py_None);
2238 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002239}
2240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002241PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002242"setsockopt(level, option, value)\n\
2243\n\
2244Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002245The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002246
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002247
Guido van Rossumaee08791992-09-08 09:05:33 +00002248/* s.getsockopt() method.
2249 With two arguments, retrieves an integer option.
2250 With a third integer argument, retrieves a string buffer of that size;
2251 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002252
Guido van Rossum73624e91994-10-10 17:59:00 +00002253static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002254sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 int level;
2257 int optname;
2258 int res;
2259 PyObject *buf;
2260 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2263 &level, &optname, &buflen))
2264 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 if (buflen == 0) {
2267 int flag = 0;
2268 socklen_t flagsize = sizeof flag;
2269 res = getsockopt(s->sock_fd, level, optname,
2270 (void *)&flag, &flagsize);
2271 if (res < 0)
2272 return s->errorhandler();
2273 return PyLong_FromLong(flag);
2274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002276 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 "getsockopt buflen out of range");
2278 return NULL;
2279 }
2280 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2281 if (buf == NULL)
2282 return NULL;
2283 res = getsockopt(s->sock_fd, level, optname,
2284 (void *)PyBytes_AS_STRING(buf), &buflen);
2285 if (res < 0) {
2286 Py_DECREF(buf);
2287 return s->errorhandler();
2288 }
2289 _PyBytes_Resize(&buf, buflen);
2290 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002291}
2292
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002293PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002294"getsockopt(level, option[, buffersize]) -> value\n\
2295\n\
2296Get a socket option. See the Unix manual for level and option.\n\
2297If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002298string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002299
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002300
Fred Drake728819a2000-07-01 03:40:12 +00002301/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002302
Guido van Rossum73624e91994-10-10 17:59:00 +00002303static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002304sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 sock_addr_t addrbuf;
2307 int addrlen;
2308 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2311 return NULL;
2312 Py_BEGIN_ALLOW_THREADS
2313 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2314 Py_END_ALLOW_THREADS
2315 if (res < 0)
2316 return s->errorhandler();
2317 Py_INCREF(Py_None);
2318 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002319}
2320
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002321PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002322"bind(address)\n\
2323\n\
2324Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002325pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002326sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002327
Guido van Rossum30a685f1991-06-27 15:51:29 +00002328
2329/* s.close() method.
2330 Set the file descriptor to -1 so operations tried subsequently
2331 will surely fail. */
2332
Guido van Rossum73624e91994-10-10 17:59:00 +00002333static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002334sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002338 if ((fd = s->sock_fd) != -1) {
2339 s->sock_fd = -1;
2340 Py_BEGIN_ALLOW_THREADS
2341 (void) SOCKETCLOSE(fd);
2342 Py_END_ALLOW_THREADS
2343 }
2344 Py_INCREF(Py_None);
2345 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002346}
2347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002348PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002349"close()\n\
2350\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002351Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002352
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002353static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002354sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002355{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002356 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002357 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002358 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002359}
2360
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002361PyDoc_STRVAR(detach_doc,
2362"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002363\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002364Close the socket object without closing the underlying file descriptor.\n\
2365The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002366can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002367
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002368static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002369internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002371{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002372 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 timeout = 0;
2375 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002376
2377#ifdef MS_WINDOWS
2378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 if (s->sock_timeout > 0.0) {
2380 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2381 IS_SELECTABLE(s)) {
2382 /* This is a mess. Best solution: trust select */
2383 fd_set fds;
2384 fd_set fds_exc;
2385 struct timeval tv;
2386 tv.tv_sec = (int)s->sock_timeout;
2387 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2388 FD_ZERO(&fds);
2389 FD_SET(s->sock_fd, &fds);
2390 FD_ZERO(&fds_exc);
2391 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002392 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2393 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002394 if (res == 0) {
2395 res = WSAEWOULDBLOCK;
2396 timeout = 1;
2397 } else if (res > 0) {
2398 if (FD_ISSET(s->sock_fd, &fds))
2399 /* The socket is in the writable set - this
2400 means connected */
2401 res = 0;
2402 else {
2403 /* As per MS docs, we need to call getsockopt()
2404 to get the underlying error */
2405 int res_size = sizeof res;
2406 /* It must be in the exception set */
2407 assert(FD_ISSET(s->sock_fd, &fds_exc));
2408 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2409 (char *)&res, &res_size))
2410 /* getsockopt also clears WSAGetLastError,
2411 so reset it back. */
2412 WSASetLastError(res);
2413 else
2414 res = WSAGetLastError();
2415 }
2416 }
2417 /* else if (res < 0) an error occurred */
2418 }
2419 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002420
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002421 if (res < 0)
2422 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002423
2424#else
2425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 if (s->sock_timeout > 0.0) {
2427 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2428 timeout = internal_select(s, 1);
2429 if (timeout == 0) {
2430 /* Bug #1019808: in case of an EINPROGRESS,
2431 use getsockopt(SO_ERROR) to get the real
2432 error. */
2433 socklen_t res_size = sizeof res;
2434 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2435 SO_ERROR, &res, &res_size);
2436 if (res == EISCONN)
2437 res = 0;
2438 errno = res;
2439 }
2440 else if (timeout == -1) {
2441 res = errno; /* had error */
2442 }
2443 else
2444 res = EWOULDBLOCK; /* timed out */
2445 }
2446 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002447
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 if (res < 0)
2449 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002450
2451#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002455}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002456
Fred Drake728819a2000-07-01 03:40:12 +00002457/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002458
Guido van Rossum73624e91994-10-10 17:59:00 +00002459static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002460sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002461{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 sock_addr_t addrbuf;
2463 int addrlen;
2464 int res;
2465 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002467 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2468 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 Py_BEGIN_ALLOW_THREADS
2471 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2472 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002474 if (timeout == 1) {
2475 PyErr_SetString(socket_timeout, "timed out");
2476 return NULL;
2477 }
2478 if (res != 0)
2479 return s->errorhandler();
2480 Py_INCREF(Py_None);
2481 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002482}
2483
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002484PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002485"connect(address)\n\
2486\n\
2487Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002488is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002489
Guido van Rossum30a685f1991-06-27 15:51:29 +00002490
Fred Drake728819a2000-07-01 03:40:12 +00002491/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002492
2493static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002494sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002495{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002496 sock_addr_t addrbuf;
2497 int addrlen;
2498 int res;
2499 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2502 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 Py_BEGIN_ALLOW_THREADS
2505 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2506 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002508 /* Signals are not errors (though they may raise exceptions). Adapted
2509 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002510#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002511 if (res == EINTR && PyErr_CheckSignals())
2512 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002513#endif
2514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002515 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002516}
2517
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002518PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002519"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002520\n\
2521This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002522instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002523
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002524
Guido van Rossumed233a51992-06-23 09:07:03 +00002525/* s.fileno() method */
2526
Guido van Rossum73624e91994-10-10 17:59:00 +00002527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002528sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002531}
2532
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002533PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002534"fileno() -> integer\n\
2535\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002536Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002537
Guido van Rossumed233a51992-06-23 09:07:03 +00002538
Guido van Rossumc89705d1992-11-26 08:54:07 +00002539/* s.getsockname() method */
2540
Guido van Rossum73624e91994-10-10 17:59:00 +00002541static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002542sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 sock_addr_t addrbuf;
2545 int res;
2546 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002548 if (!getsockaddrlen(s, &addrlen))
2549 return NULL;
2550 memset(&addrbuf, 0, addrlen);
2551 Py_BEGIN_ALLOW_THREADS
2552 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2553 Py_END_ALLOW_THREADS
2554 if (res < 0)
2555 return s->errorhandler();
2556 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2557 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002558}
2559
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002560PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002561"getsockname() -> address info\n\
2562\n\
2563Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002564info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002565
Guido van Rossumc89705d1992-11-26 08:54:07 +00002566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002567#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002568/* s.getpeername() method */
2569
Guido van Rossum73624e91994-10-10 17:59:00 +00002570static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002571sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002572{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002573 sock_addr_t addrbuf;
2574 int res;
2575 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002577 if (!getsockaddrlen(s, &addrlen))
2578 return NULL;
2579 memset(&addrbuf, 0, addrlen);
2580 Py_BEGIN_ALLOW_THREADS
2581 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2582 Py_END_ALLOW_THREADS
2583 if (res < 0)
2584 return s->errorhandler();
2585 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2586 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002587}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002588
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002589PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002590"getpeername() -> address info\n\
2591\n\
2592Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002593info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002594
Guido van Rossumb6775db1994-08-01 11:34:53 +00002595#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002596
2597
Guido van Rossum30a685f1991-06-27 15:51:29 +00002598/* s.listen(n) method */
2599
Guido van Rossum73624e91994-10-10 17:59:00 +00002600static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002601sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002602{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002603 /* We try to choose a default backlog high enough to avoid connection drops
2604 * for common workloads, yet not too high to limit resource usage. */
2605 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002607
Charles-François Natali644b8f52014-05-22 19:45:39 +01002608 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002609 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002611 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002612 /* To avoid problems on systems that don't allow a negative backlog
2613 * (which doesn't make sense anyway) we force a minimum value of 0. */
2614 if (backlog < 0)
2615 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 res = listen(s->sock_fd, backlog);
2617 Py_END_ALLOW_THREADS
2618 if (res < 0)
2619 return s->errorhandler();
2620 Py_INCREF(Py_None);
2621 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002622}
2623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002624PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002625"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002626\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002627Enable a server to accept connections. If backlog is specified, it must be\n\
2628at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002629unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002630connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002631
2632
Thomas Wouters477c8d52006-05-27 19:21:47 +00002633/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002634 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002635 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002636 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002637 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002638 * also possible that we return a number of bytes smaller than the request
2639 * bytes.
2640 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002641
Antoine Pitrou19467d22010-08-17 19:33:30 +00002642static Py_ssize_t
2643sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002644{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002645 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002648 if (!IS_SELECTABLE(s)) {
2649 select_error();
2650 return -1;
2651 }
2652 if (len == 0) {
2653 /* If 0 bytes were requested, do nothing. */
2654 return 0;
2655 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002656
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002657 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002659 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002660 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002661#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002662 if (len > INT_MAX)
2663 len = INT_MAX;
2664 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2665#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002666 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002667#endif
2668 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002669 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 if (timeout == 1) {
2672 PyErr_SetString(socket_timeout, "timed out");
2673 return -1;
2674 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002675 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002676 if (outlen < 0) {
2677 /* Note: the call to errorhandler() ALWAYS indirectly returned
2678 NULL, so ignore its return value */
2679 s->errorhandler();
2680 return -1;
2681 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002682 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002683}
2684
Guido van Rossum48a680c2001-03-02 06:34:14 +00002685
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002686/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002687
Guido van Rossum73624e91994-10-10 17:59:00 +00002688static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002689sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002690{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002691 Py_ssize_t recvlen, outlen;
2692 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002694
Antoine Pitrou19467d22010-08-17 19:33:30 +00002695 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 if (recvlen < 0) {
2699 PyErr_SetString(PyExc_ValueError,
2700 "negative buffersize in recv");
2701 return NULL;
2702 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 /* Allocate a new string. */
2705 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2706 if (buf == NULL)
2707 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002708
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002709 /* Call the guts */
2710 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2711 if (outlen < 0) {
2712 /* An error occurred, release the string and return an
2713 error. */
2714 Py_DECREF(buf);
2715 return NULL;
2716 }
2717 if (outlen != recvlen) {
2718 /* We did not read as many bytes as we anticipated, resize the
2719 string if possible and be successful. */
2720 _PyBytes_Resize(&buf, outlen);
2721 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002724}
2725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002727"recv(buffersize[, flags]) -> data\n\
2728\n\
2729Receive up to buffersize bytes from the socket. For the optional flags\n\
2730argument, see the Unix manual. When no data is available, block until\n\
2731at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002732the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002733
Guido van Rossum30a685f1991-06-27 15:51:29 +00002734
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002735/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002736
Thomas Wouters477c8d52006-05-27 19:21:47 +00002737static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002738sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002741
Antoine Pitrou19467d22010-08-17 19:33:30 +00002742 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 Py_buffer pbuf;
2744 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002745 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002748 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 &pbuf, &recvlen, &flags))
2750 return NULL;
2751 buf = pbuf.buf;
2752 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (recvlen < 0) {
2755 PyBuffer_Release(&pbuf);
2756 PyErr_SetString(PyExc_ValueError,
2757 "negative buffersize in recv_into");
2758 return NULL;
2759 }
2760 if (recvlen == 0) {
2761 /* If nbytes was not specified, use the buffer's length */
2762 recvlen = buflen;
2763 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 /* Check if the buffer is large enough */
2766 if (buflen < recvlen) {
2767 PyBuffer_Release(&pbuf);
2768 PyErr_SetString(PyExc_ValueError,
2769 "buffer too small for requested bytes");
2770 return NULL;
2771 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002773 /* Call the guts */
2774 readlen = sock_recv_guts(s, buf, recvlen, flags);
2775 if (readlen < 0) {
2776 /* Return an error. */
2777 PyBuffer_Release(&pbuf);
2778 return NULL;
2779 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002781 PyBuffer_Release(&pbuf);
2782 /* Return the number of bytes read. Note that we do not do anything
2783 special here in the case that readlen < recvlen. */
2784 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002785}
2786
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002787PyDoc_STRVAR(recv_into_doc,
2788"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002789\n\
2790A version of recv() that stores its data into a buffer rather than creating \n\
2791a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2792is not specified (or 0), receive up to the size available in the given buffer.\n\
2793\n\
2794See recv() for documentation about the flags.");
2795
2796
2797/*
Christian Heimes99170a52007-12-19 02:07:34 +00002798 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2799 * into a char buffer. If you have any inc/def ref to do to the objects that
2800 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002801 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002802 * that it is also possible that we return a number of bytes smaller than the
2803 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002804 *
2805 * 'addr' is a return value for the address object. Note that you must decref
2806 * it yourself.
2807 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002808static Py_ssize_t
2809sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002810 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002812 sock_addr_t addrbuf;
2813 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002814 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002816
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002817 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 if (!getsockaddrlen(s, &addrlen))
2820 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002822 if (!IS_SELECTABLE(s)) {
2823 select_error();
2824 return -1;
2825 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002826
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002827 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 Py_BEGIN_ALLOW_THREADS
2829 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002830 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002832#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002833 if (len > INT_MAX)
2834 len = INT_MAX;
2835 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002837#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 n = recvfrom(s->sock_fd, cbuf, len, flags,
2839 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002840#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 }
2842 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 if (timeout == 1) {
2845 PyErr_SetString(socket_timeout, "timed out");
2846 return -1;
2847 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002848 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (n < 0) {
2850 s->errorhandler();
2851 return -1;
2852 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002854 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2855 addrlen, s->sock_proto)))
2856 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002858 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002859}
2860
2861/* s.recvfrom(nbytes [,flags]) method */
2862
2863static PyObject *
2864sock_recvfrom(PySocketSockObject *s, PyObject *args)
2865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002866 PyObject *buf = NULL;
2867 PyObject *addr = NULL;
2868 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002869 int flags = 0;
2870 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002871
Antoine Pitrou19467d22010-08-17 19:33:30 +00002872 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002874
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 if (recvlen < 0) {
2876 PyErr_SetString(PyExc_ValueError,
2877 "negative buffersize in recvfrom");
2878 return NULL;
2879 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2882 if (buf == NULL)
2883 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002885 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2886 recvlen, flags, &addr);
2887 if (outlen < 0) {
2888 goto finally;
2889 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 if (outlen != recvlen) {
2892 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002893 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002895 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002896 goto finally;
2897 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002900
2901finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 Py_XDECREF(buf);
2903 Py_XDECREF(addr);
2904 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002905}
2906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002907PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002908"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2909\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002910Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002911
Thomas Wouters477c8d52006-05-27 19:21:47 +00002912
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002913/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002914
2915static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002916sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002917{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919
Antoine Pitrou19467d22010-08-17 19:33:30 +00002920 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002921 Py_buffer pbuf;
2922 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002923 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002924
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002926
Antoine Pitrou19467d22010-08-17 19:33:30 +00002927 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 kwlist, &pbuf,
2929 &recvlen, &flags))
2930 return NULL;
2931 buf = pbuf.buf;
2932 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 if (recvlen < 0) {
2935 PyBuffer_Release(&pbuf);
2936 PyErr_SetString(PyExc_ValueError,
2937 "negative buffersize in recvfrom_into");
2938 return NULL;
2939 }
2940 if (recvlen == 0) {
2941 /* If nbytes was not specified, use the buffer's length */
2942 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05002943 } else if (recvlen > buflen) {
2944 PyBuffer_Release(&pbuf);
2945 PyErr_SetString(PyExc_ValueError,
2946 "nbytes is greater than the length of the buffer");
2947 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 }
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) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003319#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003320 if (len > INT_MAX)
3321 len = INT_MAX;
3322 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003323#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003324 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003325#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003326 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003327 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003328 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003329 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003330 PyErr_SetString(socket_timeout, "timed out");
3331 return NULL;
3332 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003333 END_SELECT_LOOP(s)
3334
3335 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003336 if (n < 0)
3337 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003338 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003339}
3340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003341PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003342"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003343\n\
3344Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003345argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003346sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003347
3348
3349/* s.sendall(data [,flags]) method */
3350
3351static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003352sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003354 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003355 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003356 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003357 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003359 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3360 return NULL;
3361 buf = pbuf.buf;
3362 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 if (!IS_SELECTABLE(s)) {
3365 PyBuffer_Release(&pbuf);
3366 return select_error();
3367 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003369 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003370 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003371 timeout = internal_select(s, 1);
3372 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003373 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003374#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003375 if (len > INT_MAX)
3376 len = INT_MAX;
3377 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003378#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003379 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003380#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003381 }
3382 Py_END_ALLOW_THREADS
3383 if (timeout == 1) {
3384 PyBuffer_Release(&pbuf);
3385 PyErr_SetString(socket_timeout, "timed out");
3386 return NULL;
3387 }
3388 /* PyErr_CheckSignals() might change errno */
3389 saved_errno = errno;
3390 /* We must run our signal handlers before looping again.
3391 send() can return a successful partial write when it is
3392 interrupted, so we can't restrict ourselves to EINTR. */
3393 if (PyErr_CheckSignals()) {
3394 PyBuffer_Release(&pbuf);
3395 return NULL;
3396 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003397 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003398 /* If interrupted, try again */
3399 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003400 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003401 else
3402 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 }
3404 buf += n;
3405 len -= n;
3406 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003407 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 if (n < 0)
3410 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003411
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 Py_INCREF(Py_None);
3413 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003414}
3415
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003416PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003417"sendall(data[, flags])\n\
3418\n\
3419Send a data string to the socket. For the optional flags\n\
3420argument, see the Unix manual. This calls send() repeatedly\n\
3421until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003422to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003423
Guido van Rossum30a685f1991-06-27 15:51:29 +00003424
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003425/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003426
Guido van Rossum73624e91994-10-10 17:59:00 +00003427static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003428sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003429{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003430 Py_buffer pbuf;
3431 PyObject *addro;
3432 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003433 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003434 sock_addr_t addrbuf;
3435 int addrlen, n = -1, flags, timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003438 arglen = PyTuple_Size(args);
3439 switch (arglen) {
3440 case 2:
3441 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3442 break;
3443 case 3:
3444 PyArg_ParseTuple(args, "y*iO:sendto",
3445 &pbuf, &flags, &addro);
3446 break;
3447 default:
3448 PyErr_Format(PyExc_TypeError,
3449 "sendto() takes 2 or 3 arguments (%d given)",
3450 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003451 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003452 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003453 if (PyErr_Occurred())
3454 return NULL;
3455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003456 buf = pbuf.buf;
3457 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 if (!IS_SELECTABLE(s)) {
3460 PyBuffer_Release(&pbuf);
3461 return select_error();
3462 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003464 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3465 PyBuffer_Release(&pbuf);
3466 return NULL;
3467 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003468
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003469 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003471 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003472 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003473#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003474 if (len > INT_MAX)
3475 len = INT_MAX;
3476 n = sendto(s->sock_fd, buf, (int)len, flags,
3477 SAS2SA(&addrbuf), addrlen);
3478#else
3479 n = sendto(s->sock_fd, buf, len, flags,
3480 SAS2SA(&addrbuf), addrlen);
3481#endif
3482 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003486 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003487 PyErr_SetString(socket_timeout, "timed out");
3488 return NULL;
3489 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003490 END_SELECT_LOOP(s)
3491 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003492 if (n < 0)
3493 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003494 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003495}
3496
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003497PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003498"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003499\n\
3500Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003501For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003502
Guido van Rossum30a685f1991-06-27 15:51:29 +00003503
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003504/* The sendmsg() and recvmsg[_into]() methods require a working
3505 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3506#ifdef CMSG_LEN
3507/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3508
3509static PyObject *
3510sock_sendmsg(PySocketSockObject *s, PyObject *args)
3511{
3512 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3513 Py_buffer *databufs = NULL;
3514 struct iovec *iovs = NULL;
3515 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003516 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 struct cmsginfo {
3518 int level;
3519 int type;
3520 Py_buffer data;
3521 } *cmsgs = NULL;
3522 void *controlbuf = NULL;
3523 size_t controllen, controllen_last;
3524 ssize_t bytes_sent = -1;
3525 int addrlen, timeout, flags = 0;
3526 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3527 *cmsg_fast = NULL, *retval = NULL;
3528
3529 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3530 &data_arg, &cmsg_arg, &flags, &addr_arg))
3531 return NULL;
3532
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003533 /* Parse destination address. */
3534 if (addr_arg != NULL && addr_arg != Py_None) {
3535 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3536 goto finally;
3537 msg.msg_name = &addrbuf;
3538 msg.msg_namelen = addrlen;
3539 }
3540
3541 /* Fill in an iovec for each message part, and save the Py_buffer
3542 structs to release afterwards. */
3543 if ((data_fast = PySequence_Fast(data_arg,
3544 "sendmsg() argument 1 must be an "
3545 "iterable")) == NULL)
3546 goto finally;
3547 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3548 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003549 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003550 goto finally;
3551 }
3552 msg.msg_iovlen = ndataparts;
3553 if (ndataparts > 0 &&
3554 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3555 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3556 PyErr_NoMemory();
3557 goto finally;
3558 }
3559 for (; ndatabufs < ndataparts; ndatabufs++) {
3560 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3561 "y*;sendmsg() argument 1 must be an iterable of "
3562 "buffer-compatible objects",
3563 &databufs[ndatabufs]))
3564 goto finally;
3565 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3566 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3567 }
3568
3569 if (cmsg_arg == NULL)
3570 ncmsgs = 0;
3571 else {
3572 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3573 "sendmsg() argument 2 must be an "
3574 "iterable")) == NULL)
3575 goto finally;
3576 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3577 }
3578
3579#ifndef CMSG_SPACE
3580 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003581 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003582 "sending multiple control messages is not supported "
3583 "on this system");
3584 goto finally;
3585 }
3586#endif
3587 /* Save level, type and Py_buffer for each control message,
3588 and calculate total size. */
3589 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3590 PyErr_NoMemory();
3591 goto finally;
3592 }
3593 controllen = controllen_last = 0;
3594 while (ncmsgbufs < ncmsgs) {
3595 size_t bufsize, space;
3596
3597 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3598 "(iiy*):[sendmsg() ancillary data items]",
3599 &cmsgs[ncmsgbufs].level,
3600 &cmsgs[ncmsgbufs].type,
3601 &cmsgs[ncmsgbufs].data))
3602 goto finally;
3603 bufsize = cmsgs[ncmsgbufs++].data.len;
3604
3605#ifdef CMSG_SPACE
3606 if (!get_CMSG_SPACE(bufsize, &space)) {
3607#else
3608 if (!get_CMSG_LEN(bufsize, &space)) {
3609#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003610 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003611 goto finally;
3612 }
3613 controllen += space;
3614 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003615 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003616 goto finally;
3617 }
3618 controllen_last = controllen;
3619 }
3620
3621 /* Construct ancillary data block from control message info. */
3622 if (ncmsgbufs > 0) {
3623 struct cmsghdr *cmsgh = NULL;
3624
3625 if ((msg.msg_control = controlbuf =
3626 PyMem_Malloc(controllen)) == NULL) {
3627 PyErr_NoMemory();
3628 goto finally;
3629 }
3630 msg.msg_controllen = controllen;
3631
3632 /* Need to zero out the buffer as a workaround for glibc's
3633 CMSG_NXTHDR() implementation. After getting the pointer to
3634 the next header, it checks its (uninitialized) cmsg_len
3635 member to see if the "message" fits in the buffer, and
3636 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003637 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003638 memset(controlbuf, 0, controllen);
3639
3640 for (i = 0; i < ncmsgbufs; i++) {
3641 size_t msg_len, data_len = cmsgs[i].data.len;
3642 int enough_space = 0;
3643
3644 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3645 if (cmsgh == NULL) {
3646 PyErr_Format(PyExc_RuntimeError,
3647 "unexpected NULL result from %s()",
3648 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3649 goto finally;
3650 }
3651 if (!get_CMSG_LEN(data_len, &msg_len)) {
3652 PyErr_SetString(PyExc_RuntimeError,
3653 "item size out of range for CMSG_LEN()");
3654 goto finally;
3655 }
3656 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3657 size_t space;
3658
3659 cmsgh->cmsg_len = msg_len;
3660 if (get_cmsg_data_space(&msg, cmsgh, &space))
3661 enough_space = (space >= data_len);
3662 }
3663 if (!enough_space) {
3664 PyErr_SetString(PyExc_RuntimeError,
3665 "ancillary data does not fit in calculated "
3666 "space");
3667 goto finally;
3668 }
3669 cmsgh->cmsg_level = cmsgs[i].level;
3670 cmsgh->cmsg_type = cmsgs[i].type;
3671 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3672 }
3673 }
3674
3675 /* Make the system call. */
3676 if (!IS_SELECTABLE(s)) {
3677 select_error();
3678 goto finally;
3679 }
3680
3681 BEGIN_SELECT_LOOP(s)
3682 Py_BEGIN_ALLOW_THREADS;
3683 timeout = internal_select_ex(s, 1, interval);
3684 if (!timeout)
3685 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3686 Py_END_ALLOW_THREADS;
3687 if (timeout == 1) {
3688 PyErr_SetString(socket_timeout, "timed out");
3689 goto finally;
3690 }
3691 END_SELECT_LOOP(s)
3692
3693 if (bytes_sent < 0) {
3694 s->errorhandler();
3695 goto finally;
3696 }
3697 retval = PyLong_FromSsize_t(bytes_sent);
3698
3699finally:
3700 PyMem_Free(controlbuf);
3701 for (i = 0; i < ncmsgbufs; i++)
3702 PyBuffer_Release(&cmsgs[i].data);
3703 PyMem_Free(cmsgs);
3704 Py_XDECREF(cmsg_fast);
3705 for (i = 0; i < ndatabufs; i++)
3706 PyBuffer_Release(&databufs[i]);
3707 PyMem_Free(databufs);
3708 PyMem_Free(iovs);
3709 Py_XDECREF(data_fast);
3710 return retval;
3711}
3712
3713PyDoc_STRVAR(sendmsg_doc,
3714"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3715\n\
3716Send normal and ancillary data to the socket, gathering the\n\
3717non-ancillary data from a series of buffers and concatenating it into\n\
3718a single message. The buffers argument specifies the non-ancillary\n\
3719data as an iterable of buffer-compatible objects (e.g. bytes objects).\n\
3720The ancdata argument specifies the ancillary data (control messages)\n\
3721as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3722cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3723protocol level and protocol-specific type respectively, and cmsg_data\n\
3724is a buffer-compatible object holding the associated data. The flags\n\
3725argument defaults to 0 and has the same meaning as for send(). If\n\
3726address is supplied and not None, it sets a destination address for\n\
3727the message. The return value is the number of bytes of non-ancillary\n\
3728data sent.");
3729#endif /* CMSG_LEN */
3730
3731
Guido van Rossum30a685f1991-06-27 15:51:29 +00003732/* s.shutdown(how) method */
3733
Guido van Rossum73624e91994-10-10 17:59:00 +00003734static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003735sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003737 int how;
3738 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003739
Serhiy Storchaka78980432013-01-15 01:12:17 +02003740 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 if (how == -1 && PyErr_Occurred())
3742 return NULL;
3743 Py_BEGIN_ALLOW_THREADS
3744 res = shutdown(s->sock_fd, how);
3745 Py_END_ALLOW_THREADS
3746 if (res < 0)
3747 return s->errorhandler();
3748 Py_INCREF(Py_None);
3749 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003750}
3751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003752PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003753"shutdown(flag)\n\
3754\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003755Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3756of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003757
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003758#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003759static PyObject*
3760sock_ioctl(PySocketSockObject *s, PyObject *arg)
3761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003762 unsigned long cmd = SIO_RCVALL;
3763 PyObject *argO;
3764 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003766 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3767 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 switch (cmd) {
3770 case SIO_RCVALL: {
3771 unsigned int option = RCVALL_ON;
3772 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3773 return NULL;
3774 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3775 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3776 return set_error();
3777 }
3778 return PyLong_FromUnsignedLong(recv); }
3779 case SIO_KEEPALIVE_VALS: {
3780 struct tcp_keepalive ka;
3781 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3782 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3783 return NULL;
3784 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3785 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3786 return set_error();
3787 }
3788 return PyLong_FromUnsignedLong(recv); }
3789 default:
3790 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3791 return NULL;
3792 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003793}
3794PyDoc_STRVAR(sock_ioctl_doc,
3795"ioctl(cmd, option) -> long\n\
3796\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003797Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3798SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3799SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003800#endif
3801
3802#if defined(MS_WINDOWS)
3803static PyObject*
3804sock_share(PySocketSockObject *s, PyObject *arg)
3805{
3806 WSAPROTOCOL_INFO info;
3807 DWORD processId;
3808 int result;
3809
3810 if (!PyArg_ParseTuple(arg, "I", &processId))
3811 return NULL;
3812
3813 Py_BEGIN_ALLOW_THREADS
3814 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3815 Py_END_ALLOW_THREADS
3816 if (result == SOCKET_ERROR)
3817 return set_error();
3818 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3819}
3820PyDoc_STRVAR(sock_share_doc,
3821"share(process_id) -> bytes\n\
3822\n\
3823Share the socket with another process. The target process id\n\
3824must be provided and the resulting bytes object passed to the target\n\
3825process. There the shared socket can be instantiated by calling\n\
3826socket.fromshare().");
3827
Christian Heimesfaf2f632008-01-06 16:59:19 +00003828
3829#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003830
3831/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003832
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003833static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003834 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3835 accept_doc},
3836 {"bind", (PyCFunction)sock_bind, METH_O,
3837 bind_doc},
3838 {"close", (PyCFunction)sock_close, METH_NOARGS,
3839 close_doc},
3840 {"connect", (PyCFunction)sock_connect, METH_O,
3841 connect_doc},
3842 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3843 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003844 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3845 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003846 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3847 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003848#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003849 {"getpeername", (PyCFunction)sock_getpeername,
3850 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003852 {"getsockname", (PyCFunction)sock_getsockname,
3853 METH_NOARGS, getsockname_doc},
3854 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3855 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003856#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003857 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3858 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003859#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003860#if defined(MS_WINDOWS)
3861 {"share", (PyCFunction)sock_share, METH_VARARGS,
3862 sock_share_doc},
3863#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003864 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 listen_doc},
3866 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3867 recv_doc},
3868 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3869 recv_into_doc},
3870 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3871 recvfrom_doc},
3872 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3873 recvfrom_into_doc},
3874 {"send", (PyCFunction)sock_send, METH_VARARGS,
3875 send_doc},
3876 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3877 sendall_doc},
3878 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3879 sendto_doc},
3880 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3881 setblocking_doc},
3882 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3883 settimeout_doc},
3884 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3885 gettimeout_doc},
3886 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3887 setsockopt_doc},
3888 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3889 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003890#ifdef CMSG_LEN
3891 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3892 recvmsg_doc},
3893 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3894 recvmsg_into_doc,},
3895 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3896 sendmsg_doc},
3897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003898 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003899};
3900
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003901/* SockObject members */
3902static PyMemberDef sock_memberlist[] = {
3903 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3904 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3905 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3906 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3907 {0},
3908};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003909
Guido van Rossum73624e91994-10-10 17:59:00 +00003910/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003911 First close the file description. */
3912
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003913static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003914sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003915{
Antoine Pitroue033e062010-10-29 10:38:18 +00003916 if (s->sock_fd != -1) {
3917 PyObject *exc, *val, *tb;
3918 Py_ssize_t old_refcount = Py_REFCNT(s);
3919 ++Py_REFCNT(s);
3920 PyErr_Fetch(&exc, &val, &tb);
3921 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3922 "unclosed %R", s))
3923 /* Spurious errors can appear at shutdown */
3924 if (PyErr_ExceptionMatches(PyExc_Warning))
3925 PyErr_WriteUnraisable((PyObject *) s);
3926 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003928 Py_REFCNT(s) = old_refcount;
3929 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003930 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003931}
3932
Guido van Rossum30a685f1991-06-27 15:51:29 +00003933
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003934static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003935sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003936{
Victor Stinnere254e532014-07-26 14:36:55 +02003937 long sock_fd;
3938 /* On Windows, this test is needed because SOCKET_T is unsigned */
3939 if (s->sock_fd == INVALID_SOCKET) {
3940 sock_fd = -1;
3941 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003942#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02003943 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 /* this can occur on Win64, and actually there is a special
3945 ugly printf formatter for decimal pointer length integer
3946 printing, only bother if necessary*/
3947 PyErr_SetString(PyExc_OverflowError,
3948 "no printf formatter to display "
3949 "the socket descriptor in decimal");
3950 return NULL;
3951 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003952#endif
Victor Stinnere254e532014-07-26 14:36:55 +02003953 else
3954 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003955 return PyUnicode_FromFormat(
3956 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02003957 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003958 s->sock_type,
3959 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003960}
3961
3962
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003963/* Create a new, uninitialized socket object. */
3964
3965static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003966sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003968 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003970 new = type->tp_alloc(type, 0);
3971 if (new != NULL) {
3972 ((PySocketSockObject *)new)->sock_fd = -1;
3973 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3974 ((PySocketSockObject *)new)->errorhandler = &set_error;
3975 }
3976 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003977}
3978
3979
3980/* Initialize a new socket object. */
3981
Victor Stinnerdaf45552013-08-28 00:53:59 +02003982#ifdef SOCK_CLOEXEC
3983/* socket() and socketpair() fail with EINVAL on Linux kernel older
3984 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3985static int sock_cloexec_works = -1;
3986#endif
3987
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003988/*ARGSUSED*/
3989static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003990sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003992 PySocketSockObject *s = (PySocketSockObject *)self;
3993 PyObject *fdobj = NULL;
3994 SOCKET_T fd = INVALID_SOCKET;
3995 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3996 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003997#ifndef MS_WINDOWS
3998#ifdef SOCK_CLOEXEC
3999 int *atomic_flag_works = &sock_cloexec_works;
4000#else
4001 int *atomic_flag_works = NULL;
4002#endif
4003#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004005 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4006 "|iiiO:socket", keywords,
4007 &family, &type, &proto, &fdobj))
4008 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004010 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004011#ifdef MS_WINDOWS
4012 /* recreate a socket that was duplicated */
4013 if (PyBytes_Check(fdobj)) {
4014 WSAPROTOCOL_INFO info;
4015 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4016 PyErr_Format(PyExc_ValueError,
4017 "socket descriptor string has wrong size, "
4018 "should be %zu bytes.", sizeof(info));
4019 return -1;
4020 }
4021 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4022 Py_BEGIN_ALLOW_THREADS
4023 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4024 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4025 Py_END_ALLOW_THREADS
4026 if (fd == INVALID_SOCKET) {
4027 set_error();
4028 return -1;
4029 }
4030 family = info.iAddressFamily;
4031 type = info.iSocketType;
4032 proto = info.iProtocol;
4033 }
4034 else
4035#endif
4036 {
4037 fd = PyLong_AsSocket_t(fdobj);
4038 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4039 return -1;
4040 if (fd == INVALID_SOCKET) {
4041 PyErr_SetString(PyExc_ValueError,
4042 "can't use invalid socket value");
4043 return -1;
4044 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004045 }
4046 }
4047 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004048#ifdef MS_WINDOWS
4049 /* Windows implementation */
4050#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4051#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4052#endif
4053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004055 if (support_wsa_no_inherit) {
4056 fd = WSASocket(family, type, proto,
4057 NULL, 0,
4058 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4059 if (fd == INVALID_SOCKET) {
4060 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4061 support_wsa_no_inherit = 0;
4062 fd = socket(family, type, proto);
4063 }
4064 }
4065 else {
4066 fd = socket(family, type, proto);
4067 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 if (fd == INVALID_SOCKET) {
4071 set_error();
4072 return -1;
4073 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004074
4075 if (!support_wsa_no_inherit) {
4076 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4077 closesocket(fd);
4078 PyErr_SetFromWindowsErr(0);
4079 return -1;
4080 }
4081 }
4082#else
4083 /* UNIX */
4084 Py_BEGIN_ALLOW_THREADS
4085#ifdef SOCK_CLOEXEC
4086 if (sock_cloexec_works != 0) {
4087 fd = socket(family, type | SOCK_CLOEXEC, proto);
4088 if (sock_cloexec_works == -1) {
4089 if (fd >= 0) {
4090 sock_cloexec_works = 1;
4091 }
4092 else if (errno == EINVAL) {
4093 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4094 sock_cloexec_works = 0;
4095 fd = socket(family, type, proto);
4096 }
4097 }
4098 }
4099 else
4100#endif
4101 {
4102 fd = socket(family, type, proto);
4103 }
4104 Py_END_ALLOW_THREADS
4105
4106 if (fd == INVALID_SOCKET) {
4107 set_error();
4108 return -1;
4109 }
4110
4111 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4112 SOCKETCLOSE(fd);
4113 return -1;
4114 }
4115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004116 }
4117 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004120
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004121}
4122
4123
Guido van Rossumb6775db1994-08-01 11:34:53 +00004124/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004125
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004126static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4128 "_socket.socket", /* tp_name */
4129 sizeof(PySocketSockObject), /* tp_basicsize */
4130 0, /* tp_itemsize */
4131 (destructor)sock_dealloc, /* tp_dealloc */
4132 0, /* tp_print */
4133 0, /* tp_getattr */
4134 0, /* tp_setattr */
4135 0, /* tp_reserved */
4136 (reprfunc)sock_repr, /* tp_repr */
4137 0, /* tp_as_number */
4138 0, /* tp_as_sequence */
4139 0, /* tp_as_mapping */
4140 0, /* tp_hash */
4141 0, /* tp_call */
4142 0, /* tp_str */
4143 PyObject_GenericGetAttr, /* tp_getattro */
4144 0, /* tp_setattro */
4145 0, /* tp_as_buffer */
4146 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4147 sock_doc, /* tp_doc */
4148 0, /* tp_traverse */
4149 0, /* tp_clear */
4150 0, /* tp_richcompare */
4151 0, /* tp_weaklistoffset */
4152 0, /* tp_iter */
4153 0, /* tp_iternext */
4154 sock_methods, /* tp_methods */
4155 sock_memberlist, /* tp_members */
4156 0, /* tp_getset */
4157 0, /* tp_base */
4158 0, /* tp_dict */
4159 0, /* tp_descr_get */
4160 0, /* tp_descr_set */
4161 0, /* tp_dictoffset */
4162 sock_initobj, /* tp_init */
4163 PyType_GenericAlloc, /* tp_alloc */
4164 sock_new, /* tp_new */
4165 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004166};
4167
Guido van Rossum30a685f1991-06-27 15:51:29 +00004168
Guido van Rossum81194471991-07-27 21:42:02 +00004169/* Python interface to gethostname(). */
4170
4171/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004172static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004173socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004174{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004175#ifdef MS_WINDOWS
4176 /* Don't use winsock's gethostname, as this returns the ANSI
4177 version of the hostname, whereas we need a Unicode string.
4178 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004179 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004180 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004181 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004182 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004183
4184 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004185 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004186
4187 if (GetLastError() != ERROR_MORE_DATA)
4188 return PyErr_SetFromWindowsErr(0);
4189
4190 if (size == 0)
4191 return PyUnicode_New(0, 0);
4192
4193 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4194 names */
4195 name = PyMem_Malloc(size * sizeof(wchar_t));
4196 if (!name)
4197 return NULL;
4198 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4199 name,
4200 &size))
4201 {
4202 PyMem_Free(name);
4203 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004204 }
Victor Stinner74168972011-11-17 01:11:36 +01004205
4206 result = PyUnicode_FromWideChar(name, size);
4207 PyMem_Free(name);
4208 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004209#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 char buf[1024];
4211 int res;
4212 Py_BEGIN_ALLOW_THREADS
4213 res = gethostname(buf, (int) sizeof buf - 1);
4214 Py_END_ALLOW_THREADS
4215 if (res < 0)
4216 return set_error();
4217 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004218 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004219#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004220}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004222PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004223"gethostname() -> string\n\
4224\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004225Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004226
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004227#ifdef HAVE_SETHOSTNAME
4228PyDoc_STRVAR(sethostname_doc,
4229"sethostname(name)\n\n\
4230Sets the hostname to name.");
4231
4232static PyObject *
4233socket_sethostname(PyObject *self, PyObject *args)
4234{
4235 PyObject *hnobj;
4236 Py_buffer buf;
4237 int res, flag = 0;
4238
Christian Heimesd2774c72013-06-19 02:06:29 +02004239#ifdef _AIX
4240/* issue #18259, not declared in any useful header file */
4241extern int sethostname(const char *, size_t);
4242#endif
4243
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004244 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4245 PyErr_Clear();
4246 if (!PyArg_ParseTuple(args, "O&:sethostname",
4247 PyUnicode_FSConverter, &hnobj))
4248 return NULL;
4249 flag = 1;
4250 }
4251 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4252 if (!res) {
4253 res = sethostname(buf.buf, buf.len);
4254 PyBuffer_Release(&buf);
4255 }
4256 if (flag)
4257 Py_DECREF(hnobj);
4258 if (res)
4259 return set_error();
4260 Py_RETURN_NONE;
4261}
4262#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004263
Guido van Rossum30a685f1991-06-27 15:51:29 +00004264/* Python interface to gethostbyname(name). */
4265
4266/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004267static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004268socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 char *name;
4271 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004272 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004273
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004274 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 return NULL;
4276 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004277 goto finally;
4278 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4279finally:
4280 PyMem_Free(name);
4281 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004282}
4283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004284PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004285"gethostbyname(host) -> address\n\
4286\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004287Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004288
4289
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004290/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4291
4292static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004293gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004294{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004295 char **pch;
4296 PyObject *rtn_tuple = (PyObject *)NULL;
4297 PyObject *name_list = (PyObject *)NULL;
4298 PyObject *addr_list = (PyObject *)NULL;
4299 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004301 if (h == NULL) {
4302 /* Let's get real error message to return */
4303 set_herror(h_errno);
4304 return NULL;
4305 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004307 if (h->h_addrtype != af) {
4308 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004309 errno = EAFNOSUPPORT;
4310 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 return NULL;
4312 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 case AF_INET:
4317 if (alen < sizeof(struct sockaddr_in))
4318 return NULL;
4319 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004320
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004321#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 case AF_INET6:
4323 if (alen < sizeof(struct sockaddr_in6))
4324 return NULL;
4325 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004326#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004330 if ((name_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 if ((addr_list = PyList_New(0)) == NULL)
4334 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 /* SF #1511317: h_aliases can be NULL */
4337 if (h->h_aliases) {
4338 for (pch = h->h_aliases; *pch != NULL; pch++) {
4339 int status;
4340 tmp = PyUnicode_FromString(*pch);
4341 if (tmp == NULL)
4342 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 status = PyList_Append(name_list, tmp);
4345 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004346
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004347 if (status)
4348 goto err;
4349 }
4350 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4353 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004357 case AF_INET:
4358 {
4359 struct sockaddr_in sin;
4360 memset(&sin, 0, sizeof(sin));
4361 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004362#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004365 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4366 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 if (pch == h->h_addr_list && alen >= sizeof(sin))
4369 memcpy((char *) addr, &sin, sizeof(sin));
4370 break;
4371 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004372
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004373#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 case AF_INET6:
4375 {
4376 struct sockaddr_in6 sin6;
4377 memset(&sin6, 0, sizeof(sin6));
4378 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004379#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004382 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4383 tmp = makeipaddr((struct sockaddr *)&sin6,
4384 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4387 memcpy((char *) addr, &sin6, sizeof(sin6));
4388 break;
4389 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004390#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004392 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004393 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 "unsupported address family");
4395 return NULL;
4396 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004398 if (tmp == NULL)
4399 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 status = PyList_Append(addr_list, tmp);
4402 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 if (status)
4405 goto err;
4406 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004409
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004410 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 Py_XDECREF(name_list);
4412 Py_XDECREF(addr_list);
4413 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004414}
4415
4416
4417/* Python interface to gethostbyname_ex(name). */
4418
4419/*ARGSUSED*/
4420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004421socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 char *name;
4424 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004425 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004427 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004428#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004430#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004432#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 char buf[16384];
4434 int buf_len = (sizeof buf) - 1;
4435 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004436#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004437#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004439#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004440#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004441
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004442 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004443 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004444 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004445 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004447#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004448#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004449 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004450 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004451#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004453#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004454 memset((void *) &data, '\0', sizeof(data));
4455 result = gethostbyname_r(name, &hp_allocated, &data);
4456 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004457#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004458#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004459#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004463#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 Py_END_ALLOW_THREADS
4465 /* Some C libraries would require addr.__ss_family instead of
4466 addr.ss_family.
4467 Therefore, we cast the sockaddr_storage into sockaddr to
4468 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004469 sa = SAS2SA(&addr);
4470 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004472#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004474#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004475finally:
4476 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004477 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004478}
4479
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004480PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004481"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4482\n\
4483Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004484for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004485
4486
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004487/* Python interface to gethostbyaddr(IP). */
4488
4489/*ARGSUSED*/
4490static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004491socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004492{
Charles-François Natali8b759652011-12-23 16:44:51 +01004493 sock_addr_t addr;
4494 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 char *ip_num;
4496 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004497 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004498#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004500#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004502#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004503 /* glibcs up to 2.10 assume that the buf argument to
4504 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4505 does not ensure. The attribute below instructs the compiler
4506 to maintain this alignment. */
4507 char buf[16384] Py_ALIGNED(8);
4508 int buf_len = (sizeof buf) - 1;
4509 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004510#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004511#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004512 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004513#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004514#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004515 char *ap;
4516 int al;
4517 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004518
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004519 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 return NULL;
4521 af = AF_UNSPEC;
4522 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004523 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 af = sa->sa_family;
4525 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004526 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 switch (af) {
4528 case AF_INET:
4529 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4530 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4531 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004532#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 case AF_INET6:
4534 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4535 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4536 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004539 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004540 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 }
4542 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004543#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004544#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004545 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 &hp_allocated, buf, buf_len,
4547 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004548#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 h = gethostbyaddr_r(ap, al, af,
4550 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004551#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 memset((void *) &data, '\0', sizeof(data));
4553 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4554 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004555#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004556#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004557#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004561#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004563 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004564#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004566#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004567finally:
4568 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004570}
4571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004572PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004573"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4574\n\
4575Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004576for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004577
Guido van Rossum30a685f1991-06-27 15:51:29 +00004578
4579/* Python interface to getservbyname(name).
4580 This only returns the port number, since the other info is already
4581 known or not useful (like the list of aliases). */
4582
4583/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004584static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004585socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 char *name, *proto=NULL;
4588 struct servent *sp;
4589 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4590 return NULL;
4591 Py_BEGIN_ALLOW_THREADS
4592 sp = getservbyname(name, proto);
4593 Py_END_ALLOW_THREADS
4594 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004595 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 return NULL;
4597 }
4598 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004599}
4600
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004601PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004602"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004603\n\
4604Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004605The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4606otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004607
Guido van Rossum30a685f1991-06-27 15:51:29 +00004608
Barry Warsaw11b91a02004-06-28 00:50:43 +00004609/* Python interface to getservbyport(port).
4610 This only returns the service name, since the other info is already
4611 known or not useful (like the list of aliases). */
4612
4613/*ARGSUSED*/
4614static PyObject *
4615socket_getservbyport(PyObject *self, PyObject *args)
4616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 int port;
4618 char *proto=NULL;
4619 struct servent *sp;
4620 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4621 return NULL;
4622 if (port < 0 || port > 0xffff) {
4623 PyErr_SetString(
4624 PyExc_OverflowError,
4625 "getservbyport: port must be 0-65535.");
4626 return NULL;
4627 }
4628 Py_BEGIN_ALLOW_THREADS
4629 sp = getservbyport(htons((short)port), proto);
4630 Py_END_ALLOW_THREADS
4631 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004632 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 return NULL;
4634 }
4635 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004636}
4637
4638PyDoc_STRVAR(getservbyport_doc,
4639"getservbyport(port[, protocolname]) -> string\n\
4640\n\
4641Return the service name from a port number and protocol name.\n\
4642The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4643otherwise any protocol will match.");
4644
Guido van Rossum3901d851996-12-19 16:35:04 +00004645/* Python interface to getprotobyname(name).
4646 This only returns the protocol number, since the other info is
4647 already known or not useful (like the list of aliases). */
4648
4649/*ARGSUSED*/
4650static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004651socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004652{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004653 char *name;
4654 struct protoent *sp;
4655 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4656 return NULL;
4657 Py_BEGIN_ALLOW_THREADS
4658 sp = getprotobyname(name);
4659 Py_END_ALLOW_THREADS
4660 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004661 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 return NULL;
4663 }
4664 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004665}
4666
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004667PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004668"getprotobyname(name) -> integer\n\
4669\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004670Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004671
Guido van Rossum3901d851996-12-19 16:35:04 +00004672
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004673#ifndef NO_DUP
4674/* dup() function for socket fds */
4675
4676static PyObject *
4677socket_dup(PyObject *self, PyObject *fdobj)
4678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 SOCKET_T fd, newfd;
4680 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004681#ifdef MS_WINDOWS
4682 WSAPROTOCOL_INFO info;
4683#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 fd = PyLong_AsSocket_t(fdobj);
4686 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4687 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004688
Victor Stinnerdaf45552013-08-28 00:53:59 +02004689#ifdef MS_WINDOWS
4690 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4691 return set_error();
4692
4693 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4694 FROM_PROTOCOL_INFO,
4695 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 if (newfd == INVALID_SOCKET)
4697 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004698
Victor Stinnerdaf45552013-08-28 00:53:59 +02004699 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4700 closesocket(newfd);
4701 PyErr_SetFromWindowsErr(0);
4702 return NULL;
4703 }
4704#else
4705 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4706 newfd = _Py_dup(fd);
4707 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004708 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004709#endif
4710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 newfdobj = PyLong_FromSocket_t(newfd);
4712 if (newfdobj == NULL)
4713 SOCKETCLOSE(newfd);
4714 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004715}
4716
4717PyDoc_STRVAR(dup_doc,
4718"dup(integer) -> integer\n\
4719\n\
4720Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4721sockets; on some platforms os.dup() won't work for socket file descriptors.");
4722#endif
4723
4724
Dave Cole331708b2004-08-09 04:51:41 +00004725#ifdef HAVE_SOCKETPAIR
4726/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004727 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004728 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004729
4730/*ARGSUSED*/
4731static PyObject *
4732socket_socketpair(PyObject *self, PyObject *args)
4733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004734 PySocketSockObject *s0 = NULL, *s1 = NULL;
4735 SOCKET_T sv[2];
4736 int family, type = SOCK_STREAM, proto = 0;
4737 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004738#ifdef SOCK_CLOEXEC
4739 int *atomic_flag_works = &sock_cloexec_works;
4740#else
4741 int *atomic_flag_works = NULL;
4742#endif
4743 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004744
4745#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004747#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004749#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4751 &family, &type, &proto))
4752 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004755 Py_BEGIN_ALLOW_THREADS
4756#ifdef SOCK_CLOEXEC
4757 if (sock_cloexec_works != 0) {
4758 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4759 if (sock_cloexec_works == -1) {
4760 if (ret >= 0) {
4761 sock_cloexec_works = 1;
4762 }
4763 else if (errno == EINVAL) {
4764 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4765 sock_cloexec_works = 0;
4766 ret = socketpair(family, type, proto, sv);
4767 }
4768 }
4769 }
4770 else
4771#endif
4772 {
4773 ret = socketpair(family, type, proto, sv);
4774 }
4775 Py_END_ALLOW_THREADS
4776
4777 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004779
4780 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4781 goto finally;
4782 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4783 goto finally;
4784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 s0 = new_sockobject(sv[0], family, type, proto);
4786 if (s0 == NULL)
4787 goto finally;
4788 s1 = new_sockobject(sv[1], family, type, proto);
4789 if (s1 == NULL)
4790 goto finally;
4791 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004792
4793finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 if (res == NULL) {
4795 if (s0 == NULL)
4796 SOCKETCLOSE(sv[0]);
4797 if (s1 == NULL)
4798 SOCKETCLOSE(sv[1]);
4799 }
4800 Py_XDECREF(s0);
4801 Py_XDECREF(s1);
4802 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004803}
4804
4805PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004806"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004807\n\
4808Create a pair of socket objects from the sockets returned by the platform\n\
4809socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004810The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004811AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004812
4813#endif /* HAVE_SOCKETPAIR */
4814
4815
Guido van Rossum006bf911996-06-12 04:04:55 +00004816static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004817socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4822 return NULL;
4823 }
4824 if (x1 < 0) {
4825 PyErr_SetString(PyExc_OverflowError,
4826 "can't convert negative number to unsigned long");
4827 return NULL;
4828 }
4829 x2 = (unsigned int)ntohs((unsigned short)x1);
4830 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004831}
4832
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004833PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004834"ntohs(integer) -> integer\n\
4835\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004836Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004837
4838
Guido van Rossum006bf911996-06-12 04:04:55 +00004839static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004840socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004843
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004844 if (PyLong_Check(arg)) {
4845 x = PyLong_AsUnsignedLong(arg);
4846 if (x == (unsigned long) -1 && PyErr_Occurred())
4847 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004848#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004849 {
4850 unsigned long y;
4851 /* only want the trailing 32 bits */
4852 y = x & 0xFFFFFFFFUL;
4853 if (y ^ x)
4854 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004855 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 x = y;
4857 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 }
4860 else
4861 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004862 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004863 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004865}
4866
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004867PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004868"ntohl(integer) -> integer\n\
4869\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004870Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004871
4872
Guido van Rossum006bf911996-06-12 04:04:55 +00004873static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004874socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004876 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4879 return NULL;
4880 }
4881 if (x1 < 0) {
4882 PyErr_SetString(PyExc_OverflowError,
4883 "can't convert negative number to unsigned long");
4884 return NULL;
4885 }
4886 x2 = (unsigned int)htons((unsigned short)x1);
4887 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004888}
4889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004890PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004891"htons(integer) -> integer\n\
4892\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004893Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004894
4895
Guido van Rossum006bf911996-06-12 04:04:55 +00004896static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004897socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004898{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 if (PyLong_Check(arg)) {
4902 x = PyLong_AsUnsignedLong(arg);
4903 if (x == (unsigned long) -1 && PyErr_Occurred())
4904 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004905#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004906 {
4907 unsigned long y;
4908 /* only want the trailing 32 bits */
4909 y = x & 0xFFFFFFFFUL;
4910 if (y ^ x)
4911 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004912 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 x = y;
4914 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 }
4917 else
4918 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004919 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 Py_TYPE(arg)->tp_name);
4921 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004922}
4923
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004924PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004925"htonl(integer) -> integer\n\
4926\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004927Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004928
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004929/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004931PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004932"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004933\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004934Convert 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 +00004935binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004936
4937static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004938socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004939{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004940#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004941 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004942#endif
4943
4944#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004945#if (SIZEOF_INT != 4)
4946#error "Not sure if in_addr_t exists and int is not 32-bits."
4947#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 /* Have to use inet_addr() instead */
4949 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004950#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4954 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004955
Tim Peters1df9fdd2003-02-13 03:13:40 +00004956
4957#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004958
4959#ifdef USE_INET_ATON_WEAKLINK
4960 if (inet_aton != NULL) {
4961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004962 if (inet_aton(ip_addr, &buf))
4963 return PyBytes_FromStringAndSize((char *)(&buf),
4964 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004965
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004966 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 "illegal IP address string passed to inet_aton");
4968 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004969
Thomas Wouters477c8d52006-05-27 19:21:47 +00004970#ifdef USE_INET_ATON_WEAKLINK
4971 } else {
4972#endif
4973
4974#endif
4975
4976#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 /* special-case this address as inet_addr might return INADDR_NONE
4979 * for this */
4980 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004981 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004986 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004987 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 "illegal IP address string passed to inet_aton");
4989 return NULL;
4990 }
4991 }
4992 return PyBytes_FromStringAndSize((char *) &packed_addr,
4993 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004994
4995#ifdef USE_INET_ATON_WEAKLINK
4996 }
4997#endif
4998
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004999#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005000}
5001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005002PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005003"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005004\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005005Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005006
5007static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005008socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 char *packed_str;
5011 int addr_len;
5012 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005013
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005014 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
5015 return NULL;
5016 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005019 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 "packed IP wrong length for inet_ntoa");
5021 return NULL;
5022 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005023
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005024 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005026 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005027}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005028
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005029#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005030
5031PyDoc_STRVAR(inet_pton_doc,
5032"inet_pton(af, ip) -> packed IP address string\n\
5033\n\
5034Convert an IP address from string format to a packed string suitable\n\
5035for use with low-level network functions.");
5036
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005037#endif
5038
5039#ifdef HAVE_INET_PTON
5040
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005041static PyObject *
5042socket_inet_pton(PyObject *self, PyObject *args)
5043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 int af;
5045 char* ip;
5046 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005047#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005048 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005049#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005051#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005052 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5053 return NULL;
5054 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005055
Martin v. Löwis04697e82004-06-02 12:35:29 +00005056#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005058 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005059 "can't use AF_INET6, IPv6 is disabled");
5060 return NULL;
5061 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005062#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 retval = inet_pton(af, ip, packed);
5065 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005066 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 return NULL;
5068 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005069 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 "illegal IP address string passed to inet_pton");
5071 return NULL;
5072 } else if (af == AF_INET) {
5073 return PyBytes_FromStringAndSize(packed,
5074 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005075#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005076 } else if (af == AF_INET6) {
5077 return PyBytes_FromStringAndSize(packed,
5078 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005079#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005080 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005081 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 return NULL;
5083 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005084}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005085#elif defined(MS_WINDOWS)
5086
5087static PyObject *
5088socket_inet_pton(PyObject *self, PyObject *args)
5089{
5090 int af;
5091 char* ip;
5092 struct sockaddr_in6 addr;
5093 INT ret, size;
5094
5095 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5096 return NULL;
5097 }
5098
Victor Stinnere990c6e2013-11-16 00:18:58 +01005099 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005100 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5101
5102 if (ret) {
5103 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5104 return NULL;
5105 } else if(af == AF_INET) {
5106 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005107 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005108 sizeof(addr4->sin_addr));
5109 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005110 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005111 sizeof(addr.sin6_addr));
5112 } else {
5113 PyErr_SetString(PyExc_OSError, "unknown address family");
5114 return NULL;
5115 }
5116}
5117
5118#endif
5119
5120#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005121
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005122PyDoc_STRVAR(inet_ntop_doc,
5123"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5124\n\
5125Convert a packed IP address of the given family to string format.");
5126
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005127#endif
5128
5129
5130#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005131static PyObject *
5132socket_inet_ntop(PyObject *self, PyObject *args)
5133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005134 int af;
5135 char* packed;
5136 int len;
5137 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005138#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005139 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005140#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005142#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5145 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5148 return NULL;
5149 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 if (af == AF_INET) {
5152 if (len != sizeof(struct in_addr)) {
5153 PyErr_SetString(PyExc_ValueError,
5154 "invalid length of packed IP address string");
5155 return NULL;
5156 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005157#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005158 } else if (af == AF_INET6) {
5159 if (len != sizeof(struct in6_addr)) {
5160 PyErr_SetString(PyExc_ValueError,
5161 "invalid length of packed IP address string");
5162 return NULL;
5163 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 } else {
5166 PyErr_Format(PyExc_ValueError,
5167 "unknown address family %d", af);
5168 return NULL;
5169 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 retval = inet_ntop(af, packed, ip, sizeof(ip));
5172 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005173 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 return NULL;
5175 } else {
5176 return PyUnicode_FromString(retval);
5177 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 /* NOTREACHED */
5180 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5181 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005182}
5183
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005184#elif defined(MS_WINDOWS)
5185
5186static PyObject *
5187socket_inet_ntop(PyObject *self, PyObject *args)
5188{
5189 int af;
5190 char* packed;
5191 int len;
5192 struct sockaddr_in6 addr;
5193 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005194#ifdef ENABLE_IPV6
5195 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5196#else
5197 char ip[INET_ADDRSTRLEN + 1];
5198#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005199
5200 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5201 memset((void *) &ip[0], '\0', sizeof(ip));
5202
5203 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5204 return NULL;
5205 }
5206
5207 if (af == AF_INET) {
5208 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5209
5210 if (len != sizeof(struct in_addr)) {
5211 PyErr_SetString(PyExc_ValueError,
5212 "invalid length of packed IP address string");
5213 return NULL;
5214 }
5215 memset(addr4, 0, sizeof(struct sockaddr_in));
5216 addr4->sin_family = AF_INET;
5217 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5218 addrlen = sizeof(struct sockaddr_in);
5219 } else if (af == AF_INET6) {
5220 if (len != sizeof(struct in6_addr)) {
5221 PyErr_SetString(PyExc_ValueError,
5222 "invalid length of packed IP address string");
5223 return NULL;
5224 }
5225
5226 memset(&addr, 0, sizeof(addr));
5227 addr.sin6_family = AF_INET6;
5228 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5229 addrlen = sizeof(addr);
5230 } else {
5231 PyErr_Format(PyExc_ValueError,
5232 "unknown address family %d", af);
5233 return NULL;
5234 }
5235
5236 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005237 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005238 ip, &retlen);
5239
5240 if (ret) {
5241 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5242 return NULL;
5243 } else {
5244 return PyUnicode_FromString(ip);
5245 }
5246}
5247
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005248#endif /* HAVE_INET_PTON */
5249
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005250/* Python interface to getaddrinfo(host, port). */
5251
5252/*ARGSUSED*/
5253static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005254socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005255{
Victor Stinner77af1722011-05-26 14:05:59 +02005256 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005257 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 struct addrinfo hints, *res;
5259 struct addrinfo *res0 = NULL;
5260 PyObject *hobj = NULL;
5261 PyObject *pobj = (PyObject *)NULL;
5262 char pbuf[30];
5263 char *hptr, *pptr;
5264 int family, socktype, protocol, flags;
5265 int error;
5266 PyObject *all = (PyObject *)NULL;
5267 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005268
Georg Brandl6083a4b2013-10-14 06:51:46 +02005269 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005271 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005272 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 &protocol, &flags)) {
5274 return NULL;
5275 }
5276 if (hobj == Py_None) {
5277 hptr = NULL;
5278 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005279 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005280
5281 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005282 if (!idna)
5283 return NULL;
5284 assert(PyBytes_Check(idna));
5285 hptr = PyBytes_AS_STRING(idna);
5286 } else if (PyBytes_Check(hobj)) {
5287 hptr = PyBytes_AsString(hobj);
5288 } else {
5289 PyErr_SetString(PyExc_TypeError,
5290 "getaddrinfo() argument 1 must be string or None");
5291 return NULL;
5292 }
5293 if (PyLong_CheckExact(pobj)) {
5294 long value = PyLong_AsLong(pobj);
5295 if (value == -1 && PyErr_Occurred())
5296 goto err;
5297 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5298 pptr = pbuf;
5299 } else if (PyUnicode_Check(pobj)) {
5300 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005301 if (pptr == NULL)
5302 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005304 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 } else if (pobj == Py_None) {
5306 pptr = (char *)NULL;
5307 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005308 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 goto err;
5310 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005311#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005312 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5313 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005314 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5315 * This workaround avoids a segfault in libsystem.
5316 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005317 pptr = "00";
5318 }
5319#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 memset(&hints, 0, sizeof(hints));
5321 hints.ai_family = family;
5322 hints.ai_socktype = socktype;
5323 hints.ai_protocol = protocol;
5324 hints.ai_flags = flags;
5325 Py_BEGIN_ALLOW_THREADS
5326 ACQUIRE_GETADDRINFO_LOCK
5327 error = getaddrinfo(hptr, pptr, &hints, &res0);
5328 Py_END_ALLOW_THREADS
5329 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5330 if (error) {
5331 set_gaierror(error);
5332 goto err;
5333 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 if ((all = PyList_New(0)) == NULL)
5336 goto err;
5337 for (res = res0; res; res = res->ai_next) {
5338 PyObject *single;
5339 PyObject *addr =
5340 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5341 if (addr == NULL)
5342 goto err;
5343 single = Py_BuildValue("iiisO", res->ai_family,
5344 res->ai_socktype, res->ai_protocol,
5345 res->ai_canonname ? res->ai_canonname : "",
5346 addr);
5347 Py_DECREF(addr);
5348 if (single == NULL)
5349 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 if (PyList_Append(all, single))
5352 goto err;
5353 Py_XDECREF(single);
5354 }
5355 Py_XDECREF(idna);
5356 if (res0)
5357 freeaddrinfo(res0);
5358 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005359 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 Py_XDECREF(all);
5361 Py_XDECREF(idna);
5362 if (res0)
5363 freeaddrinfo(res0);
5364 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005365}
5366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005367PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005368"getaddrinfo(host, port [, family, type, proto, flags])\n\
5369 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005370\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005371Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005372
5373/* Python interface to getnameinfo(sa, flags). */
5374
5375/*ARGSUSED*/
5376static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005377socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005379 PyObject *sa = (PyObject *)NULL;
5380 int flags;
5381 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005382 int port;
5383 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5385 struct addrinfo hints, *res = NULL;
5386 int error;
5387 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005388
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 flags = flowinfo = scope_id = 0;
5390 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5391 return NULL;
5392 if (!PyTuple_Check(sa)) {
5393 PyErr_SetString(PyExc_TypeError,
5394 "getnameinfo() argument 1 must be a tuple");
5395 return NULL;
5396 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005397 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005398 &hostp, &port, &flowinfo, &scope_id))
5399 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005400 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005401 PyErr_SetString(PyExc_OverflowError,
5402 "getsockaddrarg: flowinfo must be 0-1048575.");
5403 return NULL;
5404 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5406 memset(&hints, 0, sizeof(hints));
5407 hints.ai_family = AF_UNSPEC;
5408 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005409 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 Py_BEGIN_ALLOW_THREADS
5411 ACQUIRE_GETADDRINFO_LOCK
5412 error = getaddrinfo(hostp, pbuf, &hints, &res);
5413 Py_END_ALLOW_THREADS
5414 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5415 if (error) {
5416 set_gaierror(error);
5417 goto fail;
5418 }
5419 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005420 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005421 "sockaddr resolved to multiple addresses");
5422 goto fail;
5423 }
5424 switch (res->ai_family) {
5425 case AF_INET:
5426 {
5427 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005428 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 "IPv4 sockaddr must be 2 tuple");
5430 goto fail;
5431 }
5432 break;
5433 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005434#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 case AF_INET6:
5436 {
5437 struct sockaddr_in6 *sin6;
5438 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005439 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 sin6->sin6_scope_id = scope_id;
5441 break;
5442 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005444 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005445 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5447 if (error) {
5448 set_gaierror(error);
5449 goto fail;
5450 }
5451 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005452
5453fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005454 if (res)
5455 freeaddrinfo(res);
5456 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005457}
5458
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005459PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005460"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005461\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005462Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005463
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005464
5465/* Python API to getting and setting the default timeout value. */
5466
5467static PyObject *
5468socket_getdefaulttimeout(PyObject *self)
5469{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005470 if (defaulttimeout < 0.0) {
5471 Py_INCREF(Py_None);
5472 return Py_None;
5473 }
5474 else
5475 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005476}
5477
5478PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005479"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005480\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005481Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005482A value of None indicates that new socket objects have no timeout.\n\
5483When the socket module is first imported, the default is None.");
5484
5485static PyObject *
5486socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5487{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005488 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 if (arg == Py_None)
5491 timeout = -1.0;
5492 else {
5493 timeout = PyFloat_AsDouble(arg);
5494 if (timeout < 0.0) {
5495 if (!PyErr_Occurred())
5496 PyErr_SetString(PyExc_ValueError,
5497 "Timeout value out of range");
5498 return NULL;
5499 }
5500 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 Py_INCREF(Py_None);
5505 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005506}
5507
5508PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005509"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005510\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005511Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005512A value of None indicates that new socket objects have no timeout.\n\
5513When the socket module is first imported, the default is None.");
5514
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005515#ifdef HAVE_IF_NAMEINDEX
5516/* Python API for getting interface indices and names */
5517
5518static PyObject *
5519socket_if_nameindex(PyObject *self, PyObject *arg)
5520{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005521 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005522 int i;
5523 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005524
Charles-François Natali60713592011-05-20 16:55:06 +02005525 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005526 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005527 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005528 return NULL;
5529 }
5530
5531 list = PyList_New(0);
5532 if (list == NULL) {
5533 if_freenameindex(ni);
5534 return NULL;
5535 }
5536
Charles-François Natali60713592011-05-20 16:55:06 +02005537 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5538 PyObject *ni_tuple = Py_BuildValue("IO&",
5539 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005540
5541 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5542 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005543 Py_DECREF(list);
5544 if_freenameindex(ni);
5545 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005546 }
5547 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005548 }
5549
5550 if_freenameindex(ni);
5551 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005552}
5553
5554PyDoc_STRVAR(if_nameindex_doc,
5555"if_nameindex()\n\
5556\n\
5557Returns a list of network interface information (index, name) tuples.");
5558
Charles-François Natali60713592011-05-20 16:55:06 +02005559static PyObject *
5560socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005561{
Charles-François Natali60713592011-05-20 16:55:06 +02005562 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005563 unsigned long index;
5564
Charles-François Natali60713592011-05-20 16:55:06 +02005565 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5566 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005567 return NULL;
5568
Charles-François Natali60713592011-05-20 16:55:06 +02005569 index = if_nametoindex(PyBytes_AS_STRING(oname));
5570 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005571 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005572 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005573 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005574 return NULL;
5575 }
5576
5577 return PyLong_FromUnsignedLong(index);
5578}
5579
5580PyDoc_STRVAR(if_nametoindex_doc,
5581"if_nametoindex(if_name)\n\
5582\n\
5583Returns the interface index corresponding to the interface name if_name.");
5584
Charles-François Natali60713592011-05-20 16:55:06 +02005585static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005586socket_if_indextoname(PyObject *self, PyObject *arg)
5587{
Charles-François Natali60713592011-05-20 16:55:06 +02005588 unsigned long index;
5589 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005590
Charles-François Natali60713592011-05-20 16:55:06 +02005591 index = PyLong_AsUnsignedLong(arg);
5592 if (index == (unsigned long) -1)
5593 return NULL;
5594
5595 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005596 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005597 return NULL;
5598 }
5599
Charles-François Natali60713592011-05-20 16:55:06 +02005600 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005601}
5602
5603PyDoc_STRVAR(if_indextoname_doc,
5604"if_indextoname(if_index)\n\
5605\n\
5606Returns the interface name corresponding to the interface index if_index.");
5607
5608#endif /* HAVE_IF_NAMEINDEX */
5609
5610
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005611#ifdef CMSG_LEN
5612/* Python interface to CMSG_LEN(length). */
5613
5614static PyObject *
5615socket_CMSG_LEN(PyObject *self, PyObject *args)
5616{
5617 Py_ssize_t length;
5618 size_t result;
5619
5620 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5621 return NULL;
5622 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5623 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5624 return NULL;
5625 }
5626 return PyLong_FromSize_t(result);
5627}
5628
5629PyDoc_STRVAR(CMSG_LEN_doc,
5630"CMSG_LEN(length) -> control message length\n\
5631\n\
5632Return the total length, without trailing padding, of an ancillary\n\
5633data item with associated data of the given length. This value can\n\
5634often be used as the buffer size for recvmsg() to receive a single\n\
5635item of ancillary data, but RFC 3542 requires portable applications to\n\
5636use CMSG_SPACE() and thus include space for padding, even when the\n\
5637item will be the last in the buffer. Raises OverflowError if length\n\
5638is outside the permissible range of values.");
5639
5640
5641#ifdef CMSG_SPACE
5642/* Python interface to CMSG_SPACE(length). */
5643
5644static PyObject *
5645socket_CMSG_SPACE(PyObject *self, PyObject *args)
5646{
5647 Py_ssize_t length;
5648 size_t result;
5649
5650 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5651 return NULL;
5652 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5653 PyErr_SetString(PyExc_OverflowError,
5654 "CMSG_SPACE() argument out of range");
5655 return NULL;
5656 }
5657 return PyLong_FromSize_t(result);
5658}
5659
5660PyDoc_STRVAR(CMSG_SPACE_doc,
5661"CMSG_SPACE(length) -> buffer size\n\
5662\n\
5663Return the buffer size needed for recvmsg() to receive an ancillary\n\
5664data item with associated data of the given length, along with any\n\
5665trailing padding. The buffer space needed to receive multiple items\n\
5666is the sum of the CMSG_SPACE() values for their associated data\n\
5667lengths. Raises OverflowError if length is outside the permissible\n\
5668range of values.");
5669#endif /* CMSG_SPACE */
5670#endif /* CMSG_LEN */
5671
5672
Guido van Rossum30a685f1991-06-27 15:51:29 +00005673/* List of functions exported by this module. */
5674
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005675static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005676 {"gethostbyname", socket_gethostbyname,
5677 METH_VARARGS, gethostbyname_doc},
5678 {"gethostbyname_ex", socket_gethostbyname_ex,
5679 METH_VARARGS, ghbn_ex_doc},
5680 {"gethostbyaddr", socket_gethostbyaddr,
5681 METH_VARARGS, gethostbyaddr_doc},
5682 {"gethostname", socket_gethostname,
5683 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005684#ifdef HAVE_SETHOSTNAME
5685 {"sethostname", socket_sethostname,
5686 METH_VARARGS, sethostname_doc},
5687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 {"getservbyname", socket_getservbyname,
5689 METH_VARARGS, getservbyname_doc},
5690 {"getservbyport", socket_getservbyport,
5691 METH_VARARGS, getservbyport_doc},
5692 {"getprotobyname", socket_getprotobyname,
5693 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005694#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005695 {"dup", socket_dup,
5696 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005697#endif
Dave Cole331708b2004-08-09 04:51:41 +00005698#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 {"socketpair", socket_socketpair,
5700 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 {"ntohs", socket_ntohs,
5703 METH_VARARGS, ntohs_doc},
5704 {"ntohl", socket_ntohl,
5705 METH_O, ntohl_doc},
5706 {"htons", socket_htons,
5707 METH_VARARGS, htons_doc},
5708 {"htonl", socket_htonl,
5709 METH_O, htonl_doc},
5710 {"inet_aton", socket_inet_aton,
5711 METH_VARARGS, inet_aton_doc},
5712 {"inet_ntoa", socket_inet_ntoa,
5713 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005714#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 {"inet_pton", socket_inet_pton,
5716 METH_VARARGS, inet_pton_doc},
5717 {"inet_ntop", socket_inet_ntop,
5718 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005719#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005720 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5721 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 {"getnameinfo", socket_getnameinfo,
5723 METH_VARARGS, getnameinfo_doc},
5724 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5725 METH_NOARGS, getdefaulttimeout_doc},
5726 {"setdefaulttimeout", socket_setdefaulttimeout,
5727 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005728#ifdef HAVE_IF_NAMEINDEX
5729 {"if_nameindex", socket_if_nameindex,
5730 METH_NOARGS, if_nameindex_doc},
5731 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005732 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005733 {"if_indextoname", socket_if_indextoname,
5734 METH_O, if_indextoname_doc},
5735#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005736#ifdef CMSG_LEN
5737 {"CMSG_LEN", socket_CMSG_LEN,
5738 METH_VARARGS, CMSG_LEN_doc},
5739#ifdef CMSG_SPACE
5740 {"CMSG_SPACE", socket_CMSG_SPACE,
5741 METH_VARARGS, CMSG_SPACE_doc},
5742#endif
5743#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005744 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005745};
5746
Guido van Rossum30a685f1991-06-27 15:51:29 +00005747
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005748#ifdef MS_WINDOWS
5749#define OS_INIT_DEFINED
5750
5751/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005752
5753static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005754os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005756 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005757}
5758
5759static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005760os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 WSADATA WSAData;
5763 int ret;
5764 ret = WSAStartup(0x0101, &WSAData);
5765 switch (ret) {
5766 case 0: /* No error */
5767 Py_AtExit(os_cleanup);
5768 return 1; /* Success */
5769 case WSASYSNOTREADY:
5770 PyErr_SetString(PyExc_ImportError,
5771 "WSAStartup failed: network not ready");
5772 break;
5773 case WSAVERNOTSUPPORTED:
5774 case WSAEINVAL:
5775 PyErr_SetString(
5776 PyExc_ImportError,
5777 "WSAStartup failed: requested version not supported");
5778 break;
5779 default:
5780 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5781 break;
5782 }
5783 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005784}
5785
Guido van Rossum8d665e61996-06-26 18:22:49 +00005786#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005787
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005788
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005789
5790#ifndef OS_INIT_DEFINED
5791static int
5792os_init(void)
5793{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005794 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005795}
5796#endif
5797
5798
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005799/* C API table - always add new things to the end for binary
5800 compatibility. */
5801static
5802PySocketModule_APIObject PySocketModuleAPI =
5803{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005805 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005806 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005807};
5808
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005809
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005810/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005811
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005812 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005813 "socket.py" which implements some additional functionality.
5814 The import of "_socket" may fail with an ImportError exception if
5815 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005816 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005817 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005818*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005820PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005821"Implementation module for socket operations.\n\
5822\n\
5823See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005824
Martin v. Löwis1a214512008-06-11 05:26:20 +00005825static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005826 PyModuleDef_HEAD_INIT,
5827 PySocket_MODULE_NAME,
5828 socket_doc,
5829 -1,
5830 socket_methods,
5831 NULL,
5832 NULL,
5833 NULL,
5834 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005835};
5836
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005837PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005838PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005839{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005840 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 if (!os_init())
5843 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005844
Victor Stinnerdaf45552013-08-28 00:53:59 +02005845#ifdef MS_WINDOWS
5846 if (support_wsa_no_inherit == -1) {
5847 DWORD version = GetVersion();
5848 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5849 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5850 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5851 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5852 }
5853#endif
5854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005855 Py_TYPE(&sock_type) = &PyType_Type;
5856 m = PyModule_Create(&socketmodule);
5857 if (m == NULL)
5858 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005859
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005860 Py_INCREF(PyExc_OSError);
5861 PySocketModuleAPI.error = PyExc_OSError;
5862 Py_INCREF(PyExc_OSError);
5863 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005864 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005865 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005866 if (socket_herror == NULL)
5867 return NULL;
5868 Py_INCREF(socket_herror);
5869 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005870 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 NULL);
5872 if (socket_gaierror == NULL)
5873 return NULL;
5874 Py_INCREF(socket_gaierror);
5875 PyModule_AddObject(m, "gaierror", socket_gaierror);
5876 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005877 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 if (socket_timeout == NULL)
5879 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005880 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 Py_INCREF(socket_timeout);
5882 PyModule_AddObject(m, "timeout", socket_timeout);
5883 Py_INCREF((PyObject *)&sock_type);
5884 if (PyModule_AddObject(m, "SocketType",
5885 (PyObject *)&sock_type) != 0)
5886 return NULL;
5887 Py_INCREF((PyObject *)&sock_type);
5888 if (PyModule_AddObject(m, "socket",
5889 (PyObject *)&sock_type) != 0)
5890 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005891
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005892#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005893 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005894#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005895 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 Py_INCREF(has_ipv6);
5898 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 /* Export C API */
5901 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5902 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5903 ) != 0)
5904 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005906 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005907#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005908 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005909#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005910 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005911#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005912 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005913#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005914#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005915 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005916#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005917#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005918 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005919 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005920#endif
5921#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005922 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005923#endif
5924#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005926 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005927#endif
5928#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005930 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005931#endif
5932#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005934 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005935#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005936#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005937 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005938 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005939#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005940#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005942 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005943#endif
5944#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005946 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005947#endif
5948#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005949 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005950#endif
5951#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005953 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005954#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005955#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005957 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005958#endif
5959#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005960 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005961 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005962#endif
5963#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005965 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005966#endif
5967#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005969 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005970#endif
5971#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005973 PyModule_AddIntMacro(m, AF_NETLINK);
5974 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005975#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005976 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005977#endif
5978#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005979 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005980#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005981 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5982 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005983#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005984 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005985#endif
5986#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005987 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005988#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005989#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005990 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005991#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005992#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005993 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005994#endif
5995#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005996 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005997#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005998 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005999#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006000 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006001#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006002#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006003 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006004#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006005#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006006#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006007 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006008 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006009#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006010#ifdef AF_LINK
6011 PyModule_AddIntMacro(m, AF_LINK);
6012#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006013#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006015 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006016#endif
6017#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006019 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006020#endif
6021#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006022 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006023 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006024#endif
6025#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006027 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006028#endif
6029#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006031 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006032#endif
6033#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006034 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006035 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006036#endif
6037#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006039 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006040#endif
6041#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006042 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006043 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006044#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006045
Hye-Shik Chang81268602004-02-02 06:05:24 +00006046#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006047 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6048 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6049 PyModule_AddIntMacro(m, BTPROTO_HCI);
6050 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006051#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006052 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006053#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006054#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006055#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006056 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006057#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006058 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6059 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006060#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006061 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6063 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006064#endif
6065
Charles-François Natali47413c12011-10-06 19:47:44 +02006066#ifdef AF_CAN
6067 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006068 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006069#endif
6070#ifdef PF_CAN
6071 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006072 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006073#endif
6074
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006075/* Reliable Datagram Sockets */
6076#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006077 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006078#endif
6079#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006080 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006081#endif
6082
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006083/* Kernel event messages */
6084#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006085 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006086#endif
6087#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006088 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006089#endif
6090
Antoine Pitroub156a462010-10-27 20:13:57 +00006091#ifdef AF_PACKET
6092 PyModule_AddIntMacro(m, AF_PACKET);
6093#endif
6094#ifdef PF_PACKET
6095 PyModule_AddIntMacro(m, PF_PACKET);
6096#endif
6097#ifdef PACKET_HOST
6098 PyModule_AddIntMacro(m, PACKET_HOST);
6099#endif
6100#ifdef PACKET_BROADCAST
6101 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6102#endif
6103#ifdef PACKET_MULTICAST
6104 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6105#endif
6106#ifdef PACKET_OTHERHOST
6107 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6108#endif
6109#ifdef PACKET_OUTGOING
6110 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6111#endif
6112#ifdef PACKET_LOOPBACK
6113 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6114#endif
6115#ifdef PACKET_FASTROUTE
6116 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006117#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006118
Christian Heimes043d6f62008-01-07 17:19:16 +00006119#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006120 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006123 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6124 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6125 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006126
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006127 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6128 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6129 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006131 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006132 PyModule_AddIntMacro(m, SOL_TIPC);
6133 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6134 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6135 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6136 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006137
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006138 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6139 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6140 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6141 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006144 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6145 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006146#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006148 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006149#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006150 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6151 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6152 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6153 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6154 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6155 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006156#endif
6157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006159 PyModule_AddIntMacro(m, SOCK_STREAM);
6160 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006161/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, SOCK_RAW);
6163 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006164#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006165 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006166#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006167#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006168 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006169#endif
6170#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006171 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006172#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006176#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006177#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006179#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006182#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006183#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006184 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006185#endif
6186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006188 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006192#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006193#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006194 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006195#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006198#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006199#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006200 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006204#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006207#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006208#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006211#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006212 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006213#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006214#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006215 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006216#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006219#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006220#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006221 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006222#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006223#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006224 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006225#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006226#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006227 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006228#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006231#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006234#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006235#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006236 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006237#endif
6238#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006239 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006240#endif
6241#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006243#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006244#ifdef SO_BINDTODEVICE
6245 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6246#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006247#ifdef SO_PRIORITY
6248 PyModule_AddIntMacro(m, SO_PRIORITY);
6249#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 /* Maximum number of connections for "listen" */
6252#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006254#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006255 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006256#endif
6257
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006258 /* Ancilliary message types */
6259#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006261#endif
6262#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006263 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006264#endif
6265#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006266 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006267#endif
6268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006269 /* Flags for send, recv */
6270#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006272#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006273#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006274 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006277 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006293#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006295 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006299#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006300#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006302#endif
6303#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006305#endif
6306#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006307 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006308#endif
6309#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006311#endif
6312#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006314#endif
6315#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006316 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006317#endif
6318#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006319 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006320#endif
6321#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006322 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006323#endif
6324#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006325 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006326#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006327#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006328 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006329#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331 /* Protocol level and numbers, usable for [gs]etsockopt */
6332#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006333 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006334#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006335#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006336 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006337#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006338 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006357#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006359#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006360#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006361 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006362#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006363 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006364#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006365#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006366 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006367#endif
6368#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006369 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6370 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006371#endif
6372#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6374 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6375 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006376
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6378 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6379 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006380#endif
6381#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6383 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6384 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6385 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006386#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006387#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006388 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006389 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6390 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6391 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6392 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6393 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6394 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6395 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6396 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6397 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6398 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6399 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6400 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6401#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006402#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006404#endif
6405#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006407#endif
6408#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006410#endif
6411#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006413#endif
6414#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006416#endif
6417#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006419#endif
6420#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006425#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006429 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006433#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006437 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006440 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006443 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006446 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006449 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006450#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006452 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006453#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006464#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006466#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006467#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006468 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006469#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006472#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006474 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006475#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006476#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006477 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006479#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006481#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006483 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006484#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006485#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006487#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006490#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006491#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006492 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006493#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006494#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006497#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006518#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006526#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006527#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006530#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006532#endif
6533/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006534#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006536#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006541#endif
6542
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006543#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006545#endif
6546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006547 /* Some port configuration */
6548#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006550#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006552#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006553#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006554 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006555#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006556 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006557#endif
6558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559 /* Some reserved IP v.4 addresses */
6560#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006562#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006567#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006572#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006574#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006577#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006578 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006579#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580#ifdef INADDR_ALLHOSTS_GROUP
6581 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6582 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006583#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006584 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006585#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006587 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006588#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006589 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006592 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006593#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006594 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006595#endif
6596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006597 /* IPv4 [gs]etsockopt options */
6598#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006621#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006622#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006630#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006631#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006633#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006634#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006636#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006637#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006642#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006645#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006646#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006647 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006648#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6651#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006652 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006654#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006655 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006659#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006670#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006671 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006674#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006676#endif
6677#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006679#endif
6680#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006682#endif
6683#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006685#endif
6686#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006688#endif
6689#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006691#endif
6692#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006694#endif
6695#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006697#endif
6698#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006700#endif
6701#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006703#endif
6704#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006706#endif
6707#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006708 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006709#endif
6710#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006711 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006712#endif
6713#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006715#endif
6716#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006717 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006718#endif
6719#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006721#endif
6722#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006723 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006724#endif
6725#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006727#endif
6728#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006729 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006730#endif
6731#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006732 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006733#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735 /* TCP options */
6736#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006771#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006772#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006774#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776 /* IPX options */
6777#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006779#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006780
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006781/* Reliable Datagram Sockets */
6782#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006784#endif
6785#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006786 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006787#endif
6788#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006790#endif
6791#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006792 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006793#endif
6794#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006795 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006796#endif
6797#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006799#endif
6800#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006802#endif
6803#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006805#endif
6806#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006808#endif
6809#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006811#endif
6812#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006814#endif
6815#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006817#endif
6818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006820#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006821 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006822#endif
6823#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006825#endif
6826#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006827 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006828#endif
6829#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006830 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006831#endif
6832#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006833 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006834#endif
6835#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006837#endif
6838#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006840#endif
6841#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006842 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006843#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006844#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006845 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006846#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006847#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006848 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006849#endif
6850#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006851 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006852#endif
6853#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006855#endif
6856#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006858#endif
6859#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006861#endif
6862#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006864#endif
6865#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006867#endif
6868#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006870#endif
6871#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006873#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006874#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006876#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006877#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006879#endif
6880#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006882#endif
6883#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006885#endif
6886#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006888#endif
6889#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006891#endif
6892#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006894#endif
6895#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006897#endif
6898#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006900#endif
6901#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006903#endif
6904#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006906#endif
6907#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006909#endif
6910#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006912#endif
6913#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006915#endif
6916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006918#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006920#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006922#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006924#endif
6925#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006927#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006929#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006930 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006931#endif
6932#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006934#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006936#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006938#endif
6939
Christian Heimesfaf2f632008-01-06 16:59:19 +00006940#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 {
6942 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6943 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6944 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006945 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006946 PyObject *tmp;
6947 tmp = PyLong_FromUnsignedLong(codes[i]);
6948 if (tmp == NULL)
6949 return NULL;
6950 PyModule_AddObject(m, names[i], tmp);
6951 }
6952 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, RCVALL_OFF);
6954 PyModule_AddIntMacro(m, RCVALL_ON);
6955 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006956#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006958#endif
6959#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006961#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006962#endif /* _MSTCPIP_ */
6963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006964 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006965#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006969}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006970
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006971
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006972#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006973#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006974
6975/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006976/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006977
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006978int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006979inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006982#if (SIZEOF_INT != 4)
6983#error "Not sure if in_addr_t exists and int is not 32-bits."
6984#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006985 unsigned int packed_addr;
6986 packed_addr = inet_addr(src);
6987 if (packed_addr == INADDR_NONE)
6988 return 0;
6989 memcpy(dst, &packed_addr, 4);
6990 return 1;
6991 }
6992 /* Should set errno to EAFNOSUPPORT */
6993 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006994}
6995
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006996const char *
6997inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006999 if (af == AF_INET) {
7000 struct in_addr packed_addr;
7001 if (size < 16)
7002 /* Should set errno to ENOSPC. */
7003 return NULL;
7004 memcpy(&packed_addr, src, sizeof(packed_addr));
7005 return strncpy(dst, inet_ntoa(packed_addr), size);
7006 }
7007 /* Should set errno to EAFNOSUPPORT */
7008 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007009}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007010
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007011#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007012#endif