blob: 38879c198772960137ca01edb4c4f12ca7368554 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Steve Dower65e4cb12014-11-22 12:54:57 -0800287#if defined(_MSC_VER) && _MSC_VER >= 1800
288/* Provides the IsWindows7SP1OrGreater() function */
289#include <VersionHelpers.h>
290#endif
291
Jeremy Hylton22308652001-02-02 03:23:09 +0000292#endif
293
Skip Montanaro7befb992004-02-10 16:50:21 +0000294#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000295
Neal Norwitz39d22e52002-11-02 19:55:21 +0000296#ifndef O_NONBLOCK
297# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
299
Trent Micka708d6e2004-09-07 17:48:26 +0000300/* include Python's addrinfo.h unless it causes trouble */
301#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
302 /* Do not include addinfo.h on some newer IRIX versions.
303 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
304 * for example, but not by 6.5.10.
305 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000307 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
308 * EAI_* constants are defined in (the already included) ws2tcpip.h.
309 */
310#else
311# include "addrinfo.h"
312#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000313
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000314#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000315#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000316int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000317const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000318#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000319#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000321#ifdef __APPLE__
322/* On OS X, getaddrinfo returns no error indication of lookup
323 failure, so we must use the emulation instead of the libinfo
324 implementation. Unfortunately, performing an autoconf test
325 for this bug would require DNS access for the machine performing
326 the configuration, which is not acceptable. Therefore, we
327 determine the bug just by checking for __APPLE__. If this bug
328 gets ever fixed, perhaps checking for sys/version.h would be
329 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#ifndef HAVE_GETNAMEINFO
331/* This bug seems to be fixed in Jaguar. Ths easiest way I could
332 Find to check for Jaguar is that it has getnameinfo(), which
333 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
337#ifdef HAVE_INET_ATON
338#define USE_INET_ATON_WEAKLINK
339#endif
340
Jack Jansen84262fb2002-07-02 14:40:42 +0000341#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000343/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345/* avoid clashes with the C library definition of the symbol. */
346#define getaddrinfo fake_getaddrinfo
347#define gai_strerror fake_gai_strerror
348#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349#include "getaddrinfo.c"
350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getnameinfo.c"
354#endif
355
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000356#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358#endif
359
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000360#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000361#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000362#define EAFNOSUPPORT WSAEAFNOSUPPORT
363#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000365
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#ifndef SOCKETCLOSE
367#define SOCKETCLOSE close
368#endif
369
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000370#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#define USE_BLUETOOTH 1
372#if defined(__FreeBSD__)
373#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
374#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376#define SOL_HCI SOL_HCI_RAW
377#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#define sockaddr_l2 sockaddr_l2cap
379#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
382#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000383#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385#define sockaddr_l2 sockaddr_bt
386#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#define SOL_HCI BTPROTO_HCI
390#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
400#endif
401#endif
402
Charles-François Natali8b759652011-12-23 16:44:51 +0100403/* Convert "sock_addr_t *" to "struct sockaddr *". */
404#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405
Martin v. Löwise9416172003-05-03 10:12:45 +0000406/*
407 * Constants for getnameinfo()
408 */
409#if !defined(NI_MAXHOST)
410#define NI_MAXHOST 1025
411#endif
412#if !defined(NI_MAXSERV)
413#define NI_MAXSERV 32
414#endif
415
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000416#ifndef INVALID_SOCKET /* MS defines this */
417#define INVALID_SOCKET (-1)
418#endif
419
Charles-François Natali0cc86852013-09-13 19:53:08 +0200420#ifndef INADDR_NONE
421#define INADDR_NONE (-1)
422#endif
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* XXX There's a problem here: *static* functions are not supposed to have
425 a Py prefix (or use CapitalizedWords). Later... */
426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* Global variable holding the exception type for errors detected
428 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429static PyObject *socket_herror;
430static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000431static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432
Tim Peters643a7fc2002-02-17 04:13:21 +0000433/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 The sock_type variable contains pointers to various functions,
435 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000436 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000437static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#if defined(HAVE_POLL_H)
440#include <poll.h>
441#elif defined(HAVE_SYS_POLL_H)
442#include <sys/poll.h>
443#endif
444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445/* Largest value to try to store in a socklen_t (used when handling
446 ancillary data). POSIX requires socklen_t to hold at least
447 (2**31)-1 and recommends against storing larger values, but
448 socklen_t was originally int in the BSD interface, so to be on the
449 safe side we use the smaller of (2**31)-1 and INT_MAX. */
450#if INT_MAX > 0x7fffffff
451#define SOCKLEN_T_LIMIT 0x7fffffff
452#else
453#define SOCKLEN_T_LIMIT INT_MAX
454#endif
455
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457/* Instead of select(), we'll use poll() since poll() works on any fd. */
458#define IS_SELECTABLE(s) 1
459/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000460#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461/* If there's no timeout left, we don't have to call select, so it's a safe,
462 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000465
466static PyObject*
467select_error(void)
468{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471}
472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000473#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000474#ifndef WSAEAGAIN
475#define WSAEAGAIN WSAEWOULDBLOCK
476#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#define CHECK_ERRNO(expected) \
478 (WSAGetLastError() == WSA ## expected)
479#else
480#define CHECK_ERRNO(expected) \
481 (errno == expected)
482#endif
483
Victor Stinnerdaf45552013-08-28 00:53:59 +0200484#ifdef MS_WINDOWS
485/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
486static int support_wsa_no_inherit = -1;
487#endif
488
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489/* Convenience function to raise an error according to errno
490 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491
Guido van Rossum73624e91994-10-10 17:59:00 +0000492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000493set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000495#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 int err_no = WSAGetLastError();
497 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
498 recognizes the error codes used by both GetLastError() and
499 WSAGetLastError */
500 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200501 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000502#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000503
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200504 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505}
506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512
513#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (v != NULL) {
519 PyErr_SetObject(socket_herror, v);
520 Py_DECREF(v);
521 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524}
525
526
527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531
Martin v. Löwis272cb402002-03-01 08:31:07 +0000532#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 /* EAI_SYSTEM is not available on Windows XP. */
534 if (error == EAI_SYSTEM)
535 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000536#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000538#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 if (v != NULL) {
544 PyErr_SetObject(socket_gaierror, v);
545 Py_DECREF(v);
546 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549}
550
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000551/* Function to perform the setting of socket blocking mode
552 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000553static int
554internal_setblocking(PySocketSockObject *s, int block)
555{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200556#ifdef MS_WINDOWS
557 u_long arg;
558#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100559#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100560 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100561 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000562#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000563#ifdef SOCK_NONBLOCK
564 if (block)
565 s->sock_type &= (~SOCK_NONBLOCK);
566 else
567 s->sock_type |= SOCK_NONBLOCK;
568#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100572#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 block = !block;
574 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
577 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100578 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 else
Victor Stinner9a954832013-12-04 00:41:24 +0100580 new_delay_flag = delay_flag | O_NONBLOCK;
581 if (new_delay_flag != delay_flag)
582 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
583#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585 arg = !block;
586 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Since these don't return anything */
591 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592}
593
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000594static int
Victor Stinner416f2e62015-03-31 13:56:29 +0200595internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval,
596 int error)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100599#ifdef HAVE_POLL
600 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200601 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100602#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200603 fd_set fds, efds;
Victor Stinner71694d52015-03-28 01:18:54 +0100604 struct timeval tv;
605#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000606
Victor Stinnerb7df3142015-03-27 22:59:32 +0100607#ifdef WITH_THREAD
608 /* must be called with the GIL held */
609 assert(PyGILState_Check());
610#endif
611
Victor Stinner416f2e62015-03-31 13:56:29 +0200612 /* Error condition is for output only */
613 assert(!(error && !writing));
614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner71694d52015-03-28 01:18:54 +0100616 if (s->sock_timeout <= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Guard against closed socket */
620 if (s->sock_fd < 0)
621 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000622
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000623 /* Handling this condition here simplifies the select loops */
Victor Stinner71694d52015-03-28 01:18:54 +0100624 if (interval < 0)
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000625 return 1;
626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* Prefer poll, if available, since you can poll() any fd
628 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000629#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100630 pollfd.fd = s->sock_fd;
631 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner416f2e62015-03-31 13:56:29 +0200632 if (error)
633 pollfd.events |= POLLERR;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634
Victor Stinner71694d52015-03-28 01:18:54 +0100635 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinnere6951c62015-03-31 13:50:44 +0200636 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
637 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000638
Victor Stinner71694d52015-03-28 01:18:54 +0100639 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200640 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100641 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000642#else
Victor Stinner869e1772015-03-30 03:49:14 +0200643 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000644
Victor Stinner71694d52015-03-28 01:18:54 +0100645 FD_ZERO(&fds);
646 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200647 FD_ZERO(&efds);
648 if (error)
649 FD_SET(s->sock_fd, &efds);
Victor Stinner71694d52015-03-28 01:18:54 +0100650
651 /* See if the socket is ready */
652 Py_BEGIN_ALLOW_THREADS;
653 if (writing)
654 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200655 NULL, &fds, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100656 else
657 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200658 &fds, NULL, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100659 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 if (n < 0)
663 return -1;
664 if (n == 0)
665 return 1;
666 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667}
668
Victor Stinnere6951c62015-03-31 13:50:44 +0200669/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
670 The argument writing indicates the direction.
671 This does not raise an exception; we'll let our caller do that
672 after they've reacquired the interpreter lock.
673 Returns 1 on timeout, -1 on error, 0 otherwise. */
674static int
675internal_select(PySocketSockObject *s, int writing, _PyTime_t interval)
676{
Victor Stinner416f2e62015-03-31 13:56:29 +0200677 return internal_select_impl(s, writing, interval, 0);
Victor Stinnere6951c62015-03-31 13:50:44 +0200678}
679
680static int
681internal_connect_select(PySocketSockObject *s)
682{
Victor Stinnerdd83bd22015-03-31 14:24:47 +0200683 return internal_select_impl(s, 1, s->sock_timeout, 1);
Victor Stinnere6951c62015-03-31 13:50:44 +0200684}
685
Victor Stinner31bf2d52015-04-01 21:57:09 +0200686/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000687
Victor Stinner31bf2d52015-04-01 21:57:09 +0200688 Raise an exception and return -1 on error, return 0 on success.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100689
Victor Stinner31bf2d52015-04-01 21:57:09 +0200690 If the socket has a timeout, wait until the socket is ready before calling
691 the function: wait until the socket is writable if writing is nonzero, wait
692 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100693
Victor Stinner31bf2d52015-04-01 21:57:09 +0200694 If the function func is interrupted by a signal (failed with EINTR): retry
695 the function, except if the signal handler raised an exception (PEP 475).
696
697 When the function is retried, recompute the timeout using a monotonic clock.
698
699 sock_call() must be called with the GIL held. The function func is called
700 with the GIL released. */
701static int
702sock_call(PySocketSockObject *s,
703 int writing,
704 int (*func) (PySocketSockObject *s, void *data),
705 void *data)
706{
707 int has_timeout = (s->sock_timeout > 0);
708 _PyTime_t deadline = 0;
709 int deadline_initialized = 0;
710 int res;
711
712 /* sock_call() must be called with the GIL held. */
713 assert(PyGILState_Check());
714
715 /* outer loop to retry select() when select() is interrupted by a signal
716 or to retry select()+func() on false positive (see above) */
717 while (1) {
718 if (has_timeout) {
719 _PyTime_t interval;
720
721 if (deadline_initialized) {
722 /* recompute the timeout */
723 interval = deadline - _PyTime_GetMonotonicClock();
724 }
725 else {
726 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
727 interval = s->sock_timeout;
728 }
729
730 res = internal_select(s, writing, interval);
731 if (res == -1) {
732 if (CHECK_ERRNO(EINTR)) {
733 /* select() was interrupted by a signal */
734 if (PyErr_CheckSignals())
735 return -1;
736
737 /* retry select() */
738 continue;
739 }
740
741 /* select() failed */
742 s->errorhandler();
743 return -1;
744 }
745
746 if (res == 1) {
747 PyErr_SetString(socket_timeout, "timed out");
748 return -1;
749 }
750
751 /* the socket is ready */
752 }
753
754 /* inner loop to retry func() when func() is interrupted by a signal */
755 while (1) {
756 Py_BEGIN_ALLOW_THREADS
757 res = func(s, data);
758 Py_END_ALLOW_THREADS
759
760 if (res) {
761 /* func() succeeded */
762 return 0;
763 }
764
765 if (!CHECK_ERRNO(EINTR))
766 break;
767
768 /* func() was interrupted by a signal */
769 if (PyErr_CheckSignals())
770 return -1;
771
772 /* retry func() */
773 }
774
775 if (s->sock_timeout > 0
776 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
777 /* False positive: func() failed with EWOULDBLOCK or EAGAIN.
778
779 For example, select() could indicate a socket is ready for
780 reading, but the data then discarded by the OS because of a
781 wrong checksum.
782
783 Loop on select() to recheck for socket readyness. */
784 continue;
785 }
786
787 /* func() failed */
788 s->errorhandler();
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000789 return -1;
790 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200791}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000792
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000793
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000794/* Initialize a new socket object. */
795
Victor Stinner71694d52015-03-28 01:18:54 +0100796static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000797
Martin v. Löwis1a214512008-06-11 05:26:20 +0000798static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000799init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 s->sock_fd = fd;
803 s->sock_family = family;
804 s->sock_type = type;
805 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000808#ifdef SOCK_NONBLOCK
809 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100810 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000811 else
812#endif
813 {
814 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100815 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000816 internal_setblocking(s, 0);
817 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000818
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000819}
820
821
Guido van Rossum30a685f1991-06-27 15:51:29 +0000822/* Create a new socket object.
823 This just creates the object and initializes it.
824 If the creation fails, return NULL and set an exception (implicit
825 in NEWOBJ()). */
826
Guido van Rossum73624e91994-10-10 17:59:00 +0000827static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000828new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 PySocketSockObject *s;
831 s = (PySocketSockObject *)
832 PyType_GenericNew(&sock_type, NULL, NULL);
833 if (s != NULL)
834 init_sockobject(s, fd, family, type, proto);
835 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000836}
837
Guido van Rossum30a685f1991-06-27 15:51:29 +0000838
Guido van Rossum48a680c2001-03-02 06:34:14 +0000839/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000840 thread to be in gethostbyname or getaddrinfo */
841#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200842static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000843#endif
844
845
Guido van Rossum30a685f1991-06-27 15:51:29 +0000846/* Convert a string specifying a host name or one of a few symbolic
847 names to a numeric IP address. This usually calls gethostbyname()
848 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000849 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000850 an error occurred; then an exception is raised. */
851
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000852static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000853setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000854{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 struct addrinfo hints, *res;
856 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
859 if (name[0] == '\0') {
860 int siz;
861 memset(&hints, 0, sizeof(hints));
862 hints.ai_family = af;
863 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
864 hints.ai_flags = AI_PASSIVE;
865 Py_BEGIN_ALLOW_THREADS
866 ACQUIRE_GETADDRINFO_LOCK
867 error = getaddrinfo(NULL, "0", &hints, &res);
868 Py_END_ALLOW_THREADS
869 /* We assume that those thread-unsafe getaddrinfo() versions
870 *are* safe regarding their return value, ie. that a
871 subsequent call to getaddrinfo() does not destroy the
872 outcome of the first call. */
873 RELEASE_GETADDRINFO_LOCK
874 if (error) {
875 set_gaierror(error);
876 return -1;
877 }
878 switch (res->ai_family) {
879 case AF_INET:
880 siz = 4;
881 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000882#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 case AF_INET6:
884 siz = 16;
885 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 default:
888 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200889 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 "unsupported address family");
891 return -1;
892 }
893 if (res->ai_next) {
894 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200895 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 "wildcard resolved to multiple address");
897 return -1;
898 }
899 if (res->ai_addrlen < addr_ret_size)
900 addr_ret_size = res->ai_addrlen;
901 memcpy(addr_ret, res->ai_addr, addr_ret_size);
902 freeaddrinfo(res);
903 return siz;
904 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200905 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100906 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200907 if (strcmp(name, "255.255.255.255") == 0 ||
908 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 struct sockaddr_in *sin;
910 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200911 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 "address family mismatched");
913 return -1;
914 }
915 sin = (struct sockaddr_in *)addr_ret;
916 memset((void *) sin, '\0', sizeof(*sin));
917 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000918#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 sin->sin_addr.s_addr = INADDR_BROADCAST;
922 return sizeof(sin->sin_addr);
923 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200924
925 /* avoid a name resolution in case of numeric address */
926#ifdef HAVE_INET_PTON
927 /* check for an IPv4 address */
928 if (af == AF_UNSPEC || af == AF_INET) {
929 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
930 memset(sin, 0, sizeof(*sin));
931 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
932 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000933#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200934 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000935#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200936 return 4;
937 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200939#ifdef ENABLE_IPV6
940 /* check for an IPv6 address - if the address contains a scope ID, we
941 * fallback to getaddrinfo(), which can handle translation from interface
942 * name to interface index */
943 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
944 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
945 memset(sin, 0, sizeof(*sin));
946 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
947 sin->sin6_family = AF_INET6;
948#ifdef HAVE_SOCKADDR_SA_LEN
949 sin->sin6_len = sizeof(*sin);
950#endif
951 return 16;
952 }
953 }
954#endif /* ENABLE_IPV6 */
955#else /* HAVE_INET_PTON */
956 /* check for an IPv4 address */
957 if (af == AF_INET || af == AF_UNSPEC) {
958 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
959 memset(sin, 0, sizeof(*sin));
960 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
961 sin->sin_family = AF_INET;
962#ifdef HAVE_SOCKADDR_SA_LEN
963 sin->sin_len = sizeof(*sin);
964#endif
965 return 4;
966 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100967 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200968#endif /* HAVE_INET_PTON */
969
970 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 memset(&hints, 0, sizeof(hints));
972 hints.ai_family = af;
973 Py_BEGIN_ALLOW_THREADS
974 ACQUIRE_GETADDRINFO_LOCK
975 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000976#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000977 if (error == EAI_NONAME && af == AF_UNSPEC) {
978 /* On Tru64 V5.1, numeric-to-addr conversion fails
979 if no address family is given. Assume IPv4 for now.*/
980 hints.ai_family = AF_INET;
981 error = getaddrinfo(name, NULL, &hints, &res);
982 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 Py_END_ALLOW_THREADS
985 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
986 if (error) {
987 set_gaierror(error);
988 return -1;
989 }
990 if (res->ai_addrlen < addr_ret_size)
991 addr_ret_size = res->ai_addrlen;
992 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
993 freeaddrinfo(res);
994 switch (addr_ret->sa_family) {
995 case AF_INET:
996 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000997#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000998 case AF_INET6:
999 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001000#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001001 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001002 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001003 return -1;
1004 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001005}
1006
Guido van Rossum30a685f1991-06-27 15:51:29 +00001007
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008/* Create a string object representing an IP address.
1009 This is always a string of the form 'dd.dd.dd.dd' (with variable
1010 size numbers). */
1011
Guido van Rossum73624e91994-10-10 17:59:00 +00001012static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001013makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001015 char buf[NI_MAXHOST];
1016 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001017
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1019 NI_NUMERICHOST);
1020 if (error) {
1021 set_gaierror(error);
1022 return NULL;
1023 }
1024 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001025}
1026
1027
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001028#ifdef USE_BLUETOOTH
1029/* Convert a string representation of a Bluetooth address into a numeric
1030 address. Returns the length (6), or raises an exception and returns -1 if
1031 an error occurred. */
1032
1033static int
1034setbdaddr(char *name, bdaddr_t *bdaddr)
1035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 unsigned int b0, b1, b2, b3, b4, b5;
1037 char ch;
1038 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1041 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1042 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1043 bdaddr->b[0] = b0;
1044 bdaddr->b[1] = b1;
1045 bdaddr->b[2] = b2;
1046 bdaddr->b[3] = b3;
1047 bdaddr->b[4] = b4;
1048 bdaddr->b[5] = b5;
1049 return 6;
1050 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001051 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 return -1;
1053 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001054}
1055
1056/* Create a string representation of the Bluetooth address. This is always a
1057 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1058 value (zero padded if necessary). */
1059
1060static PyObject *
1061makebdaddr(bdaddr_t *bdaddr)
1062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001065 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1066 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1067 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1068 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001069}
1070#endif
1071
1072
Guido van Rossum30a685f1991-06-27 15:51:29 +00001073/* Create an object representing the given socket address,
1074 suitable for passing it back to bind(), connect() etc.
1075 The family field of the sockaddr structure is inspected
1076 to determine what kind of address it really is. */
1077
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001078/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001079static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001080makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 if (addrlen == 0) {
1083 /* No address -- may be recvfrom() from known socket */
1084 Py_INCREF(Py_None);
1085 return Py_None;
1086 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 case AF_INET:
1091 {
1092 struct sockaddr_in *a;
1093 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1094 PyObject *ret = NULL;
1095 if (addrobj) {
1096 a = (struct sockaddr_in *)addr;
1097 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1098 Py_DECREF(addrobj);
1099 }
1100 return ret;
1101 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001102
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001103#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 case AF_UNIX:
1105 {
1106 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001107#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1109 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001110 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 }
1112 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001113#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 {
1115 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001116 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 }
1118 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001119#endif /* AF_UNIX */
1120
Martin v. Löwis11017b12006-01-14 18:12:57 +00001121#if defined(AF_NETLINK)
1122 case AF_NETLINK:
1123 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1125 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001126 }
1127#endif /* AF_NETLINK */
1128
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001129#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001130 case AF_INET6:
1131 {
1132 struct sockaddr_in6 *a;
1133 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1134 PyObject *ret = NULL;
1135 if (addrobj) {
1136 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001137 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001138 addrobj,
1139 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001140 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 a->sin6_scope_id);
1142 Py_DECREF(addrobj);
1143 }
1144 return ret;
1145 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001146#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001148#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 case AF_BLUETOOTH:
1150 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 case BTPROTO_L2CAP:
1153 {
1154 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1155 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1156 PyObject *ret = NULL;
1157 if (addrobj) {
1158 ret = Py_BuildValue("Oi",
1159 addrobj,
1160 _BT_L2_MEMB(a, psm));
1161 Py_DECREF(addrobj);
1162 }
1163 return ret;
1164 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 case BTPROTO_RFCOMM:
1167 {
1168 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1169 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1170 PyObject *ret = NULL;
1171 if (addrobj) {
1172 ret = Py_BuildValue("Oi",
1173 addrobj,
1174 _BT_RC_MEMB(a, channel));
1175 Py_DECREF(addrobj);
1176 }
1177 return ret;
1178 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 case BTPROTO_HCI:
1181 {
1182 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001183#if defined(__NetBSD__) || defined(__DragonFly__)
1184 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1185#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 PyObject *ret = NULL;
1187 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1188 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001189#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001191
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001192#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 case BTPROTO_SCO:
1194 {
1195 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1196 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1197 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001198#endif
1199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 default:
1201 PyErr_SetString(PyExc_ValueError,
1202 "Unknown Bluetooth protocol");
1203 return NULL;
1204 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001205#endif
1206
Antoine Pitroub156a462010-10-27 20:13:57 +00001207#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 case AF_PACKET:
1209 {
1210 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1211 char *ifname = "";
1212 struct ifreq ifr;
1213 /* need to look up interface name give index */
1214 if (a->sll_ifindex) {
1215 ifr.ifr_ifindex = a->sll_ifindex;
1216 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1217 ifname = ifr.ifr_name;
1218 }
1219 return Py_BuildValue("shbhy#",
1220 ifname,
1221 ntohs(a->sll_protocol),
1222 a->sll_pkttype,
1223 a->sll_hatype,
1224 a->sll_addr,
1225 a->sll_halen);
1226 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001227#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001228
Christian Heimes043d6f62008-01-07 17:19:16 +00001229#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 case AF_TIPC:
1231 {
1232 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1233 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1234 return Py_BuildValue("IIIII",
1235 a->addrtype,
1236 a->addr.nameseq.type,
1237 a->addr.nameseq.lower,
1238 a->addr.nameseq.upper,
1239 a->scope);
1240 } else if (a->addrtype == TIPC_ADDR_NAME) {
1241 return Py_BuildValue("IIIII",
1242 a->addrtype,
1243 a->addr.name.name.type,
1244 a->addr.name.name.instance,
1245 a->addr.name.name.instance,
1246 a->scope);
1247 } else if (a->addrtype == TIPC_ADDR_ID) {
1248 return Py_BuildValue("IIIII",
1249 a->addrtype,
1250 a->addr.id.node,
1251 a->addr.id.ref,
1252 0,
1253 a->scope);
1254 } else {
1255 PyErr_SetString(PyExc_ValueError,
1256 "Invalid address type");
1257 return NULL;
1258 }
1259 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001260#endif
1261
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001262#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001263 case AF_CAN:
1264 {
1265 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1266 char *ifname = "";
1267 struct ifreq ifr;
1268 /* need to look up interface name given index */
1269 if (a->can_ifindex) {
1270 ifr.ifr_ifindex = a->can_ifindex;
1271 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1272 ifname = ifr.ifr_name;
1273 }
1274
1275 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1276 ifname,
1277 a->can_family);
1278 }
1279#endif
1280
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001281#ifdef PF_SYSTEM
1282 case PF_SYSTEM:
1283 switch(proto) {
1284#ifdef SYSPROTO_CONTROL
1285 case SYSPROTO_CONTROL:
1286 {
1287 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1288 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1289 }
1290#endif
1291 default:
1292 PyErr_SetString(PyExc_ValueError,
1293 "Invalid address type");
1294 return 0;
1295 }
1296#endif
1297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001298 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001300 default:
1301 /* If we don't know the address family, don't raise an
1302 exception -- return it as an (int, bytes) tuple. */
1303 return Py_BuildValue("iy#",
1304 addr->sa_family,
1305 addr->sa_data,
1306 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001309}
1310
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001311/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1312 (in particular, numeric IP addresses). */
1313struct maybe_idna {
1314 PyObject *obj;
1315 char *buf;
1316};
1317
1318static void
1319idna_cleanup(struct maybe_idna *data)
1320{
1321 Py_CLEAR(data->obj);
1322}
1323
1324static int
1325idna_converter(PyObject *obj, struct maybe_idna *data)
1326{
1327 size_t len;
1328 PyObject *obj2, *obj3;
1329 if (obj == NULL) {
1330 idna_cleanup(data);
1331 return 1;
1332 }
1333 data->obj = NULL;
1334 len = -1;
1335 if (PyBytes_Check(obj)) {
1336 data->buf = PyBytes_AsString(obj);
1337 len = PyBytes_Size(obj);
1338 }
1339 else if (PyByteArray_Check(obj)) {
1340 data->buf = PyByteArray_AsString(obj);
1341 len = PyByteArray_Size(obj);
1342 }
1343 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1344 data->buf = PyUnicode_DATA(obj);
1345 len = PyUnicode_GET_LENGTH(obj);
1346 }
1347 else {
1348 obj2 = PyUnicode_FromObject(obj);
1349 if (!obj2) {
1350 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1351 obj->ob_type->tp_name);
1352 return 0;
1353 }
1354 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1355 Py_DECREF(obj2);
1356 if (!obj3) {
1357 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1358 return 0;
1359 }
1360 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001361 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001362 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1363 return 0;
1364 }
1365 data->obj = obj3;
1366 data->buf = PyBytes_AS_STRING(obj3);
1367 len = PyBytes_GET_SIZE(obj3);
1368 }
1369 if (strlen(data->buf) != len) {
1370 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001371 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001372 return 0;
1373 }
1374 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001375}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001376
1377/* Parse a socket address argument according to the socket object's
1378 address family. Return 1 if the address was in the proper format,
1379 0 of not. The address is returned through addr_ret, its length
1380 through len_ret. */
1381
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001382static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001383getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001386 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001387
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001388#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001389 case AF_UNIX:
1390 {
1391 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001392 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001393 int retval = 0;
1394
1395 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1396 allow embedded nulls on Linux. */
1397 if (PyUnicode_Check(args)) {
1398 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1399 return 0;
1400 }
1401 else
1402 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001403 if (!PyArg_Parse(args, "y*", &path)) {
1404 Py_DECREF(args);
1405 return retval;
1406 }
1407 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001408
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001409 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001410#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001411 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001412 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001413 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001414 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001415 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001416 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 }
1418 }
1419 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001420#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001421 {
1422 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001423 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001424 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001425 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001426 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001427 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001428 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 }
1430 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001431 memcpy(addr->sun_path, path.buf, path.len);
1432 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001433 retval = 1;
1434 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001435 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001436 Py_DECREF(args);
1437 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001439#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001440
Martin v. Löwis11017b12006-01-14 18:12:57 +00001441#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001442 case AF_NETLINK:
1443 {
1444 struct sockaddr_nl* addr;
1445 int pid, groups;
1446 addr = (struct sockaddr_nl *)addr_ret;
1447 if (!PyTuple_Check(args)) {
1448 PyErr_Format(
1449 PyExc_TypeError,
1450 "getsockaddrarg: "
1451 "AF_NETLINK address must be tuple, not %.500s",
1452 Py_TYPE(args)->tp_name);
1453 return 0;
1454 }
1455 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1456 return 0;
1457 addr->nl_family = AF_NETLINK;
1458 addr->nl_pid = pid;
1459 addr->nl_groups = groups;
1460 *len_ret = sizeof(*addr);
1461 return 1;
1462 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001463#endif
1464
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001465#ifdef AF_RDS
1466 case AF_RDS:
1467 /* RDS sockets use sockaddr_in: fall-through */
1468#endif
1469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 case AF_INET:
1471 {
1472 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001473 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 int port, result;
1475 if (!PyTuple_Check(args)) {
1476 PyErr_Format(
1477 PyExc_TypeError,
1478 "getsockaddrarg: "
1479 "AF_INET address must be tuple, not %.500s",
1480 Py_TYPE(args)->tp_name);
1481 return 0;
1482 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001483 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1484 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 return 0;
1486 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001487 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001489 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 if (result < 0)
1491 return 0;
1492 if (port < 0 || port > 0xffff) {
1493 PyErr_SetString(
1494 PyExc_OverflowError,
1495 "getsockaddrarg: port must be 0-65535.");
1496 return 0;
1497 }
1498 addr->sin_family = AF_INET;
1499 addr->sin_port = htons((short)port);
1500 *len_ret = sizeof *addr;
1501 return 1;
1502 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001503
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001504#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 case AF_INET6:
1506 {
1507 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001508 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001509 int port, result;
1510 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001511 flowinfo = scope_id = 0;
1512 if (!PyTuple_Check(args)) {
1513 PyErr_Format(
1514 PyExc_TypeError,
1515 "getsockaddrarg: "
1516 "AF_INET6 address must be tuple, not %.500s",
1517 Py_TYPE(args)->tp_name);
1518 return 0;
1519 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001520 if (!PyArg_ParseTuple(args, "O&i|II",
1521 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 &scope_id)) {
1523 return 0;
1524 }
1525 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001526 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001527 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001528 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 if (result < 0)
1530 return 0;
1531 if (port < 0 || port > 0xffff) {
1532 PyErr_SetString(
1533 PyExc_OverflowError,
1534 "getsockaddrarg: port must be 0-65535.");
1535 return 0;
1536 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001537 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001538 PyErr_SetString(
1539 PyExc_OverflowError,
1540 "getsockaddrarg: flowinfo must be 0-1048575.");
1541 return 0;
1542 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 addr->sin6_family = s->sock_family;
1544 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001545 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 addr->sin6_scope_id = scope_id;
1547 *len_ret = sizeof *addr;
1548 return 1;
1549 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001550#endif
1551
Hye-Shik Chang81268602004-02-02 06:05:24 +00001552#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 case AF_BLUETOOTH:
1554 {
1555 switch (s->sock_proto) {
1556 case BTPROTO_L2CAP:
1557 {
1558 struct sockaddr_l2 *addr;
1559 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001561 addr = (struct sockaddr_l2 *)addr_ret;
1562 memset(addr, 0, sizeof(struct sockaddr_l2));
1563 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1564 if (!PyArg_ParseTuple(args, "si", &straddr,
1565 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001566 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 "wrong format");
1568 return 0;
1569 }
1570 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1571 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 *len_ret = sizeof *addr;
1574 return 1;
1575 }
1576 case BTPROTO_RFCOMM:
1577 {
1578 struct sockaddr_rc *addr;
1579 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 addr = (struct sockaddr_rc *)addr_ret;
1582 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1583 if (!PyArg_ParseTuple(args, "si", &straddr,
1584 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001585 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 "wrong format");
1587 return 0;
1588 }
1589 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1590 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 *len_ret = sizeof *addr;
1593 return 1;
1594 }
1595 case BTPROTO_HCI:
1596 {
1597 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001598#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001599 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001600
Alexander Belopolskye239d232010-12-08 23:31:48 +00001601 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001602 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001603 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001604 "wrong format");
1605 return 0;
1606 }
1607 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1608 return 0;
1609#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001610 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1611 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001612 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 "wrong format");
1614 return 0;
1615 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001617 *len_ret = sizeof *addr;
1618 return 1;
1619 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001620#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 case BTPROTO_SCO:
1622 {
1623 struct sockaddr_sco *addr;
1624 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 addr = (struct sockaddr_sco *)addr_ret;
1627 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1628 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001629 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001630 "wrong format");
1631 return 0;
1632 }
1633 straddr = PyBytes_AS_STRING(args);
1634 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1635 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 *len_ret = sizeof *addr;
1638 return 1;
1639 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001641 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001642 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001643 return 0;
1644 }
1645 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001646#endif
1647
Antoine Pitroub156a462010-10-27 20:13:57 +00001648#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001649 case AF_PACKET:
1650 {
1651 struct sockaddr_ll* addr;
1652 struct ifreq ifr;
1653 char *interfaceName;
1654 int protoNumber;
1655 int hatype = 0;
1656 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001657 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 if (!PyTuple_Check(args)) {
1660 PyErr_Format(
1661 PyExc_TypeError,
1662 "getsockaddrarg: "
1663 "AF_PACKET address must be tuple, not %.500s",
1664 Py_TYPE(args)->tp_name);
1665 return 0;
1666 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001667 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001668 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001669 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001670 return 0;
1671 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1672 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1673 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1674 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001675 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 return 0;
1677 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001678 if (haddr.buf && haddr.len > 8) {
1679 PyErr_SetString(PyExc_ValueError,
1680 "Hardware address must be 8 bytes or less");
1681 PyBuffer_Release(&haddr);
1682 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 }
1684 if (protoNumber < 0 || protoNumber > 0xffff) {
1685 PyErr_SetString(
1686 PyExc_OverflowError,
1687 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001688 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 return 0;
1690 }
1691 addr = (struct sockaddr_ll*)addr_ret;
1692 addr->sll_family = AF_PACKET;
1693 addr->sll_protocol = htons((short)protoNumber);
1694 addr->sll_ifindex = ifr.ifr_ifindex;
1695 addr->sll_pkttype = pkttype;
1696 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001697 if (haddr.buf) {
1698 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1699 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001701 else
1702 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001704 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 return 1;
1706 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001707#endif
1708
Christian Heimes043d6f62008-01-07 17:19:16 +00001709#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 case AF_TIPC:
1711 {
1712 unsigned int atype, v1, v2, v3;
1713 unsigned int scope = TIPC_CLUSTER_SCOPE;
1714 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001715
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 if (!PyTuple_Check(args)) {
1717 PyErr_Format(
1718 PyExc_TypeError,
1719 "getsockaddrarg: "
1720 "AF_TIPC address must be tuple, not %.500s",
1721 Py_TYPE(args)->tp_name);
1722 return 0;
1723 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001725 if (!PyArg_ParseTuple(args,
1726 "IIII|I;Invalid TIPC address format",
1727 &atype, &v1, &v2, &v3, &scope))
1728 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 addr = (struct sockaddr_tipc *) addr_ret;
1731 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001733 addr->family = AF_TIPC;
1734 addr->scope = scope;
1735 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001736
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 if (atype == TIPC_ADDR_NAMESEQ) {
1738 addr->addr.nameseq.type = v1;
1739 addr->addr.nameseq.lower = v2;
1740 addr->addr.nameseq.upper = v3;
1741 } else if (atype == TIPC_ADDR_NAME) {
1742 addr->addr.name.name.type = v1;
1743 addr->addr.name.name.instance = v2;
1744 } else if (atype == TIPC_ADDR_ID) {
1745 addr->addr.id.node = v1;
1746 addr->addr.id.ref = v2;
1747 } else {
1748 /* Shouldn't happen */
1749 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1750 return 0;
1751 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001753 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 return 1;
1756 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001757#endif
1758
Vinay Sajiped6783f2014-03-21 11:44:32 +00001759#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001760 case AF_CAN:
1761 switch (s->sock_proto) {
1762 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001763 /* fall-through */
1764 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001765 {
1766 struct sockaddr_can *addr;
1767 PyObject *interfaceName;
1768 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001769 Py_ssize_t len;
1770
Benjamin Peterson18b71912013-05-16 15:29:44 -05001771 addr = (struct sockaddr_can *)addr_ret;
1772
Charles-François Natali47413c12011-10-06 19:47:44 +02001773 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1774 &interfaceName))
1775 return 0;
1776
1777 len = PyBytes_GET_SIZE(interfaceName);
1778
1779 if (len == 0) {
1780 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001781 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001782 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1783 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001784 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1785 s->errorhandler();
1786 Py_DECREF(interfaceName);
1787 return 0;
1788 }
1789 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001790 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001791 "AF_CAN interface name too long");
1792 Py_DECREF(interfaceName);
1793 return 0;
1794 }
1795
1796 addr->can_family = AF_CAN;
1797 addr->can_ifindex = ifr.ifr_ifindex;
1798
1799 *len_ret = sizeof(*addr);
1800 Py_DECREF(interfaceName);
1801 return 1;
1802 }
1803 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001804 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001805 "getsockaddrarg: unsupported CAN protocol");
1806 return 0;
1807 }
1808#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001809
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001810#ifdef PF_SYSTEM
1811 case PF_SYSTEM:
1812 switch (s->sock_proto) {
1813#ifdef SYSPROTO_CONTROL
1814 case SYSPROTO_CONTROL:
1815 {
1816 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001817
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001818 addr = (struct sockaddr_ctl *)addr_ret;
1819 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001820 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001821
1822 if (PyUnicode_Check(args)) {
1823 struct ctl_info info;
1824 PyObject *ctl_name;
1825
1826 if (!PyArg_Parse(args, "O&",
1827 PyUnicode_FSConverter, &ctl_name)) {
1828 return 0;
1829 }
1830
Victor Stinnerf50e1872015-03-20 11:32:24 +01001831 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001832 PyErr_SetString(PyExc_ValueError,
1833 "provided string is too long");
1834 Py_DECREF(ctl_name);
1835 return 0;
1836 }
1837 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1838 sizeof(info.ctl_name));
1839 Py_DECREF(ctl_name);
1840
1841 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1842 PyErr_SetString(PyExc_OSError,
1843 "cannot find kernel control with provided name");
1844 return 0;
1845 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001846
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001847 addr->sc_id = info.ctl_id;
1848 addr->sc_unit = 0;
1849 } else if (!PyArg_ParseTuple(args, "II",
1850 &(addr->sc_id), &(addr->sc_unit))) {
1851 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1852 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001853
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001854 return 0;
1855 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001856
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001857 *len_ret = sizeof(*addr);
1858 return 1;
1859 }
1860#endif
1861 default:
1862 PyErr_SetString(PyExc_OSError,
1863 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1864 return 0;
1865 }
1866#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001868 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001870 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001871 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001872 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001875}
1876
Guido van Rossum30a685f1991-06-27 15:51:29 +00001877
Guido van Rossum48a680c2001-03-02 06:34:14 +00001878/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001879 Return 1 if the family is known, 0 otherwise. The length is returned
1880 through len_ret. */
1881
1882static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001883getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001885 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001886
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001887#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001888 case AF_UNIX:
1889 {
1890 *len_ret = sizeof (struct sockaddr_un);
1891 return 1;
1892 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001893#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001894#if defined(AF_NETLINK)
1895 case AF_NETLINK:
1896 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001897 *len_ret = sizeof (struct sockaddr_nl);
1898 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001899 }
1900#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001901
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001902#ifdef AF_RDS
1903 case AF_RDS:
1904 /* RDS sockets use sockaddr_in: fall-through */
1905#endif
1906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 case AF_INET:
1908 {
1909 *len_ret = sizeof (struct sockaddr_in);
1910 return 1;
1911 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001912
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001913#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 case AF_INET6:
1915 {
1916 *len_ret = sizeof (struct sockaddr_in6);
1917 return 1;
1918 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001919#endif
1920
Hye-Shik Chang81268602004-02-02 06:05:24 +00001921#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 case AF_BLUETOOTH:
1923 {
1924 switch(s->sock_proto)
1925 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 case BTPROTO_L2CAP:
1928 *len_ret = sizeof (struct sockaddr_l2);
1929 return 1;
1930 case BTPROTO_RFCOMM:
1931 *len_ret = sizeof (struct sockaddr_rc);
1932 return 1;
1933 case BTPROTO_HCI:
1934 *len_ret = sizeof (struct sockaddr_hci);
1935 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001936#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 case BTPROTO_SCO:
1938 *len_ret = sizeof (struct sockaddr_sco);
1939 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001941 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001942 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 "unknown BT protocol");
1944 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001946 }
1947 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001948#endif
1949
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001950#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 case AF_PACKET:
1952 {
1953 *len_ret = sizeof (struct sockaddr_ll);
1954 return 1;
1955 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001956#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001957
Christian Heimes043d6f62008-01-07 17:19:16 +00001958#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 case AF_TIPC:
1960 {
1961 *len_ret = sizeof (struct sockaddr_tipc);
1962 return 1;
1963 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001964#endif
1965
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001966#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001967 case AF_CAN:
1968 {
1969 *len_ret = sizeof (struct sockaddr_can);
1970 return 1;
1971 }
1972#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001973
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001974#ifdef PF_SYSTEM
1975 case PF_SYSTEM:
1976 switch(s->sock_proto) {
1977#ifdef SYSPROTO_CONTROL
1978 case SYSPROTO_CONTROL:
1979 *len_ret = sizeof (struct sockaddr_ctl);
1980 return 1;
1981#endif
1982 default:
1983 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1984 "unknown PF_SYSTEM protocol");
1985 return 0;
1986 }
1987#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001992 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001996}
1997
1998
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001999/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2000 Currently, these methods are only compiled if the RFC 2292/3542
2001 CMSG_LEN() macro is available. Older systems seem to have used
2002 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2003 it may be possible to define CMSG_LEN() that way if it's not
2004 provided. Some architectures might need extra padding after the
2005 cmsghdr, however, and CMSG_LEN() would have to take account of
2006 this. */
2007#ifdef CMSG_LEN
2008/* If length is in range, set *result to CMSG_LEN(length) and return
2009 true; otherwise, return false. */
2010static int
2011get_CMSG_LEN(size_t length, size_t *result)
2012{
2013 size_t tmp;
2014
2015 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2016 return 0;
2017 tmp = CMSG_LEN(length);
2018 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2019 return 0;
2020 *result = tmp;
2021 return 1;
2022}
2023
2024#ifdef CMSG_SPACE
2025/* If length is in range, set *result to CMSG_SPACE(length) and return
2026 true; otherwise, return false. */
2027static int
2028get_CMSG_SPACE(size_t length, size_t *result)
2029{
2030 size_t tmp;
2031
2032 /* Use CMSG_SPACE(1) here in order to take account of the padding
2033 necessary before *and* after the data. */
2034 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2035 return 0;
2036 tmp = CMSG_SPACE(length);
2037 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2038 return 0;
2039 *result = tmp;
2040 return 1;
2041}
2042#endif
2043
2044/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2045 pointer in msg->msg_control with at least "space" bytes after it,
2046 and its cmsg_len member inside the buffer. */
2047static int
2048cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2049{
2050 size_t cmsg_offset;
2051 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2052 sizeof(cmsgh->cmsg_len));
2053
Charles-François Natali466517d2011-08-28 18:23:43 +02002054 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002055 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002056 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002057 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2058 annoying under OS X as it's unsigned there and so it triggers a
2059 tautological comparison warning under Clang when compared against 0.
2060 Since the check is valid on other platforms, silence the warning under
2061 Clang. */
2062 #ifdef __clang__
2063 #pragma clang diagnostic push
2064 #pragma clang diagnostic ignored "-Wtautological-compare"
2065 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002066 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002067 #pragma GCC diagnostic push
2068 #pragma GCC diagnostic ignored "-Wtype-limits"
2069 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002070 if (msg->msg_controllen < 0)
2071 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002072 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002073 #pragma GCC diagnostic pop
2074 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002075 #ifdef __clang__
2076 #pragma clang diagnostic pop
2077 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002078 if (space < cmsg_len_end)
2079 space = cmsg_len_end;
2080 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2081 return (cmsg_offset <= (size_t)-1 - space &&
2082 cmsg_offset + space <= msg->msg_controllen);
2083}
2084
2085/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2086 *space to number of bytes following it in the buffer and return
2087 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2088 msg->msg_controllen are valid. */
2089static int
2090get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2091{
2092 size_t data_offset;
2093 char *data_ptr;
2094
2095 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2096 return 0;
2097 data_offset = data_ptr - (char *)msg->msg_control;
2098 if (data_offset > msg->msg_controllen)
2099 return 0;
2100 *space = msg->msg_controllen - data_offset;
2101 return 1;
2102}
2103
2104/* If cmsgh is invalid or not contained in the buffer pointed to by
2105 msg->msg_control, return -1. If cmsgh is valid and its associated
2106 data is entirely contained in the buffer, set *data_len to the
2107 length of the associated data and return 0. If only part of the
2108 associated data is contained in the buffer but cmsgh is otherwise
2109 valid, set *data_len to the length contained in the buffer and
2110 return 1. */
2111static int
2112get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2113{
2114 size_t space, cmsg_data_len;
2115
2116 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2117 cmsgh->cmsg_len < CMSG_LEN(0))
2118 return -1;
2119 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2120 if (!get_cmsg_data_space(msg, cmsgh, &space))
2121 return -1;
2122 if (space >= cmsg_data_len) {
2123 *data_len = cmsg_data_len;
2124 return 0;
2125 }
2126 *data_len = space;
2127 return 1;
2128}
2129#endif /* CMSG_LEN */
2130
2131
Victor Stinner31bf2d52015-04-01 21:57:09 +02002132struct sock_accept {
2133 socklen_t *addrlen;
2134 sock_addr_t *addrbuf;
2135 SOCKET_T result;
2136};
2137
2138#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2139/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2140static int accept4_works = -1;
2141#endif
2142
2143static int
2144sock_accept_impl(PySocketSockObject *s, void *data)
2145{
2146 struct sock_accept *ctx = data;
2147
2148#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2149 if (accept4_works != 0) {
2150 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2151 SOCK_CLOEXEC);
2152 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2153 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2154 accept4_works = (errno != ENOSYS);
2155 }
2156 }
2157 if (accept4_works == 0)
2158 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2159#else
2160 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2161#endif
2162 return (ctx->result >= 0);
2163}
2164
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002165/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002166
Guido van Rossum73624e91994-10-10 17:59:00 +00002167static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002168sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002169{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002170 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002171 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002172 socklen_t addrlen;
2173 PyObject *sock = NULL;
2174 PyObject *addr = NULL;
2175 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002176 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002178 if (!getsockaddrlen(s, &addrlen))
2179 return NULL;
2180 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002182 if (!IS_SELECTABLE(s))
2183 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002184
Victor Stinner31bf2d52015-04-01 21:57:09 +02002185 ctx.addrlen = &addrlen;
2186 ctx.addrbuf = &addrbuf;
2187 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002188 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002189 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002190
Victor Stinnerdaf45552013-08-28 00:53:59 +02002191#ifdef MS_WINDOWS
2192 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2193 PyErr_SetFromWindowsErr(0);
2194 SOCKETCLOSE(newfd);
2195 goto finally;
2196 }
2197#else
2198
2199#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2200 if (!accept4_works)
2201#endif
2202 {
2203 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2204 SOCKETCLOSE(newfd);
2205 goto finally;
2206 }
2207 }
2208#endif
2209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002210 sock = PyLong_FromSocket_t(newfd);
2211 if (sock == NULL) {
2212 SOCKETCLOSE(newfd);
2213 goto finally;
2214 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002215
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2217 addrlen, s->sock_proto);
2218 if (addr == NULL)
2219 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002221 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002222
Guido van Rossum67f7a382002-06-06 21:08:16 +00002223finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 Py_XDECREF(sock);
2225 Py_XDECREF(addr);
2226 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002227}
2228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002229PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002230"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002231\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002232Wait for an incoming connection. Return a new socket file descriptor\n\
2233representing the connection, and the address of the client.\n\
2234For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002235
Guido van Rossum11ba0942002-06-13 15:07:44 +00002236/* s.setblocking(flag) method. Argument:
2237 False -- non-blocking mode; same as settimeout(0)
2238 True -- blocking mode; same as settimeout(None)
2239*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002240
Guido van Rossum73624e91994-10-10 17:59:00 +00002241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002243{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002244 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 block = PyLong_AsLong(arg);
2247 if (block == -1 && PyErr_Occurred())
2248 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002249
Victor Stinner71694d52015-03-28 01:18:54 +01002250 s->sock_timeout = block ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002251 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002253 Py_INCREF(Py_None);
2254 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002255}
Guido van Rossume4485b01994-09-07 14:32:49 +00002256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002257PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258"setblocking(flag)\n\
2259\n\
2260Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002261setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002262setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002263
Victor Stinner71694d52015-03-28 01:18:54 +01002264static int
2265socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2266{
2267#ifdef MS_WINDOWS
2268 struct timeval tv;
2269#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002270#ifndef HAVE_POLL
2271 _PyTime_t ms;
2272#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002273 int overflow = 0;
2274
2275 if (timeout_obj == Py_None) {
2276 *timeout = -1;
2277 return 0;
2278 }
2279
Victor Stinner869e1772015-03-30 03:49:14 +02002280 if (_PyTime_FromSecondsObject(timeout,
2281 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002282 return -1;
2283
2284 if (*timeout < 0) {
2285 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2286 return -1;
2287 }
2288
2289#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002290 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002291#endif
2292#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002293 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2294 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002295#endif
2296 if (overflow) {
2297 PyErr_SetString(PyExc_OverflowError,
2298 "timeout doesn't fit into C timeval");
2299 return -1;
2300 }
2301
2302 return 0;
2303}
2304
Guido van Rossum11ba0942002-06-13 15:07:44 +00002305/* s.settimeout(timeout) method. Argument:
2306 None -- no timeout, blocking mode; same as setblocking(True)
2307 0.0 -- non-blocking mode; same as setblocking(False)
2308 > 0 -- timeout mode; operations time out after timeout seconds
2309 < 0 -- illegal; raises an exception
2310*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002311static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002312sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002313{
Victor Stinner71694d52015-03-28 01:18:54 +01002314 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002315
Victor Stinner71694d52015-03-28 01:18:54 +01002316 if (socket_parse_timeout(&timeout, arg) < 0)
2317 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002319 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002320 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 Py_INCREF(Py_None);
2323 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002324}
2325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002326PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002327"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002328\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002329Set a timeout on socket operations. 'timeout' can be a float,\n\
2330giving in seconds, or None. Setting a timeout of None disables\n\
2331the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002332Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002333
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002334/* s.gettimeout() method.
2335 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002336static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002337sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002338{
Victor Stinner71694d52015-03-28 01:18:54 +01002339 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 Py_INCREF(Py_None);
2341 return Py_None;
2342 }
Victor Stinner71694d52015-03-28 01:18:54 +01002343 else {
2344 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2345 return PyFloat_FromDouble(seconds);
2346 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002347}
2348
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002349PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002350"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002351\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002352Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002353operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002354operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002355
Guido van Rossumaee08791992-09-08 09:05:33 +00002356/* s.setsockopt() method.
2357 With an integer third argument, sets an integer option.
2358 With a string third argument, sets an option from a buffer;
2359 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002360
Guido van Rossum73624e91994-10-10 17:59:00 +00002361static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002362sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 int level;
2365 int optname;
2366 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002367 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 if (PyArg_ParseTuple(args, "iii:setsockopt",
2371 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002372 res = setsockopt(s->sock_fd, level, optname,
2373 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 }
2375 else {
2376 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002377 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2378 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002380 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2381 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002382 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 if (res < 0)
2384 return s->errorhandler();
2385 Py_INCREF(Py_None);
2386 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002387}
2388
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002389PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002390"setsockopt(level, option, value)\n\
2391\n\
2392Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002393The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002394
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002395
Guido van Rossumaee08791992-09-08 09:05:33 +00002396/* s.getsockopt() method.
2397 With two arguments, retrieves an integer option.
2398 With a third integer argument, retrieves a string buffer of that size;
2399 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002400
Guido van Rossum73624e91994-10-10 17:59:00 +00002401static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002402sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002403{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002404 int level;
2405 int optname;
2406 int res;
2407 PyObject *buf;
2408 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2411 &level, &optname, &buflen))
2412 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 if (buflen == 0) {
2415 int flag = 0;
2416 socklen_t flagsize = sizeof flag;
2417 res = getsockopt(s->sock_fd, level, optname,
2418 (void *)&flag, &flagsize);
2419 if (res < 0)
2420 return s->errorhandler();
2421 return PyLong_FromLong(flag);
2422 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002424 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 "getsockopt buflen out of range");
2426 return NULL;
2427 }
2428 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2429 if (buf == NULL)
2430 return NULL;
2431 res = getsockopt(s->sock_fd, level, optname,
2432 (void *)PyBytes_AS_STRING(buf), &buflen);
2433 if (res < 0) {
2434 Py_DECREF(buf);
2435 return s->errorhandler();
2436 }
2437 _PyBytes_Resize(&buf, buflen);
2438 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002439}
2440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442"getsockopt(level, option[, buffersize]) -> value\n\
2443\n\
2444Get a socket option. See the Unix manual for level and option.\n\
2445If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002446string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002447
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002448
Fred Drake728819a2000-07-01 03:40:12 +00002449/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002450
Guido van Rossum73624e91994-10-10 17:59:00 +00002451static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002452sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002453{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002454 sock_addr_t addrbuf;
2455 int addrlen;
2456 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2459 return NULL;
2460 Py_BEGIN_ALLOW_THREADS
2461 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2462 Py_END_ALLOW_THREADS
2463 if (res < 0)
2464 return s->errorhandler();
2465 Py_INCREF(Py_None);
2466 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002467}
2468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002469PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002470"bind(address)\n\
2471\n\
2472Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002473pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002474sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002475
Guido van Rossum30a685f1991-06-27 15:51:29 +00002476
2477/* s.close() method.
2478 Set the file descriptor to -1 so operations tried subsequently
2479 will surely fail. */
2480
Guido van Rossum73624e91994-10-10 17:59:00 +00002481static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002482sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002483{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002485
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002486 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2487 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2488 * for more details.
2489 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002490 if ((fd = s->sock_fd) != -1) {
2491 s->sock_fd = -1;
2492 Py_BEGIN_ALLOW_THREADS
2493 (void) SOCKETCLOSE(fd);
2494 Py_END_ALLOW_THREADS
2495 }
2496 Py_INCREF(Py_None);
2497 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002498}
2499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002501"close()\n\
2502\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002503Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002504
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002505static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002506sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002507{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002508 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002509 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002510 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002511}
2512
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002513PyDoc_STRVAR(detach_doc,
2514"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002515\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002516Close the socket object without closing the underlying file descriptor.\n\
2517The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002518can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002519
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002520static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002521internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002522 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002523{
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002524#ifdef MS_WINDOWS
2525# define GET_ERROR WSAGetLastError()
2526# define IN_PROGRESS_ERR WSAEWOULDBLOCK
2527# define TIMEOUT_ERR WSAEWOULDBLOCK
2528#else
2529# define GET_ERROR errno
2530# define IN_PROGRESS_ERR EINPROGRESS
2531# define TIMEOUT_ERR EWOULDBLOCK
2532#endif
2533
Victor Stinner70a46f62015-03-31 22:03:59 +02002534 int res, err, wait_connect, timeout;
2535 socklen_t res_size;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002536
Victor Stinner70a46f62015-03-31 22:03:59 +02002537 *timeoutp = 0;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002538
2539 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002540 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002541 Py_END_ALLOW_THREADS
2542
Victor Stinner70a46f62015-03-31 22:03:59 +02002543 if (!res) {
2544 /* connect() succeeded, the socket is connected */
2545 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002546 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002547
Victor Stinner70a46f62015-03-31 22:03:59 +02002548 err = GET_ERROR;
Victor Stinnera7726622015-04-01 11:09:43 +02002549 if (CHECK_ERRNO(EINTR) && PyErr_CheckSignals())
Victor Stinneree699e92015-03-31 21:28:42 +02002550 return -1;
2551
Victor Stinner70a46f62015-03-31 22:03:59 +02002552 wait_connect = (s->sock_timeout > 0 && err == IN_PROGRESS_ERR
2553 && IS_SELECTABLE(s));
2554 if (!wait_connect)
2555 return err;
2556
2557 timeout = internal_connect_select(s);
2558 if (timeout == -1) {
2559 /* select() failed */
2560 err = GET_ERROR;
Victor Stinnera7726622015-04-01 11:09:43 +02002561 if (CHECK_ERRNO(EINTR) && PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002562 return -1;
2563 return err;
2564 }
2565
2566 if (timeout == 1) {
2567 /* select() timed out */
2568 *timeoutp = 1;
2569 return TIMEOUT_ERR;
2570 }
2571
2572 res_size = sizeof res;
2573 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2574 (void *)&res, &res_size)) {
2575 /* getsockopt() failed */
2576 return GET_ERROR;
2577 }
2578
2579 if (res == EISCONN)
2580 return 0;
2581 return res;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002582
2583#undef GET_ERROR
2584#undef IN_PROGRESS_ERR
2585#undef TIMEOUT_ERR
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002586}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002587
Fred Drake728819a2000-07-01 03:40:12 +00002588/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002589
Guido van Rossum73624e91994-10-10 17:59:00 +00002590static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002591sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002592{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 sock_addr_t addrbuf;
2594 int addrlen;
2595 int res;
2596 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002598 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2599 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002601 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Victor Stinneree699e92015-03-31 21:28:42 +02002602 if (res < 0)
2603 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 if (timeout == 1) {
2606 PyErr_SetString(socket_timeout, "timed out");
2607 return NULL;
2608 }
Victor Stinneree699e92015-03-31 21:28:42 +02002609
Victor Stinner71694d52015-03-28 01:18:54 +01002610 if (res != 0) {
Victor Stinnerdd88d3d2015-03-31 16:08:22 +02002611#ifdef MS_WINDOWS
Victor Stinnerdd88d3d2015-03-31 16:08:22 +02002612 WSASetLastError(res);
2613#else
2614 errno = res;
2615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return s->errorhandler();
Victor Stinner71694d52015-03-28 01:18:54 +01002617 }
Victor Stinneree699e92015-03-31 21:28:42 +02002618
2619 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002620}
2621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002622PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002623"connect(address)\n\
2624\n\
2625Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002626is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002627
Guido van Rossum30a685f1991-06-27 15:51:29 +00002628
Fred Drake728819a2000-07-01 03:40:12 +00002629/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002630
2631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002632sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 sock_addr_t addrbuf;
2635 int addrlen;
2636 int res;
2637 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002639 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2640 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002642 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Victor Stinner71694d52015-03-28 01:18:54 +01002643 if (res < 0)
2644 return NULL;
2645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002646 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002647}
2648
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002649PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002650"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002651\n\
2652This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002653instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002654
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002655
Guido van Rossumed233a51992-06-23 09:07:03 +00002656/* s.fileno() method */
2657
Guido van Rossum73624e91994-10-10 17:59:00 +00002658static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002659sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002661 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002662}
2663
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002664PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002665"fileno() -> integer\n\
2666\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002667Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002668
Guido van Rossumed233a51992-06-23 09:07:03 +00002669
Guido van Rossumc89705d1992-11-26 08:54:07 +00002670/* s.getsockname() method */
2671
Guido van Rossum73624e91994-10-10 17:59:00 +00002672static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002673sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002674{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 sock_addr_t addrbuf;
2676 int res;
2677 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002678
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002679 if (!getsockaddrlen(s, &addrlen))
2680 return NULL;
2681 memset(&addrbuf, 0, addrlen);
2682 Py_BEGIN_ALLOW_THREADS
2683 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2684 Py_END_ALLOW_THREADS
2685 if (res < 0)
2686 return s->errorhandler();
2687 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2688 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002689}
2690
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002691PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002692"getsockname() -> address info\n\
2693\n\
2694Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002695info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002696
Guido van Rossumc89705d1992-11-26 08:54:07 +00002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002699/* s.getpeername() method */
2700
Guido van Rossum73624e91994-10-10 17:59:00 +00002701static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002702sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002703{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002704 sock_addr_t addrbuf;
2705 int res;
2706 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 if (!getsockaddrlen(s, &addrlen))
2709 return NULL;
2710 memset(&addrbuf, 0, addrlen);
2711 Py_BEGIN_ALLOW_THREADS
2712 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2713 Py_END_ALLOW_THREADS
2714 if (res < 0)
2715 return s->errorhandler();
2716 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2717 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002718}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002720PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002721"getpeername() -> address info\n\
2722\n\
2723Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002724info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002725
Guido van Rossumb6775db1994-08-01 11:34:53 +00002726#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002727
2728
Guido van Rossum30a685f1991-06-27 15:51:29 +00002729/* s.listen(n) method */
2730
Guido van Rossum73624e91994-10-10 17:59:00 +00002731static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002732sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002733{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002734 /* We try to choose a default backlog high enough to avoid connection drops
2735 * for common workloads, yet not too high to limit resource usage. */
2736 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002738
Charles-François Natali644b8f52014-05-22 19:45:39 +01002739 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002741
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002742 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002743 /* To avoid problems on systems that don't allow a negative backlog
2744 * (which doesn't make sense anyway) we force a minimum value of 0. */
2745 if (backlog < 0)
2746 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747 res = listen(s->sock_fd, backlog);
2748 Py_END_ALLOW_THREADS
2749 if (res < 0)
2750 return s->errorhandler();
2751 Py_INCREF(Py_None);
2752 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002753}
2754
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002755PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002756"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002757\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002758Enable a server to accept connections. If backlog is specified, it must be\n\
2759at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002760unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002761connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002762
Victor Stinner31bf2d52015-04-01 21:57:09 +02002763struct sock_recv {
2764 char *cbuf;
2765 Py_ssize_t len;
2766 int flags;
2767 Py_ssize_t result;
2768};
2769
2770static int
2771sock_recv_impl(PySocketSockObject *s, void *data)
2772{
2773 struct sock_recv *ctx = data;
2774
2775#ifdef MS_WINDOWS
2776 if (ctx->len > INT_MAX)
2777 ctx->len = INT_MAX;
2778 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2779#else
2780 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2781#endif
2782 return (ctx->result >= 0);
2783}
2784
Guido van Rossum82a5c661998-07-07 20:45:43 +00002785
Thomas Wouters477c8d52006-05-27 19:21:47 +00002786/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002787 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002788 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002789 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002790 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002791 * also possible that we return a number of bytes smaller than the request
2792 * bytes.
2793 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002794
Antoine Pitrou19467d22010-08-17 19:33:30 +00002795static Py_ssize_t
2796sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002797{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002798 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 if (!IS_SELECTABLE(s)) {
2801 select_error();
2802 return -1;
2803 }
2804 if (len == 0) {
2805 /* If 0 bytes were requested, do nothing. */
2806 return 0;
2807 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808
Victor Stinner31bf2d52015-04-01 21:57:09 +02002809 ctx.cbuf = cbuf;
2810 ctx.len = len;
2811 ctx.flags = flags;
2812 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002813 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002814
2815 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002816}
2817
Guido van Rossum48a680c2001-03-02 06:34:14 +00002818
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002819/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002820
Guido van Rossum73624e91994-10-10 17:59:00 +00002821static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002822sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002823{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002824 Py_ssize_t recvlen, outlen;
2825 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002826 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002827
Antoine Pitrou19467d22010-08-17 19:33:30 +00002828 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002829 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002830
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002831 if (recvlen < 0) {
2832 PyErr_SetString(PyExc_ValueError,
2833 "negative buffersize in recv");
2834 return NULL;
2835 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002836
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002837 /* Allocate a new string. */
2838 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2839 if (buf == NULL)
2840 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 /* Call the guts */
2843 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2844 if (outlen < 0) {
2845 /* An error occurred, release the string and return an
2846 error. */
2847 Py_DECREF(buf);
2848 return NULL;
2849 }
2850 if (outlen != recvlen) {
2851 /* We did not read as many bytes as we anticipated, resize the
2852 string if possible and be successful. */
2853 _PyBytes_Resize(&buf, outlen);
2854 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002855
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002856 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002857}
2858
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002859PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002860"recv(buffersize[, flags]) -> data\n\
2861\n\
2862Receive up to buffersize bytes from the socket. For the optional flags\n\
2863argument, see the Unix manual. When no data is available, block until\n\
2864at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002865the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002866
Guido van Rossum30a685f1991-06-27 15:51:29 +00002867
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002868/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002869
Thomas Wouters477c8d52006-05-27 19:21:47 +00002870static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002871sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002874
Antoine Pitrou19467d22010-08-17 19:33:30 +00002875 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 Py_buffer pbuf;
2877 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002878 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002881 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 &pbuf, &recvlen, &flags))
2883 return NULL;
2884 buf = pbuf.buf;
2885 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 if (recvlen < 0) {
2888 PyBuffer_Release(&pbuf);
2889 PyErr_SetString(PyExc_ValueError,
2890 "negative buffersize in recv_into");
2891 return NULL;
2892 }
2893 if (recvlen == 0) {
2894 /* If nbytes was not specified, use the buffer's length */
2895 recvlen = buflen;
2896 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 /* Check if the buffer is large enough */
2899 if (buflen < recvlen) {
2900 PyBuffer_Release(&pbuf);
2901 PyErr_SetString(PyExc_ValueError,
2902 "buffer too small for requested bytes");
2903 return NULL;
2904 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002906 /* Call the guts */
2907 readlen = sock_recv_guts(s, buf, recvlen, flags);
2908 if (readlen < 0) {
2909 /* Return an error. */
2910 PyBuffer_Release(&pbuf);
2911 return NULL;
2912 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002914 PyBuffer_Release(&pbuf);
2915 /* Return the number of bytes read. Note that we do not do anything
2916 special here in the case that readlen < recvlen. */
2917 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918}
2919
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002920PyDoc_STRVAR(recv_into_doc,
2921"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002922\n\
2923A version of recv() that stores its data into a buffer rather than creating \n\
2924a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2925is not specified (or 0), receive up to the size available in the given buffer.\n\
2926\n\
2927See recv() for documentation about the flags.");
2928
Victor Stinner31bf2d52015-04-01 21:57:09 +02002929struct sock_recvfrom {
2930 char* cbuf;
2931 Py_ssize_t len;
2932 int flags;
2933 socklen_t *addrlen;
2934 sock_addr_t *addrbuf;
2935 Py_ssize_t result;
2936};
2937
2938static int
2939sock_recvfrom_impl(PySocketSockObject *s, void *data)
2940{
2941 struct sock_recvfrom *ctx = data;
2942
2943 memset(ctx->addrbuf, 0, *ctx->addrlen);
2944
2945#ifdef MS_WINDOWS
2946 if (ctx->len > INT_MAX)
2947 ctx->len = INT_MAX;
2948 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
2949 SAS2SA(ctx->addrbuf), ctx->addrlen);
2950#else
2951 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
2952 SAS2SA(ctx->addrbuf), ctx->addrlen);
2953#endif
2954 return (ctx->result >= 0);
2955}
2956
Thomas Wouters477c8d52006-05-27 19:21:47 +00002957
2958/*
Christian Heimes99170a52007-12-19 02:07:34 +00002959 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2960 * into a char buffer. If you have any inc/def ref to do to the objects that
2961 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002962 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002963 * that it is also possible that we return a number of bytes smaller than the
2964 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002965 *
2966 * 'addr' is a return value for the address object. Note that you must decref
2967 * it yourself.
2968 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002969static Py_ssize_t
2970sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002971 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002974 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002975 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002976
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002977 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002979 if (!getsockaddrlen(s, &addrlen))
2980 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 if (!IS_SELECTABLE(s)) {
2983 select_error();
2984 return -1;
2985 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002986
Victor Stinner31bf2d52015-04-01 21:57:09 +02002987 ctx.cbuf = cbuf;
2988 ctx.len = len;
2989 ctx.flags = flags;
2990 ctx.addrbuf = &addrbuf;
2991 ctx.addrlen = &addrlen;
2992 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002994
Victor Stinner31bf2d52015-04-01 21:57:09 +02002995 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2996 s->sock_proto);
2997 if (*addr == NULL)
2998 return -1;
2999
3000 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003001}
3002
3003/* s.recvfrom(nbytes [,flags]) method */
3004
3005static PyObject *
3006sock_recvfrom(PySocketSockObject *s, PyObject *args)
3007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003008 PyObject *buf = NULL;
3009 PyObject *addr = NULL;
3010 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003011 int flags = 0;
3012 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003013
Antoine Pitrou19467d22010-08-17 19:33:30 +00003014 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 if (recvlen < 0) {
3018 PyErr_SetString(PyExc_ValueError,
3019 "negative buffersize in recvfrom");
3020 return NULL;
3021 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3024 if (buf == NULL)
3025 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3028 recvlen, flags, &addr);
3029 if (outlen < 0) {
3030 goto finally;
3031 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 if (outlen != recvlen) {
3034 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003035 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003037 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 goto finally;
3039 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003042
3043finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 Py_XDECREF(buf);
3045 Py_XDECREF(addr);
3046 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003047}
3048
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003049PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003050"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3051\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003052Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003053
Thomas Wouters477c8d52006-05-27 19:21:47 +00003054
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003055/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003056
3057static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003058sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003060 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003061
Antoine Pitrou19467d22010-08-17 19:33:30 +00003062 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 Py_buffer pbuf;
3064 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003065 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003067 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003068
Antoine Pitrou19467d22010-08-17 19:33:30 +00003069 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 kwlist, &pbuf,
3071 &recvlen, &flags))
3072 return NULL;
3073 buf = pbuf.buf;
3074 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 if (recvlen < 0) {
3077 PyBuffer_Release(&pbuf);
3078 PyErr_SetString(PyExc_ValueError,
3079 "negative buffersize in recvfrom_into");
3080 return NULL;
3081 }
3082 if (recvlen == 0) {
3083 /* If nbytes was not specified, use the buffer's length */
3084 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003085 } else if (recvlen > buflen) {
3086 PyBuffer_Release(&pbuf);
3087 PyErr_SetString(PyExc_ValueError,
3088 "nbytes is greater than the length of the buffer");
3089 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003092 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3093 if (readlen < 0) {
3094 PyBuffer_Release(&pbuf);
3095 /* Return an error */
3096 Py_XDECREF(addr);
3097 return NULL;
3098 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 PyBuffer_Release(&pbuf);
3101 /* Return the number of bytes read and the address. Note that we do
3102 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003103 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003104}
3105
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003106PyDoc_STRVAR(recvfrom_into_doc,
3107"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003108\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003109Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110
Victor Stinner31bf2d52015-04-01 21:57:09 +02003111struct sock_recvmsg {
3112 struct msghdr *msg;
3113 int flags;
3114 ssize_t result;
3115};
3116
3117static int
3118sock_recvmsg_impl(PySocketSockObject *s, void *data)
3119{
3120 struct sock_recvmsg *ctx = data;
3121
3122 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3123 return (ctx->result >= 0);
3124}
3125
Thomas Wouters477c8d52006-05-27 19:21:47 +00003126
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003127/* The sendmsg() and recvmsg[_into]() methods require a working
3128 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3129#ifdef CMSG_LEN
3130/*
3131 * Call recvmsg() with the supplied iovec structures, flags, and
3132 * ancillary data buffer size (controllen). Returns the tuple return
3133 * value for recvmsg() or recvmsg_into(), with the first item provided
3134 * by the supplied makeval() function. makeval() will be called with
3135 * the length read and makeval_data as arguments, and must return a
3136 * new reference (which will be decrefed if there is a subsequent
3137 * error). On error, closes any file descriptors received via
3138 * SCM_RIGHTS.
3139 */
3140static PyObject *
3141sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3142 int flags, Py_ssize_t controllen,
3143 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3144{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003145 sock_addr_t addrbuf;
3146 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003147 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003148 PyObject *cmsg_list = NULL, *retval = NULL;
3149 void *controlbuf = NULL;
3150 struct cmsghdr *cmsgh;
3151 size_t cmsgdatalen = 0;
3152 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003153 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003154
3155 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3156 ignored" when the socket is connected (Linux fills them in
3157 anyway for AF_UNIX sockets at least). Normally msg_namelen
3158 seems to be set to 0 if there's no address, but try to
3159 initialize msg_name to something that won't be mistaken for a
3160 real address if that doesn't happen. */
3161 if (!getsockaddrlen(s, &addrbuflen))
3162 return NULL;
3163 memset(&addrbuf, 0, addrbuflen);
3164 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3165
3166 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3167 PyErr_SetString(PyExc_ValueError,
3168 "invalid ancillary data buffer length");
3169 return NULL;
3170 }
3171 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3172 return PyErr_NoMemory();
3173
3174 /* Make the system call. */
3175 if (!IS_SELECTABLE(s)) {
3176 select_error();
3177 goto finally;
3178 }
3179
Victor Stinner31bf2d52015-04-01 21:57:09 +02003180 msg.msg_name = SAS2SA(&addrbuf);
3181 msg.msg_namelen = addrbuflen;
3182 msg.msg_iov = iov;
3183 msg.msg_iovlen = iovlen;
3184 msg.msg_control = controlbuf;
3185 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003186
Victor Stinner31bf2d52015-04-01 21:57:09 +02003187 ctx.msg = &msg;
3188 ctx.flags = flags;
3189 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003190 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003191
3192 /* Make list of (level, type, data) tuples from control messages. */
3193 if ((cmsg_list = PyList_New(0)) == NULL)
3194 goto err_closefds;
3195 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3196 implementations didn't do so. */
3197 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3198 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3199 PyObject *bytes, *tuple;
3200 int tmp;
3201
3202 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3203 if (cmsg_status != 0) {
3204 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3205 "received malformed or improperly-truncated "
3206 "ancillary data", 1) == -1)
3207 goto err_closefds;
3208 }
3209 if (cmsg_status < 0)
3210 break;
3211 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003212 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003213 goto err_closefds;
3214 }
3215
3216 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3217 cmsgdatalen);
3218 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3219 (int)cmsgh->cmsg_type, bytes);
3220 if (tuple == NULL)
3221 goto err_closefds;
3222 tmp = PyList_Append(cmsg_list, tuple);
3223 Py_DECREF(tuple);
3224 if (tmp != 0)
3225 goto err_closefds;
3226
3227 if (cmsg_status != 0)
3228 break;
3229 }
3230
3231 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003232 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003233 cmsg_list,
3234 (int)msg.msg_flags,
3235 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3236 ((msg.msg_namelen > addrbuflen) ?
3237 addrbuflen : msg.msg_namelen),
3238 s->sock_proto));
3239 if (retval == NULL)
3240 goto err_closefds;
3241
3242finally:
3243 Py_XDECREF(cmsg_list);
3244 PyMem_Free(controlbuf);
3245 return retval;
3246
3247err_closefds:
3248#ifdef SCM_RIGHTS
3249 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3250 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3251 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3252 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3253 if (cmsg_status < 0)
3254 break;
3255 if (cmsgh->cmsg_level == SOL_SOCKET &&
3256 cmsgh->cmsg_type == SCM_RIGHTS) {
3257 size_t numfds;
3258 int *fdp;
3259
3260 numfds = cmsgdatalen / sizeof(int);
3261 fdp = (int *)CMSG_DATA(cmsgh);
3262 while (numfds-- > 0)
3263 close(*fdp++);
3264 }
3265 if (cmsg_status != 0)
3266 break;
3267 }
3268#endif /* SCM_RIGHTS */
3269 goto finally;
3270}
3271
3272
3273static PyObject *
3274makeval_recvmsg(ssize_t received, void *data)
3275{
3276 PyObject **buf = data;
3277
3278 if (received < PyBytes_GET_SIZE(*buf))
3279 _PyBytes_Resize(buf, received);
3280 Py_XINCREF(*buf);
3281 return *buf;
3282}
3283
3284/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3285
3286static PyObject *
3287sock_recvmsg(PySocketSockObject *s, PyObject *args)
3288{
3289 Py_ssize_t bufsize, ancbufsize = 0;
3290 int flags = 0;
3291 struct iovec iov;
3292 PyObject *buf = NULL, *retval = NULL;
3293
3294 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3295 return NULL;
3296
3297 if (bufsize < 0) {
3298 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3299 return NULL;
3300 }
3301 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3302 return NULL;
3303 iov.iov_base = PyBytes_AS_STRING(buf);
3304 iov.iov_len = bufsize;
3305
3306 /* Note that we're passing a pointer to *our pointer* to the bytes
3307 object here (&buf); makeval_recvmsg() may incref the object, or
3308 deallocate it and set our pointer to NULL. */
3309 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3310 &makeval_recvmsg, &buf);
3311 Py_XDECREF(buf);
3312 return retval;
3313}
3314
3315PyDoc_STRVAR(recvmsg_doc,
3316"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3317\n\
3318Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3319socket. The ancbufsize argument sets the size in bytes of the\n\
3320internal buffer used to receive the ancillary data; it defaults to 0,\n\
3321meaning that no ancillary data will be received. Appropriate buffer\n\
3322sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3323CMSG_LEN(), and items which do not fit into the buffer might be\n\
3324truncated or discarded. The flags argument defaults to 0 and has the\n\
3325same meaning as for recv().\n\
3326\n\
3327The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3328The data item is a bytes object holding the non-ancillary data\n\
3329received. The ancdata item is a list of zero or more tuples\n\
3330(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3331(control messages) received: cmsg_level and cmsg_type are integers\n\
3332specifying the protocol level and protocol-specific type respectively,\n\
3333and cmsg_data is a bytes object holding the associated data. The\n\
3334msg_flags item is the bitwise OR of various flags indicating\n\
3335conditions on the received message; see your system documentation for\n\
3336details. If the receiving socket is unconnected, address is the\n\
3337address of the sending socket, if available; otherwise, its value is\n\
3338unspecified.\n\
3339\n\
3340If recvmsg() raises an exception after the system call returns, it\n\
3341will first attempt to close any file descriptors received via the\n\
3342SCM_RIGHTS mechanism.");
3343
3344
3345static PyObject *
3346makeval_recvmsg_into(ssize_t received, void *data)
3347{
3348 return PyLong_FromSsize_t(received);
3349}
3350
3351/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3352
3353static PyObject *
3354sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3355{
3356 Py_ssize_t ancbufsize = 0;
3357 int flags = 0;
3358 struct iovec *iovs = NULL;
3359 Py_ssize_t i, nitems, nbufs = 0;
3360 Py_buffer *bufs = NULL;
3361 PyObject *buffers_arg, *fast, *retval = NULL;
3362
3363 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3364 &buffers_arg, &ancbufsize, &flags))
3365 return NULL;
3366
3367 if ((fast = PySequence_Fast(buffers_arg,
3368 "recvmsg_into() argument 1 must be an "
3369 "iterable")) == NULL)
3370 return NULL;
3371 nitems = PySequence_Fast_GET_SIZE(fast);
3372 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003373 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003374 goto finally;
3375 }
3376
3377 /* Fill in an iovec for each item, and save the Py_buffer
3378 structs to release afterwards. */
3379 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3380 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3381 PyErr_NoMemory();
3382 goto finally;
3383 }
3384 for (; nbufs < nitems; nbufs++) {
3385 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3386 "w*;recvmsg_into() argument 1 must be an iterable "
3387 "of single-segment read-write buffers",
3388 &bufs[nbufs]))
3389 goto finally;
3390 iovs[nbufs].iov_base = bufs[nbufs].buf;
3391 iovs[nbufs].iov_len = bufs[nbufs].len;
3392 }
3393
3394 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3395 &makeval_recvmsg_into, NULL);
3396finally:
3397 for (i = 0; i < nbufs; i++)
3398 PyBuffer_Release(&bufs[i]);
3399 PyMem_Free(bufs);
3400 PyMem_Free(iovs);
3401 Py_DECREF(fast);
3402 return retval;
3403}
3404
3405PyDoc_STRVAR(recvmsg_into_doc,
3406"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3407\n\
3408Receive normal data and ancillary data from the socket, scattering the\n\
3409non-ancillary data into a series of buffers. The buffers argument\n\
3410must be an iterable of objects that export writable buffers\n\
3411(e.g. bytearray objects); these will be filled with successive chunks\n\
3412of the non-ancillary data until it has all been written or there are\n\
3413no more buffers. The ancbufsize argument sets the size in bytes of\n\
3414the internal buffer used to receive the ancillary data; it defaults to\n\
34150, meaning that no ancillary data will be received. Appropriate\n\
3416buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3417or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3418truncated or discarded. The flags argument defaults to 0 and has the\n\
3419same meaning as for recv().\n\
3420\n\
3421The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3422The nbytes item is the total number of bytes of non-ancillary data\n\
3423written into the buffers. The ancdata item is a list of zero or more\n\
3424tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3425data (control messages) received: cmsg_level and cmsg_type are\n\
3426integers specifying the protocol level and protocol-specific type\n\
3427respectively, and cmsg_data is a bytes object holding the associated\n\
3428data. The msg_flags item is the bitwise OR of various flags\n\
3429indicating conditions on the received message; see your system\n\
3430documentation for details. If the receiving socket is unconnected,\n\
3431address is the address of the sending socket, if available; otherwise,\n\
3432its value is unspecified.\n\
3433\n\
3434If recvmsg_into() raises an exception after the system call returns,\n\
3435it will first attempt to close any file descriptors received via the\n\
3436SCM_RIGHTS mechanism.");
3437#endif /* CMSG_LEN */
3438
3439
Victor Stinner31bf2d52015-04-01 21:57:09 +02003440struct sock_send {
3441 char *buf;
3442 Py_ssize_t len;
3443 int flags;
3444 Py_ssize_t result;
3445};
3446
3447static int
3448sock_send_impl(PySocketSockObject *s, void *data)
3449{
3450 struct sock_send *ctx = data;
3451
3452#ifdef MS_WINDOWS
3453 if (ctx->len > INT_MAX)
3454 ctx->len = INT_MAX;
3455 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3456#else
3457 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3458#endif
3459 return (ctx->result >= 0);
3460}
3461
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003462/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003463
Guido van Rossum73624e91994-10-10 17:59:00 +00003464static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003465sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003466{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003467 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003468 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003469 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003471 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3472 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 if (!IS_SELECTABLE(s)) {
3475 PyBuffer_Release(&pbuf);
3476 return select_error();
3477 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003478 ctx.buf = pbuf.buf;
3479 ctx.len = pbuf.len;
3480 ctx.flags = flags;
3481 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003482 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003483 return NULL;
3484 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003485 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003486
3487 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003488}
3489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003490PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003491"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003492\n\
3493Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003494argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003495sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003496
3497
3498/* s.sendall(data [,flags]) method */
3499
3500static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003501sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003503 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003504 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003505 int async_err = 0;
3506 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003507 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003509 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3510 return NULL;
3511 buf = pbuf.buf;
3512 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 if (!IS_SELECTABLE(s)) {
3515 PyBuffer_Release(&pbuf);
3516 return select_error();
3517 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003520 timeout = internal_select(s, 1, s->sock_timeout);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003523 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003524 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003525#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003526 if (len > INT_MAX)
3527 len = INT_MAX;
3528 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003529#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003530 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003531#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003532 Py_END_ALLOW_THREADS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003533 }
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003534 if (timeout == 1) {
3535 PyBuffer_Release(&pbuf);
3536 PyErr_SetString(socket_timeout, "timed out");
3537 return NULL;
3538 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003539 if (n >= 0) {
3540 buf += n;
3541 len -= n;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003542 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003543 } while (len > 0 && (n >= 0 || errno == EINTR) &&
3544 !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003545 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003546
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003547 if (n < 0 || async_err)
3548 return (!async_err) ? s->errorhandler() : NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003549
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003550 Py_INCREF(Py_None);
3551 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003552}
3553
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003554PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003555"sendall(data[, flags])\n\
3556\n\
3557Send a data string to the socket. For the optional flags\n\
3558argument, see the Unix manual. This calls send() repeatedly\n\
3559until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003560to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003561
Guido van Rossum30a685f1991-06-27 15:51:29 +00003562
Victor Stinner31bf2d52015-04-01 21:57:09 +02003563struct sock_sendto {
3564 char *buf;
3565 Py_ssize_t len;
3566 int flags;
3567 int addrlen;
3568 sock_addr_t *addrbuf;
3569 Py_ssize_t result;
3570};
3571
3572static int
3573sock_sendto_impl(PySocketSockObject *s, void *data)
3574{
3575 struct sock_sendto *ctx = data;
3576
3577#ifdef MS_WINDOWS
3578 if (ctx->len > INT_MAX)
3579 ctx->len = INT_MAX;
3580 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3581 SAS2SA(ctx->addrbuf), ctx->addrlen);
3582#else
3583 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3584 SAS2SA(ctx->addrbuf), ctx->addrlen);
3585#endif
3586 return (ctx->result >= 0);
3587}
3588
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003589/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003590
Guido van Rossum73624e91994-10-10 17:59:00 +00003591static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003592sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003593{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 Py_buffer pbuf;
3595 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003596 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003598 int addrlen, flags;
3599 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003602 arglen = PyTuple_Size(args);
3603 switch (arglen) {
3604 case 2:
3605 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3606 break;
3607 case 3:
3608 PyArg_ParseTuple(args, "y*iO:sendto",
3609 &pbuf, &flags, &addro);
3610 break;
3611 default:
3612 PyErr_Format(PyExc_TypeError,
3613 "sendto() takes 2 or 3 arguments (%d given)",
3614 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003615 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003616 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003617 if (PyErr_Occurred())
3618 return NULL;
3619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003620 if (!IS_SELECTABLE(s)) {
3621 PyBuffer_Release(&pbuf);
3622 return select_error();
3623 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3626 PyBuffer_Release(&pbuf);
3627 return NULL;
3628 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003629
Victor Stinner31bf2d52015-04-01 21:57:09 +02003630 ctx.buf = pbuf.buf;
3631 ctx.len = pbuf.len;
3632 ctx.flags = flags;
3633 ctx.addrlen = addrlen;
3634 ctx.addrbuf = &addrbuf;
3635 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003636 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003637 return NULL;
3638 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003639 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003640
3641 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003642}
3643
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003644PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003645"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003646\n\
3647Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003648For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003649
Guido van Rossum30a685f1991-06-27 15:51:29 +00003650
Victor Stinner31bf2d52015-04-01 21:57:09 +02003651struct sock_sendmsg {
3652 struct msghdr *msg;
3653 int flags;
3654 ssize_t result;
3655};
3656
3657static int
3658sock_sendmsg_impl(PySocketSockObject *s, void *data)
3659{
3660 struct sock_sendmsg *ctx = data;
3661
3662 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3663 return (ctx->result >= 0);
3664}
3665
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003666/* The sendmsg() and recvmsg[_into]() methods require a working
3667 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3668#ifdef CMSG_LEN
3669/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3670
3671static PyObject *
3672sock_sendmsg(PySocketSockObject *s, PyObject *args)
3673{
3674 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3675 Py_buffer *databufs = NULL;
3676 struct iovec *iovs = NULL;
3677 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003678 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003679 struct cmsginfo {
3680 int level;
3681 int type;
3682 Py_buffer data;
3683 } *cmsgs = NULL;
3684 void *controlbuf = NULL;
3685 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003686 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003687 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3688 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003689 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003690
3691 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3692 &data_arg, &cmsg_arg, &flags, &addr_arg))
3693 return NULL;
3694
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003695 /* Parse destination address. */
3696 if (addr_arg != NULL && addr_arg != Py_None) {
3697 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3698 goto finally;
3699 msg.msg_name = &addrbuf;
3700 msg.msg_namelen = addrlen;
3701 }
3702
3703 /* Fill in an iovec for each message part, and save the Py_buffer
3704 structs to release afterwards. */
3705 if ((data_fast = PySequence_Fast(data_arg,
3706 "sendmsg() argument 1 must be an "
3707 "iterable")) == NULL)
3708 goto finally;
3709 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3710 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003711 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003712 goto finally;
3713 }
3714 msg.msg_iovlen = ndataparts;
3715 if (ndataparts > 0 &&
3716 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3717 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3718 PyErr_NoMemory();
3719 goto finally;
3720 }
3721 for (; ndatabufs < ndataparts; ndatabufs++) {
3722 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3723 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003724 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003725 &databufs[ndatabufs]))
3726 goto finally;
3727 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3728 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3729 }
3730
3731 if (cmsg_arg == NULL)
3732 ncmsgs = 0;
3733 else {
3734 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3735 "sendmsg() argument 2 must be an "
3736 "iterable")) == NULL)
3737 goto finally;
3738 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3739 }
3740
3741#ifndef CMSG_SPACE
3742 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003743 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003744 "sending multiple control messages is not supported "
3745 "on this system");
3746 goto finally;
3747 }
3748#endif
3749 /* Save level, type and Py_buffer for each control message,
3750 and calculate total size. */
3751 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3752 PyErr_NoMemory();
3753 goto finally;
3754 }
3755 controllen = controllen_last = 0;
3756 while (ncmsgbufs < ncmsgs) {
3757 size_t bufsize, space;
3758
3759 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3760 "(iiy*):[sendmsg() ancillary data items]",
3761 &cmsgs[ncmsgbufs].level,
3762 &cmsgs[ncmsgbufs].type,
3763 &cmsgs[ncmsgbufs].data))
3764 goto finally;
3765 bufsize = cmsgs[ncmsgbufs++].data.len;
3766
3767#ifdef CMSG_SPACE
3768 if (!get_CMSG_SPACE(bufsize, &space)) {
3769#else
3770 if (!get_CMSG_LEN(bufsize, &space)) {
3771#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003772 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003773 goto finally;
3774 }
3775 controllen += space;
3776 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003777 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003778 goto finally;
3779 }
3780 controllen_last = controllen;
3781 }
3782
3783 /* Construct ancillary data block from control message info. */
3784 if (ncmsgbufs > 0) {
3785 struct cmsghdr *cmsgh = NULL;
3786
3787 if ((msg.msg_control = controlbuf =
3788 PyMem_Malloc(controllen)) == NULL) {
3789 PyErr_NoMemory();
3790 goto finally;
3791 }
3792 msg.msg_controllen = controllen;
3793
3794 /* Need to zero out the buffer as a workaround for glibc's
3795 CMSG_NXTHDR() implementation. After getting the pointer to
3796 the next header, it checks its (uninitialized) cmsg_len
3797 member to see if the "message" fits in the buffer, and
3798 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003799 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003800 memset(controlbuf, 0, controllen);
3801
3802 for (i = 0; i < ncmsgbufs; i++) {
3803 size_t msg_len, data_len = cmsgs[i].data.len;
3804 int enough_space = 0;
3805
3806 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3807 if (cmsgh == NULL) {
3808 PyErr_Format(PyExc_RuntimeError,
3809 "unexpected NULL result from %s()",
3810 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3811 goto finally;
3812 }
3813 if (!get_CMSG_LEN(data_len, &msg_len)) {
3814 PyErr_SetString(PyExc_RuntimeError,
3815 "item size out of range for CMSG_LEN()");
3816 goto finally;
3817 }
3818 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3819 size_t space;
3820
3821 cmsgh->cmsg_len = msg_len;
3822 if (get_cmsg_data_space(&msg, cmsgh, &space))
3823 enough_space = (space >= data_len);
3824 }
3825 if (!enough_space) {
3826 PyErr_SetString(PyExc_RuntimeError,
3827 "ancillary data does not fit in calculated "
3828 "space");
3829 goto finally;
3830 }
3831 cmsgh->cmsg_level = cmsgs[i].level;
3832 cmsgh->cmsg_type = cmsgs[i].type;
3833 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3834 }
3835 }
3836
3837 /* Make the system call. */
3838 if (!IS_SELECTABLE(s)) {
3839 select_error();
3840 goto finally;
3841 }
3842
Victor Stinner31bf2d52015-04-01 21:57:09 +02003843 ctx.msg = &msg;
3844 ctx.flags = flags;
3845 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003846 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003847
3848 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003849
3850finally:
3851 PyMem_Free(controlbuf);
3852 for (i = 0; i < ncmsgbufs; i++)
3853 PyBuffer_Release(&cmsgs[i].data);
3854 PyMem_Free(cmsgs);
3855 Py_XDECREF(cmsg_fast);
3856 for (i = 0; i < ndatabufs; i++)
3857 PyBuffer_Release(&databufs[i]);
3858 PyMem_Free(databufs);
3859 PyMem_Free(iovs);
3860 Py_XDECREF(data_fast);
3861 return retval;
3862}
3863
3864PyDoc_STRVAR(sendmsg_doc,
3865"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3866\n\
3867Send normal and ancillary data to the socket, gathering the\n\
3868non-ancillary data from a series of buffers and concatenating it into\n\
3869a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003870data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003871The ancdata argument specifies the ancillary data (control messages)\n\
3872as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3873cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3874protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003875is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003876argument defaults to 0 and has the same meaning as for send(). If\n\
3877address is supplied and not None, it sets a destination address for\n\
3878the message. The return value is the number of bytes of non-ancillary\n\
3879data sent.");
3880#endif /* CMSG_LEN */
3881
3882
Guido van Rossum30a685f1991-06-27 15:51:29 +00003883/* s.shutdown(how) method */
3884
Guido van Rossum73624e91994-10-10 17:59:00 +00003885static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003886sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003888 int how;
3889 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003890
Serhiy Storchaka78980432013-01-15 01:12:17 +02003891 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003892 if (how == -1 && PyErr_Occurred())
3893 return NULL;
3894 Py_BEGIN_ALLOW_THREADS
3895 res = shutdown(s->sock_fd, how);
3896 Py_END_ALLOW_THREADS
3897 if (res < 0)
3898 return s->errorhandler();
3899 Py_INCREF(Py_None);
3900 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003901}
3902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003903PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003904"shutdown(flag)\n\
3905\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003906Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3907of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003908
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003909#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003910static PyObject*
3911sock_ioctl(PySocketSockObject *s, PyObject *arg)
3912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003913 unsigned long cmd = SIO_RCVALL;
3914 PyObject *argO;
3915 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3918 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 switch (cmd) {
3921 case SIO_RCVALL: {
3922 unsigned int option = RCVALL_ON;
3923 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3924 return NULL;
3925 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3926 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3927 return set_error();
3928 }
3929 return PyLong_FromUnsignedLong(recv); }
3930 case SIO_KEEPALIVE_VALS: {
3931 struct tcp_keepalive ka;
3932 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3933 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3934 return NULL;
3935 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3936 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3937 return set_error();
3938 }
3939 return PyLong_FromUnsignedLong(recv); }
3940 default:
3941 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3942 return NULL;
3943 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003944}
3945PyDoc_STRVAR(sock_ioctl_doc,
3946"ioctl(cmd, option) -> long\n\
3947\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003948Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3949SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3950SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003951#endif
3952
3953#if defined(MS_WINDOWS)
3954static PyObject*
3955sock_share(PySocketSockObject *s, PyObject *arg)
3956{
3957 WSAPROTOCOL_INFO info;
3958 DWORD processId;
3959 int result;
3960
3961 if (!PyArg_ParseTuple(arg, "I", &processId))
3962 return NULL;
3963
3964 Py_BEGIN_ALLOW_THREADS
3965 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3966 Py_END_ALLOW_THREADS
3967 if (result == SOCKET_ERROR)
3968 return set_error();
3969 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3970}
3971PyDoc_STRVAR(sock_share_doc,
3972"share(process_id) -> bytes\n\
3973\n\
3974Share the socket with another process. The target process id\n\
3975must be provided and the resulting bytes object passed to the target\n\
3976process. There the shared socket can be instantiated by calling\n\
3977socket.fromshare().");
3978
Christian Heimesfaf2f632008-01-06 16:59:19 +00003979
3980#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003981
3982/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003983
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003984static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3986 accept_doc},
3987 {"bind", (PyCFunction)sock_bind, METH_O,
3988 bind_doc},
3989 {"close", (PyCFunction)sock_close, METH_NOARGS,
3990 close_doc},
3991 {"connect", (PyCFunction)sock_connect, METH_O,
3992 connect_doc},
3993 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3994 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003995 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3996 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3998 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003999#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004000 {"getpeername", (PyCFunction)sock_getpeername,
4001 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004002#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 {"getsockname", (PyCFunction)sock_getsockname,
4004 METH_NOARGS, getsockname_doc},
4005 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4006 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004007#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4009 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004010#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004011#if defined(MS_WINDOWS)
4012 {"share", (PyCFunction)sock_share, METH_VARARGS,
4013 sock_share_doc},
4014#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004015 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004016 listen_doc},
4017 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4018 recv_doc},
4019 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4020 recv_into_doc},
4021 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4022 recvfrom_doc},
4023 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4024 recvfrom_into_doc},
4025 {"send", (PyCFunction)sock_send, METH_VARARGS,
4026 send_doc},
4027 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4028 sendall_doc},
4029 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4030 sendto_doc},
4031 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4032 setblocking_doc},
4033 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4034 settimeout_doc},
4035 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4036 gettimeout_doc},
4037 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4038 setsockopt_doc},
4039 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4040 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004041#ifdef CMSG_LEN
4042 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4043 recvmsg_doc},
4044 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4045 recvmsg_into_doc,},
4046 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4047 sendmsg_doc},
4048#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004050};
4051
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004052/* SockObject members */
4053static PyMemberDef sock_memberlist[] = {
4054 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4055 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4056 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004057 {0},
4058};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004059
Victor Stinner71694d52015-03-28 01:18:54 +01004060static PyGetSetDef sock_getsetlist[] = {
4061 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4062 {NULL} /* sentinel */
4063};
4064
Guido van Rossum73624e91994-10-10 17:59:00 +00004065/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004066 First close the file description. */
4067
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004068static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004069sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004070{
Antoine Pitroue033e062010-10-29 10:38:18 +00004071 if (s->sock_fd != -1) {
4072 PyObject *exc, *val, *tb;
4073 Py_ssize_t old_refcount = Py_REFCNT(s);
4074 ++Py_REFCNT(s);
4075 PyErr_Fetch(&exc, &val, &tb);
4076 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4077 "unclosed %R", s))
4078 /* Spurious errors can appear at shutdown */
4079 if (PyErr_ExceptionMatches(PyExc_Warning))
4080 PyErr_WriteUnraisable((PyObject *) s);
4081 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004083 Py_REFCNT(s) = old_refcount;
4084 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004086}
4087
Guido van Rossum30a685f1991-06-27 15:51:29 +00004088
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004089static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004090sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004091{
Victor Stinnere254e532014-07-26 14:36:55 +02004092 long sock_fd;
4093 /* On Windows, this test is needed because SOCKET_T is unsigned */
4094 if (s->sock_fd == INVALID_SOCKET) {
4095 sock_fd = -1;
4096 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004097#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004098 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004099 /* this can occur on Win64, and actually there is a special
4100 ugly printf formatter for decimal pointer length integer
4101 printing, only bother if necessary*/
4102 PyErr_SetString(PyExc_OverflowError,
4103 "no printf formatter to display "
4104 "the socket descriptor in decimal");
4105 return NULL;
4106 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004107#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004108 else
4109 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004110 return PyUnicode_FromFormat(
4111 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004112 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004113 s->sock_type,
4114 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004115}
4116
4117
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004118/* Create a new, uninitialized socket object. */
4119
4120static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004121sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004122{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004123 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004125 new = type->tp_alloc(type, 0);
4126 if (new != NULL) {
4127 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner71694d52015-03-28 01:18:54 +01004128 ((PySocketSockObject *)new)->sock_timeout = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004129 ((PySocketSockObject *)new)->errorhandler = &set_error;
4130 }
4131 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004132}
4133
4134
4135/* Initialize a new socket object. */
4136
Victor Stinnerdaf45552013-08-28 00:53:59 +02004137#ifdef SOCK_CLOEXEC
4138/* socket() and socketpair() fail with EINVAL on Linux kernel older
4139 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4140static int sock_cloexec_works = -1;
4141#endif
4142
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004143/*ARGSUSED*/
4144static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004145sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004146{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 PySocketSockObject *s = (PySocketSockObject *)self;
4148 PyObject *fdobj = NULL;
4149 SOCKET_T fd = INVALID_SOCKET;
4150 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4151 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004152#ifndef MS_WINDOWS
4153#ifdef SOCK_CLOEXEC
4154 int *atomic_flag_works = &sock_cloexec_works;
4155#else
4156 int *atomic_flag_works = NULL;
4157#endif
4158#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4161 "|iiiO:socket", keywords,
4162 &family, &type, &proto, &fdobj))
4163 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004164
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004166#ifdef MS_WINDOWS
4167 /* recreate a socket that was duplicated */
4168 if (PyBytes_Check(fdobj)) {
4169 WSAPROTOCOL_INFO info;
4170 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4171 PyErr_Format(PyExc_ValueError,
4172 "socket descriptor string has wrong size, "
4173 "should be %zu bytes.", sizeof(info));
4174 return -1;
4175 }
4176 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4177 Py_BEGIN_ALLOW_THREADS
4178 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4179 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4180 Py_END_ALLOW_THREADS
4181 if (fd == INVALID_SOCKET) {
4182 set_error();
4183 return -1;
4184 }
4185 family = info.iAddressFamily;
4186 type = info.iSocketType;
4187 proto = info.iProtocol;
4188 }
4189 else
4190#endif
4191 {
4192 fd = PyLong_AsSocket_t(fdobj);
4193 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4194 return -1;
4195 if (fd == INVALID_SOCKET) {
4196 PyErr_SetString(PyExc_ValueError,
4197 "can't use invalid socket value");
4198 return -1;
4199 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 }
4201 }
4202 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004203#ifdef MS_WINDOWS
4204 /* Windows implementation */
4205#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4206#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4207#endif
4208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004210 if (support_wsa_no_inherit) {
4211 fd = WSASocket(family, type, proto,
4212 NULL, 0,
4213 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4214 if (fd == INVALID_SOCKET) {
4215 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4216 support_wsa_no_inherit = 0;
4217 fd = socket(family, type, proto);
4218 }
4219 }
4220 else {
4221 fd = socket(family, type, proto);
4222 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004223 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004225 if (fd == INVALID_SOCKET) {
4226 set_error();
4227 return -1;
4228 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004229
4230 if (!support_wsa_no_inherit) {
4231 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4232 closesocket(fd);
4233 PyErr_SetFromWindowsErr(0);
4234 return -1;
4235 }
4236 }
4237#else
4238 /* UNIX */
4239 Py_BEGIN_ALLOW_THREADS
4240#ifdef SOCK_CLOEXEC
4241 if (sock_cloexec_works != 0) {
4242 fd = socket(family, type | SOCK_CLOEXEC, proto);
4243 if (sock_cloexec_works == -1) {
4244 if (fd >= 0) {
4245 sock_cloexec_works = 1;
4246 }
4247 else if (errno == EINVAL) {
4248 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4249 sock_cloexec_works = 0;
4250 fd = socket(family, type, proto);
4251 }
4252 }
4253 }
4254 else
4255#endif
4256 {
4257 fd = socket(family, type, proto);
4258 }
4259 Py_END_ALLOW_THREADS
4260
4261 if (fd == INVALID_SOCKET) {
4262 set_error();
4263 return -1;
4264 }
4265
4266 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4267 SOCKETCLOSE(fd);
4268 return -1;
4269 }
4270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 }
4272 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004275
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004276}
4277
4278
Guido van Rossumb6775db1994-08-01 11:34:53 +00004279/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004280
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004281static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004282 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4283 "_socket.socket", /* tp_name */
4284 sizeof(PySocketSockObject), /* tp_basicsize */
4285 0, /* tp_itemsize */
4286 (destructor)sock_dealloc, /* tp_dealloc */
4287 0, /* tp_print */
4288 0, /* tp_getattr */
4289 0, /* tp_setattr */
4290 0, /* tp_reserved */
4291 (reprfunc)sock_repr, /* tp_repr */
4292 0, /* tp_as_number */
4293 0, /* tp_as_sequence */
4294 0, /* tp_as_mapping */
4295 0, /* tp_hash */
4296 0, /* tp_call */
4297 0, /* tp_str */
4298 PyObject_GenericGetAttr, /* tp_getattro */
4299 0, /* tp_setattro */
4300 0, /* tp_as_buffer */
4301 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4302 sock_doc, /* tp_doc */
4303 0, /* tp_traverse */
4304 0, /* tp_clear */
4305 0, /* tp_richcompare */
4306 0, /* tp_weaklistoffset */
4307 0, /* tp_iter */
4308 0, /* tp_iternext */
4309 sock_methods, /* tp_methods */
4310 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004311 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004312 0, /* tp_base */
4313 0, /* tp_dict */
4314 0, /* tp_descr_get */
4315 0, /* tp_descr_set */
4316 0, /* tp_dictoffset */
4317 sock_initobj, /* tp_init */
4318 PyType_GenericAlloc, /* tp_alloc */
4319 sock_new, /* tp_new */
4320 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004321};
4322
Guido van Rossum30a685f1991-06-27 15:51:29 +00004323
Guido van Rossum81194471991-07-27 21:42:02 +00004324/* Python interface to gethostname(). */
4325
4326/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004327static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004328socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004329{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004330#ifdef MS_WINDOWS
4331 /* Don't use winsock's gethostname, as this returns the ANSI
4332 version of the hostname, whereas we need a Unicode string.
4333 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004334 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004335 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004336 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004337 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004338
4339 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004340 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004341
4342 if (GetLastError() != ERROR_MORE_DATA)
4343 return PyErr_SetFromWindowsErr(0);
4344
4345 if (size == 0)
4346 return PyUnicode_New(0, 0);
4347
4348 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4349 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004350 name = PyMem_New(wchar_t, size);
4351 if (!name) {
4352 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004353 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004354 }
Victor Stinner74168972011-11-17 01:11:36 +01004355 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4356 name,
4357 &size))
4358 {
4359 PyMem_Free(name);
4360 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004361 }
Victor Stinner74168972011-11-17 01:11:36 +01004362
4363 result = PyUnicode_FromWideChar(name, size);
4364 PyMem_Free(name);
4365 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004366#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 char buf[1024];
4368 int res;
4369 Py_BEGIN_ALLOW_THREADS
4370 res = gethostname(buf, (int) sizeof buf - 1);
4371 Py_END_ALLOW_THREADS
4372 if (res < 0)
4373 return set_error();
4374 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004375 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004376#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004377}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004379PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004380"gethostname() -> string\n\
4381\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004382Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004383
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004384#ifdef HAVE_SETHOSTNAME
4385PyDoc_STRVAR(sethostname_doc,
4386"sethostname(name)\n\n\
4387Sets the hostname to name.");
4388
4389static PyObject *
4390socket_sethostname(PyObject *self, PyObject *args)
4391{
4392 PyObject *hnobj;
4393 Py_buffer buf;
4394 int res, flag = 0;
4395
Christian Heimesd2774c72013-06-19 02:06:29 +02004396#ifdef _AIX
4397/* issue #18259, not declared in any useful header file */
4398extern int sethostname(const char *, size_t);
4399#endif
4400
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004401 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4402 PyErr_Clear();
4403 if (!PyArg_ParseTuple(args, "O&:sethostname",
4404 PyUnicode_FSConverter, &hnobj))
4405 return NULL;
4406 flag = 1;
4407 }
4408 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4409 if (!res) {
4410 res = sethostname(buf.buf, buf.len);
4411 PyBuffer_Release(&buf);
4412 }
4413 if (flag)
4414 Py_DECREF(hnobj);
4415 if (res)
4416 return set_error();
4417 Py_RETURN_NONE;
4418}
4419#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004420
Guido van Rossum30a685f1991-06-27 15:51:29 +00004421/* Python interface to gethostbyname(name). */
4422
4423/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004424static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004425socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004426{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 char *name;
4428 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004429 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004430
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004431 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 return NULL;
4433 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004434 goto finally;
4435 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4436finally:
4437 PyMem_Free(name);
4438 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004439}
4440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004441PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004442"gethostbyname(host) -> address\n\
4443\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004444Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004445
4446
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004447/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4448
4449static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004450gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004451{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 char **pch;
4453 PyObject *rtn_tuple = (PyObject *)NULL;
4454 PyObject *name_list = (PyObject *)NULL;
4455 PyObject *addr_list = (PyObject *)NULL;
4456 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004458 if (h == NULL) {
4459 /* Let's get real error message to return */
4460 set_herror(h_errno);
4461 return NULL;
4462 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 if (h->h_addrtype != af) {
4465 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004466 errno = EAFNOSUPPORT;
4467 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 return NULL;
4469 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 case AF_INET:
4474 if (alen < sizeof(struct sockaddr_in))
4475 return NULL;
4476 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004477
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004478#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 case AF_INET6:
4480 if (alen < sizeof(struct sockaddr_in6))
4481 return NULL;
4482 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004483#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 if ((name_list = PyList_New(0)) == NULL)
4488 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 if ((addr_list = PyList_New(0)) == NULL)
4491 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 /* SF #1511317: h_aliases can be NULL */
4494 if (h->h_aliases) {
4495 for (pch = h->h_aliases; *pch != NULL; pch++) {
4496 int status;
4497 tmp = PyUnicode_FromString(*pch);
4498 if (tmp == NULL)
4499 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 status = PyList_Append(name_list, tmp);
4502 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 if (status)
4505 goto err;
4506 }
4507 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004509 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4510 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004512 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 case AF_INET:
4515 {
4516 struct sockaddr_in sin;
4517 memset(&sin, 0, sizeof(sin));
4518 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004519#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4523 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 if (pch == h->h_addr_list && alen >= sizeof(sin))
4526 memcpy((char *) addr, &sin, sizeof(sin));
4527 break;
4528 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004529
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004530#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 case AF_INET6:
4532 {
4533 struct sockaddr_in6 sin6;
4534 memset(&sin6, 0, sizeof(sin6));
4535 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004536#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4540 tmp = makeipaddr((struct sockaddr *)&sin6,
4541 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4544 memcpy((char *) addr, &sin6, sizeof(sin6));
4545 break;
4546 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004547#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004550 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 "unsupported address family");
4552 return NULL;
4553 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 if (tmp == NULL)
4556 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 status = PyList_Append(addr_list, tmp);
4559 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 if (status)
4562 goto err;
4563 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004566
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004567 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 Py_XDECREF(name_list);
4569 Py_XDECREF(addr_list);
4570 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004571}
4572
4573
4574/* Python interface to gethostbyname_ex(name). */
4575
4576/*ARGSUSED*/
4577static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004578socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004579{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 char *name;
4581 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004582 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004584 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004585#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004587#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004589#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 char buf[16384];
4591 int buf_len = (sizeof buf) - 1;
4592 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004593#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004594#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004596#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004597#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004598
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004599 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004601 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004602 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004604#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004605#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004606 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004608#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004610#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 memset((void *) &data, '\0', sizeof(data));
4612 result = gethostbyname_r(name, &hp_allocated, &data);
4613 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004614#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004615#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004616#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004618#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004620#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 Py_END_ALLOW_THREADS
4622 /* Some C libraries would require addr.__ss_family instead of
4623 addr.ss_family.
4624 Therefore, we cast the sockaddr_storage into sockaddr to
4625 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004626 sa = SAS2SA(&addr);
4627 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004629#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004631#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004632finally:
4633 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004635}
4636
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004637PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004638"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4639\n\
4640Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004641for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004642
4643
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004644/* Python interface to gethostbyaddr(IP). */
4645
4646/*ARGSUSED*/
4647static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004648socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004649{
Charles-François Natali8b759652011-12-23 16:44:51 +01004650 sock_addr_t addr;
4651 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 char *ip_num;
4653 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004654 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004655#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004657#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004659#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 /* glibcs up to 2.10 assume that the buf argument to
4661 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4662 does not ensure. The attribute below instructs the compiler
4663 to maintain this alignment. */
4664 char buf[16384] Py_ALIGNED(8);
4665 int buf_len = (sizeof buf) - 1;
4666 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004667#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004668#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004670#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004671#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 char *ap;
4673 int al;
4674 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004675
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004676 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 return NULL;
4678 af = AF_UNSPEC;
4679 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004680 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 af = sa->sa_family;
4682 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004683 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 switch (af) {
4685 case AF_INET:
4686 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4687 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4688 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004689#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 case AF_INET6:
4691 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4692 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4693 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004696 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004697 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 }
4699 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004700#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004701#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004702 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 &hp_allocated, buf, buf_len,
4704 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004705#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 h = gethostbyaddr_r(ap, al, af,
4707 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004708#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 memset((void *) &data, '\0', sizeof(data));
4710 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4711 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004712#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004713#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004714#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004717 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004718#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004719 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004720 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004721#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004723#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004724finally:
4725 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004727}
4728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004729PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004730"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4731\n\
4732Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004733for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004734
Guido van Rossum30a685f1991-06-27 15:51:29 +00004735
4736/* Python interface to getservbyname(name).
4737 This only returns the port number, since the other info is already
4738 known or not useful (like the list of aliases). */
4739
4740/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004741static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004742socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004743{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 char *name, *proto=NULL;
4745 struct servent *sp;
4746 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4747 return NULL;
4748 Py_BEGIN_ALLOW_THREADS
4749 sp = getservbyname(name, proto);
4750 Py_END_ALLOW_THREADS
4751 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004752 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004753 return NULL;
4754 }
4755 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004756}
4757
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004758PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004759"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004760\n\
4761Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004762The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4763otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004764
Guido van Rossum30a685f1991-06-27 15:51:29 +00004765
Barry Warsaw11b91a02004-06-28 00:50:43 +00004766/* Python interface to getservbyport(port).
4767 This only returns the service name, since the other info is already
4768 known or not useful (like the list of aliases). */
4769
4770/*ARGSUSED*/
4771static PyObject *
4772socket_getservbyport(PyObject *self, PyObject *args)
4773{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 int port;
4775 char *proto=NULL;
4776 struct servent *sp;
4777 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4778 return NULL;
4779 if (port < 0 || port > 0xffff) {
4780 PyErr_SetString(
4781 PyExc_OverflowError,
4782 "getservbyport: port must be 0-65535.");
4783 return NULL;
4784 }
4785 Py_BEGIN_ALLOW_THREADS
4786 sp = getservbyport(htons((short)port), proto);
4787 Py_END_ALLOW_THREADS
4788 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004789 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 return NULL;
4791 }
4792 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004793}
4794
4795PyDoc_STRVAR(getservbyport_doc,
4796"getservbyport(port[, protocolname]) -> string\n\
4797\n\
4798Return the service name from a port number and protocol name.\n\
4799The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4800otherwise any protocol will match.");
4801
Guido van Rossum3901d851996-12-19 16:35:04 +00004802/* Python interface to getprotobyname(name).
4803 This only returns the protocol number, since the other info is
4804 already known or not useful (like the list of aliases). */
4805
4806/*ARGSUSED*/
4807static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004808socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004809{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004810 char *name;
4811 struct protoent *sp;
4812 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4813 return NULL;
4814 Py_BEGIN_ALLOW_THREADS
4815 sp = getprotobyname(name);
4816 Py_END_ALLOW_THREADS
4817 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004818 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004819 return NULL;
4820 }
4821 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004822}
4823
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004824PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004825"getprotobyname(name) -> integer\n\
4826\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004827Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004828
Guido van Rossum3901d851996-12-19 16:35:04 +00004829
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004830#ifndef NO_DUP
4831/* dup() function for socket fds */
4832
4833static PyObject *
4834socket_dup(PyObject *self, PyObject *fdobj)
4835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 SOCKET_T fd, newfd;
4837 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004838#ifdef MS_WINDOWS
4839 WSAPROTOCOL_INFO info;
4840#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 fd = PyLong_AsSocket_t(fdobj);
4843 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4844 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004845
Victor Stinnerdaf45552013-08-28 00:53:59 +02004846#ifdef MS_WINDOWS
4847 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4848 return set_error();
4849
4850 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4851 FROM_PROTOCOL_INFO,
4852 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 if (newfd == INVALID_SOCKET)
4854 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004855
Victor Stinnerdaf45552013-08-28 00:53:59 +02004856 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4857 closesocket(newfd);
4858 PyErr_SetFromWindowsErr(0);
4859 return NULL;
4860 }
4861#else
4862 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4863 newfd = _Py_dup(fd);
4864 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004865 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004866#endif
4867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004868 newfdobj = PyLong_FromSocket_t(newfd);
4869 if (newfdobj == NULL)
4870 SOCKETCLOSE(newfd);
4871 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004872}
4873
4874PyDoc_STRVAR(dup_doc,
4875"dup(integer) -> integer\n\
4876\n\
4877Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4878sockets; on some platforms os.dup() won't work for socket file descriptors.");
4879#endif
4880
4881
Dave Cole331708b2004-08-09 04:51:41 +00004882#ifdef HAVE_SOCKETPAIR
4883/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004884 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004885 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004886
4887/*ARGSUSED*/
4888static PyObject *
4889socket_socketpair(PyObject *self, PyObject *args)
4890{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004891 PySocketSockObject *s0 = NULL, *s1 = NULL;
4892 SOCKET_T sv[2];
4893 int family, type = SOCK_STREAM, proto = 0;
4894 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004895#ifdef SOCK_CLOEXEC
4896 int *atomic_flag_works = &sock_cloexec_works;
4897#else
4898 int *atomic_flag_works = NULL;
4899#endif
4900 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004901
4902#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004903 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004904#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004907 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4908 &family, &type, &proto))
4909 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004912 Py_BEGIN_ALLOW_THREADS
4913#ifdef SOCK_CLOEXEC
4914 if (sock_cloexec_works != 0) {
4915 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4916 if (sock_cloexec_works == -1) {
4917 if (ret >= 0) {
4918 sock_cloexec_works = 1;
4919 }
4920 else if (errno == EINVAL) {
4921 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4922 sock_cloexec_works = 0;
4923 ret = socketpair(family, type, proto, sv);
4924 }
4925 }
4926 }
4927 else
4928#endif
4929 {
4930 ret = socketpair(family, type, proto, sv);
4931 }
4932 Py_END_ALLOW_THREADS
4933
4934 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004936
4937 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4938 goto finally;
4939 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4940 goto finally;
4941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 s0 = new_sockobject(sv[0], family, type, proto);
4943 if (s0 == NULL)
4944 goto finally;
4945 s1 = new_sockobject(sv[1], family, type, proto);
4946 if (s1 == NULL)
4947 goto finally;
4948 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004949
4950finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 if (res == NULL) {
4952 if (s0 == NULL)
4953 SOCKETCLOSE(sv[0]);
4954 if (s1 == NULL)
4955 SOCKETCLOSE(sv[1]);
4956 }
4957 Py_XDECREF(s0);
4958 Py_XDECREF(s1);
4959 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004960}
4961
4962PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004963"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004964\n\
4965Create a pair of socket objects from the sockets returned by the platform\n\
4966socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004967The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004968AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004969
4970#endif /* HAVE_SOCKETPAIR */
4971
4972
Guido van Rossum006bf911996-06-12 04:04:55 +00004973static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004974socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004976 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4979 return NULL;
4980 }
4981 if (x1 < 0) {
4982 PyErr_SetString(PyExc_OverflowError,
4983 "can't convert negative number to unsigned long");
4984 return NULL;
4985 }
4986 x2 = (unsigned int)ntohs((unsigned short)x1);
4987 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004988}
4989
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004990PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004991"ntohs(integer) -> integer\n\
4992\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004993Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004994
4995
Guido van Rossum006bf911996-06-12 04:04:55 +00004996static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004997socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 if (PyLong_Check(arg)) {
5002 x = PyLong_AsUnsignedLong(arg);
5003 if (x == (unsigned long) -1 && PyErr_Occurred())
5004 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005005#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005006 {
5007 unsigned long y;
5008 /* only want the trailing 32 bits */
5009 y = x & 0xFFFFFFFFUL;
5010 if (y ^ x)
5011 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005012 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 x = y;
5014 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005015#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005016 }
5017 else
5018 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005019 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005021 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005022}
5023
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005024PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005025"ntohl(integer) -> integer\n\
5026\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005027Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005028
5029
Guido van Rossum006bf911996-06-12 04:04:55 +00005030static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005031socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005032{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005033 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5036 return NULL;
5037 }
5038 if (x1 < 0) {
5039 PyErr_SetString(PyExc_OverflowError,
5040 "can't convert negative number to unsigned long");
5041 return NULL;
5042 }
5043 x2 = (unsigned int)htons((unsigned short)x1);
5044 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005045}
5046
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005047PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005048"htons(integer) -> integer\n\
5049\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005050Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005051
5052
Guido van Rossum006bf911996-06-12 04:04:55 +00005053static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005054socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005055{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005056 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 if (PyLong_Check(arg)) {
5059 x = PyLong_AsUnsignedLong(arg);
5060 if (x == (unsigned long) -1 && PyErr_Occurred())
5061 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005062#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 {
5064 unsigned long y;
5065 /* only want the trailing 32 bits */
5066 y = x & 0xFFFFFFFFUL;
5067 if (y ^ x)
5068 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005069 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 x = y;
5071 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005072#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 }
5074 else
5075 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005076 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005077 Py_TYPE(arg)->tp_name);
5078 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005079}
5080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005081PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005082"htonl(integer) -> integer\n\
5083\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005084Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005085
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005086/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005088PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005089"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005090\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005091Convert 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 +00005092binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005093
5094static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005095socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005096{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005097#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005099#endif
5100
5101#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005102#if (SIZEOF_INT != 4)
5103#error "Not sure if in_addr_t exists and int is not 32-bits."
5104#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 /* Have to use inet_addr() instead */
5106 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5111 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005112
Tim Peters1df9fdd2003-02-13 03:13:40 +00005113
5114#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005115
5116#ifdef USE_INET_ATON_WEAKLINK
5117 if (inet_aton != NULL) {
5118#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005119 if (inet_aton(ip_addr, &buf))
5120 return PyBytes_FromStringAndSize((char *)(&buf),
5121 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005122
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005123 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 "illegal IP address string passed to inet_aton");
5125 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005126
Thomas Wouters477c8d52006-05-27 19:21:47 +00005127#ifdef USE_INET_ATON_WEAKLINK
5128 } else {
5129#endif
5130
5131#endif
5132
5133#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 /* special-case this address as inet_addr might return INADDR_NONE
5136 * for this */
5137 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005138 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005144 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 "illegal IP address string passed to inet_aton");
5146 return NULL;
5147 }
5148 }
5149 return PyBytes_FromStringAndSize((char *) &packed_addr,
5150 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005151
5152#ifdef USE_INET_ATON_WEAKLINK
5153 }
5154#endif
5155
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005156#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005157}
5158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005159PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005160"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005161\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005162Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005163
5164static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005165socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005166{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005167 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005168 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005169
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005170 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 return NULL;
5172 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005173
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005174 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005175 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005177 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 return NULL;
5179 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005180
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005181 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5182 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005185}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005186
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005187#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005188
5189PyDoc_STRVAR(inet_pton_doc,
5190"inet_pton(af, ip) -> packed IP address string\n\
5191\n\
5192Convert an IP address from string format to a packed string suitable\n\
5193for use with low-level network functions.");
5194
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005195#endif
5196
5197#ifdef HAVE_INET_PTON
5198
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005199static PyObject *
5200socket_inet_pton(PyObject *self, PyObject *args)
5201{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 int af;
5203 char* ip;
5204 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005205#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005206 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005207#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005209#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5211 return NULL;
5212 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005213
Martin v. Löwis04697e82004-06-02 12:35:29 +00005214#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005216 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 "can't use AF_INET6, IPv6 is disabled");
5218 return NULL;
5219 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005220#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 retval = inet_pton(af, ip, packed);
5223 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005224 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 return NULL;
5226 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005227 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 "illegal IP address string passed to inet_pton");
5229 return NULL;
5230 } else if (af == AF_INET) {
5231 return PyBytes_FromStringAndSize(packed,
5232 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005233#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005234 } else if (af == AF_INET6) {
5235 return PyBytes_FromStringAndSize(packed,
5236 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005237#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005239 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 return NULL;
5241 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005242}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005243#elif defined(MS_WINDOWS)
5244
5245static PyObject *
5246socket_inet_pton(PyObject *self, PyObject *args)
5247{
5248 int af;
5249 char* ip;
5250 struct sockaddr_in6 addr;
5251 INT ret, size;
5252
5253 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5254 return NULL;
5255 }
5256
Victor Stinnere990c6e2013-11-16 00:18:58 +01005257 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005258 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5259
5260 if (ret) {
5261 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5262 return NULL;
5263 } else if(af == AF_INET) {
5264 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005265 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005266 sizeof(addr4->sin_addr));
5267 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005268 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005269 sizeof(addr.sin6_addr));
5270 } else {
5271 PyErr_SetString(PyExc_OSError, "unknown address family");
5272 return NULL;
5273 }
5274}
5275
5276#endif
5277
5278#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005279
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005280PyDoc_STRVAR(inet_ntop_doc,
5281"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5282\n\
5283Convert a packed IP address of the given family to string format.");
5284
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005285#endif
5286
5287
5288#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005289static PyObject *
5290socket_inet_ntop(PyObject *self, PyObject *args)
5291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005293 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005295#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005296 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005297#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005298 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005299#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005301 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5302 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005303
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005304 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005305 return NULL;
5306 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005309 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005310 PyErr_SetString(PyExc_ValueError,
5311 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005312 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005313 return NULL;
5314 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005315#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005316 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005317 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005318 PyErr_SetString(PyExc_ValueError,
5319 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005320 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005321 return NULL;
5322 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005323#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005324 } else {
5325 PyErr_Format(PyExc_ValueError,
5326 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005327 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005328 return NULL;
5329 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005330
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005331 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5332 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005334 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 return NULL;
5336 } else {
5337 return PyUnicode_FromString(retval);
5338 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005340 /* NOTREACHED */
5341 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5342 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005343}
5344
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005345#elif defined(MS_WINDOWS)
5346
5347static PyObject *
5348socket_inet_ntop(PyObject *self, PyObject *args)
5349{
5350 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005351 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005352 struct sockaddr_in6 addr;
5353 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005354#ifdef ENABLE_IPV6
5355 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5356#else
5357 char ip[INET_ADDRSTRLEN + 1];
5358#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005359
5360 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5361 memset((void *) &ip[0], '\0', sizeof(ip));
5362
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005363 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005364 return NULL;
5365 }
5366
5367 if (af == AF_INET) {
5368 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5369
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005370 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005371 PyErr_SetString(PyExc_ValueError,
5372 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005373 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005374 return NULL;
5375 }
5376 memset(addr4, 0, sizeof(struct sockaddr_in));
5377 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005378 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005379 addrlen = sizeof(struct sockaddr_in);
5380 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005381 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005382 PyErr_SetString(PyExc_ValueError,
5383 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005384 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005385 return NULL;
5386 }
5387
5388 memset(&addr, 0, sizeof(addr));
5389 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005390 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005391 addrlen = sizeof(addr);
5392 } else {
5393 PyErr_Format(PyExc_ValueError,
5394 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005395 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005396 return NULL;
5397 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005398 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005399
5400 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005401 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005402 ip, &retlen);
5403
5404 if (ret) {
5405 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5406 return NULL;
5407 } else {
5408 return PyUnicode_FromString(ip);
5409 }
5410}
5411
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005412#endif /* HAVE_INET_PTON */
5413
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005414/* Python interface to getaddrinfo(host, port). */
5415
5416/*ARGSUSED*/
5417static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005418socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005419{
Victor Stinner77af1722011-05-26 14:05:59 +02005420 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005421 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005422 struct addrinfo hints, *res;
5423 struct addrinfo *res0 = NULL;
5424 PyObject *hobj = NULL;
5425 PyObject *pobj = (PyObject *)NULL;
5426 char pbuf[30];
5427 char *hptr, *pptr;
5428 int family, socktype, protocol, flags;
5429 int error;
5430 PyObject *all = (PyObject *)NULL;
5431 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005432
Georg Brandl6083a4b2013-10-14 06:51:46 +02005433 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005434 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005435 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005436 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005437 &protocol, &flags)) {
5438 return NULL;
5439 }
5440 if (hobj == Py_None) {
5441 hptr = NULL;
5442 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005443 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005444
5445 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 if (!idna)
5447 return NULL;
5448 assert(PyBytes_Check(idna));
5449 hptr = PyBytes_AS_STRING(idna);
5450 } else if (PyBytes_Check(hobj)) {
5451 hptr = PyBytes_AsString(hobj);
5452 } else {
5453 PyErr_SetString(PyExc_TypeError,
5454 "getaddrinfo() argument 1 must be string or None");
5455 return NULL;
5456 }
5457 if (PyLong_CheckExact(pobj)) {
5458 long value = PyLong_AsLong(pobj);
5459 if (value == -1 && PyErr_Occurred())
5460 goto err;
5461 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5462 pptr = pbuf;
5463 } else if (PyUnicode_Check(pobj)) {
5464 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005465 if (pptr == NULL)
5466 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005467 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005468 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005469 } else if (pobj == Py_None) {
5470 pptr = (char *)NULL;
5471 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005472 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005473 goto err;
5474 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005475#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005476 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5477 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005478 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5479 * This workaround avoids a segfault in libsystem.
5480 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005481 pptr = "00";
5482 }
5483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 memset(&hints, 0, sizeof(hints));
5485 hints.ai_family = family;
5486 hints.ai_socktype = socktype;
5487 hints.ai_protocol = protocol;
5488 hints.ai_flags = flags;
5489 Py_BEGIN_ALLOW_THREADS
5490 ACQUIRE_GETADDRINFO_LOCK
5491 error = getaddrinfo(hptr, pptr, &hints, &res0);
5492 Py_END_ALLOW_THREADS
5493 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5494 if (error) {
5495 set_gaierror(error);
5496 goto err;
5497 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005498
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005499 all = PyList_New(0);
5500 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005501 goto err;
5502 for (res = res0; res; res = res->ai_next) {
5503 PyObject *single;
5504 PyObject *addr =
5505 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5506 if (addr == NULL)
5507 goto err;
5508 single = Py_BuildValue("iiisO", res->ai_family,
5509 res->ai_socktype, res->ai_protocol,
5510 res->ai_canonname ? res->ai_canonname : "",
5511 addr);
5512 Py_DECREF(addr);
5513 if (single == NULL)
5514 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005516 if (PyList_Append(all, single))
5517 goto err;
5518 Py_XDECREF(single);
5519 }
5520 Py_XDECREF(idna);
5521 if (res0)
5522 freeaddrinfo(res0);
5523 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005524 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 Py_XDECREF(all);
5526 Py_XDECREF(idna);
5527 if (res0)
5528 freeaddrinfo(res0);
5529 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005530}
5531
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005532PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005533"getaddrinfo(host, port [, family, type, proto, flags])\n\
5534 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005535\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005536Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005537
5538/* Python interface to getnameinfo(sa, flags). */
5539
5540/*ARGSUSED*/
5541static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005542socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 PyObject *sa = (PyObject *)NULL;
5545 int flags;
5546 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005547 int port;
5548 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005549 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5550 struct addrinfo hints, *res = NULL;
5551 int error;
5552 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005554 flags = flowinfo = scope_id = 0;
5555 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5556 return NULL;
5557 if (!PyTuple_Check(sa)) {
5558 PyErr_SetString(PyExc_TypeError,
5559 "getnameinfo() argument 1 must be a tuple");
5560 return NULL;
5561 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005562 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 &hostp, &port, &flowinfo, &scope_id))
5564 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005565 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005566 PyErr_SetString(PyExc_OverflowError,
5567 "getsockaddrarg: flowinfo must be 0-1048575.");
5568 return NULL;
5569 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5571 memset(&hints, 0, sizeof(hints));
5572 hints.ai_family = AF_UNSPEC;
5573 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005574 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005575 Py_BEGIN_ALLOW_THREADS
5576 ACQUIRE_GETADDRINFO_LOCK
5577 error = getaddrinfo(hostp, pbuf, &hints, &res);
5578 Py_END_ALLOW_THREADS
5579 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5580 if (error) {
5581 set_gaierror(error);
5582 goto fail;
5583 }
5584 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005585 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 "sockaddr resolved to multiple addresses");
5587 goto fail;
5588 }
5589 switch (res->ai_family) {
5590 case AF_INET:
5591 {
5592 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005593 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 "IPv4 sockaddr must be 2 tuple");
5595 goto fail;
5596 }
5597 break;
5598 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005599#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 case AF_INET6:
5601 {
5602 struct sockaddr_in6 *sin6;
5603 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005604 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005605 sin6->sin6_scope_id = scope_id;
5606 break;
5607 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005609 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005610 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5612 if (error) {
5613 set_gaierror(error);
5614 goto fail;
5615 }
5616 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005617
5618fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005619 if (res)
5620 freeaddrinfo(res);
5621 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005622}
5623
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005624PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005625"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005626\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005627Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005628
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005629
5630/* Python API to getting and setting the default timeout value. */
5631
5632static PyObject *
5633socket_getdefaulttimeout(PyObject *self)
5634{
Victor Stinner71694d52015-03-28 01:18:54 +01005635 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005636 Py_INCREF(Py_None);
5637 return Py_None;
5638 }
Victor Stinner71694d52015-03-28 01:18:54 +01005639 else {
5640 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5641 return PyFloat_FromDouble(seconds);
5642 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005643}
5644
5645PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005646"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005647\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005648Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005649A value of None indicates that new socket objects have no timeout.\n\
5650When the socket module is first imported, the default is None.");
5651
5652static PyObject *
5653socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5654{
Victor Stinner71694d52015-03-28 01:18:54 +01005655 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005656
Victor Stinner71694d52015-03-28 01:18:54 +01005657 if (socket_parse_timeout(&timeout, arg) < 0)
5658 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005659
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005660 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 Py_INCREF(Py_None);
5663 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005664}
5665
5666PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005667"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005668\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005669Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005670A value of None indicates that new socket objects have no timeout.\n\
5671When the socket module is first imported, the default is None.");
5672
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005673#ifdef HAVE_IF_NAMEINDEX
5674/* Python API for getting interface indices and names */
5675
5676static PyObject *
5677socket_if_nameindex(PyObject *self, PyObject *arg)
5678{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005679 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005680 int i;
5681 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005682
Charles-François Natali60713592011-05-20 16:55:06 +02005683 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005684 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005685 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005686 return NULL;
5687 }
5688
5689 list = PyList_New(0);
5690 if (list == NULL) {
5691 if_freenameindex(ni);
5692 return NULL;
5693 }
5694
Charles-François Natali60713592011-05-20 16:55:06 +02005695 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5696 PyObject *ni_tuple = Py_BuildValue("IO&",
5697 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005698
5699 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5700 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005701 Py_DECREF(list);
5702 if_freenameindex(ni);
5703 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005704 }
5705 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005706 }
5707
5708 if_freenameindex(ni);
5709 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005710}
5711
5712PyDoc_STRVAR(if_nameindex_doc,
5713"if_nameindex()\n\
5714\n\
5715Returns a list of network interface information (index, name) tuples.");
5716
Charles-François Natali60713592011-05-20 16:55:06 +02005717static PyObject *
5718socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005719{
Charles-François Natali60713592011-05-20 16:55:06 +02005720 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005721 unsigned long index;
5722
Charles-François Natali60713592011-05-20 16:55:06 +02005723 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5724 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005725 return NULL;
5726
Charles-François Natali60713592011-05-20 16:55:06 +02005727 index = if_nametoindex(PyBytes_AS_STRING(oname));
5728 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005729 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005730 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005731 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005732 return NULL;
5733 }
5734
5735 return PyLong_FromUnsignedLong(index);
5736}
5737
5738PyDoc_STRVAR(if_nametoindex_doc,
5739"if_nametoindex(if_name)\n\
5740\n\
5741Returns the interface index corresponding to the interface name if_name.");
5742
Charles-François Natali60713592011-05-20 16:55:06 +02005743static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005744socket_if_indextoname(PyObject *self, PyObject *arg)
5745{
Charles-François Natali60713592011-05-20 16:55:06 +02005746 unsigned long index;
5747 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005748
Charles-François Natali60713592011-05-20 16:55:06 +02005749 index = PyLong_AsUnsignedLong(arg);
5750 if (index == (unsigned long) -1)
5751 return NULL;
5752
5753 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005754 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005755 return NULL;
5756 }
5757
Charles-François Natali60713592011-05-20 16:55:06 +02005758 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005759}
5760
5761PyDoc_STRVAR(if_indextoname_doc,
5762"if_indextoname(if_index)\n\
5763\n\
5764Returns the interface name corresponding to the interface index if_index.");
5765
5766#endif /* HAVE_IF_NAMEINDEX */
5767
5768
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005769#ifdef CMSG_LEN
5770/* Python interface to CMSG_LEN(length). */
5771
5772static PyObject *
5773socket_CMSG_LEN(PyObject *self, PyObject *args)
5774{
5775 Py_ssize_t length;
5776 size_t result;
5777
5778 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5779 return NULL;
5780 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5781 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5782 return NULL;
5783 }
5784 return PyLong_FromSize_t(result);
5785}
5786
5787PyDoc_STRVAR(CMSG_LEN_doc,
5788"CMSG_LEN(length) -> control message length\n\
5789\n\
5790Return the total length, without trailing padding, of an ancillary\n\
5791data item with associated data of the given length. This value can\n\
5792often be used as the buffer size for recvmsg() to receive a single\n\
5793item of ancillary data, but RFC 3542 requires portable applications to\n\
5794use CMSG_SPACE() and thus include space for padding, even when the\n\
5795item will be the last in the buffer. Raises OverflowError if length\n\
5796is outside the permissible range of values.");
5797
5798
5799#ifdef CMSG_SPACE
5800/* Python interface to CMSG_SPACE(length). */
5801
5802static PyObject *
5803socket_CMSG_SPACE(PyObject *self, PyObject *args)
5804{
5805 Py_ssize_t length;
5806 size_t result;
5807
5808 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5809 return NULL;
5810 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5811 PyErr_SetString(PyExc_OverflowError,
5812 "CMSG_SPACE() argument out of range");
5813 return NULL;
5814 }
5815 return PyLong_FromSize_t(result);
5816}
5817
5818PyDoc_STRVAR(CMSG_SPACE_doc,
5819"CMSG_SPACE(length) -> buffer size\n\
5820\n\
5821Return the buffer size needed for recvmsg() to receive an ancillary\n\
5822data item with associated data of the given length, along with any\n\
5823trailing padding. The buffer space needed to receive multiple items\n\
5824is the sum of the CMSG_SPACE() values for their associated data\n\
5825lengths. Raises OverflowError if length is outside the permissible\n\
5826range of values.");
5827#endif /* CMSG_SPACE */
5828#endif /* CMSG_LEN */
5829
5830
Guido van Rossum30a685f1991-06-27 15:51:29 +00005831/* List of functions exported by this module. */
5832
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005833static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 {"gethostbyname", socket_gethostbyname,
5835 METH_VARARGS, gethostbyname_doc},
5836 {"gethostbyname_ex", socket_gethostbyname_ex,
5837 METH_VARARGS, ghbn_ex_doc},
5838 {"gethostbyaddr", socket_gethostbyaddr,
5839 METH_VARARGS, gethostbyaddr_doc},
5840 {"gethostname", socket_gethostname,
5841 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005842#ifdef HAVE_SETHOSTNAME
5843 {"sethostname", socket_sethostname,
5844 METH_VARARGS, sethostname_doc},
5845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005846 {"getservbyname", socket_getservbyname,
5847 METH_VARARGS, getservbyname_doc},
5848 {"getservbyport", socket_getservbyport,
5849 METH_VARARGS, getservbyport_doc},
5850 {"getprotobyname", socket_getprotobyname,
5851 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005852#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 {"dup", socket_dup,
5854 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005855#endif
Dave Cole331708b2004-08-09 04:51:41 +00005856#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005857 {"socketpair", socket_socketpair,
5858 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 {"ntohs", socket_ntohs,
5861 METH_VARARGS, ntohs_doc},
5862 {"ntohl", socket_ntohl,
5863 METH_O, ntohl_doc},
5864 {"htons", socket_htons,
5865 METH_VARARGS, htons_doc},
5866 {"htonl", socket_htonl,
5867 METH_O, htonl_doc},
5868 {"inet_aton", socket_inet_aton,
5869 METH_VARARGS, inet_aton_doc},
5870 {"inet_ntoa", socket_inet_ntoa,
5871 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005872#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 {"inet_pton", socket_inet_pton,
5874 METH_VARARGS, inet_pton_doc},
5875 {"inet_ntop", socket_inet_ntop,
5876 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005877#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005878 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5879 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005880 {"getnameinfo", socket_getnameinfo,
5881 METH_VARARGS, getnameinfo_doc},
5882 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5883 METH_NOARGS, getdefaulttimeout_doc},
5884 {"setdefaulttimeout", socket_setdefaulttimeout,
5885 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005886#ifdef HAVE_IF_NAMEINDEX
5887 {"if_nameindex", socket_if_nameindex,
5888 METH_NOARGS, if_nameindex_doc},
5889 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005890 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005891 {"if_indextoname", socket_if_indextoname,
5892 METH_O, if_indextoname_doc},
5893#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005894#ifdef CMSG_LEN
5895 {"CMSG_LEN", socket_CMSG_LEN,
5896 METH_VARARGS, CMSG_LEN_doc},
5897#ifdef CMSG_SPACE
5898 {"CMSG_SPACE", socket_CMSG_SPACE,
5899 METH_VARARGS, CMSG_SPACE_doc},
5900#endif
5901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005903};
5904
Guido van Rossum30a685f1991-06-27 15:51:29 +00005905
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005906#ifdef MS_WINDOWS
5907#define OS_INIT_DEFINED
5908
5909/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005910
5911static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005912os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005915}
5916
5917static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005918os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 WSADATA WSAData;
5921 int ret;
5922 ret = WSAStartup(0x0101, &WSAData);
5923 switch (ret) {
5924 case 0: /* No error */
5925 Py_AtExit(os_cleanup);
5926 return 1; /* Success */
5927 case WSASYSNOTREADY:
5928 PyErr_SetString(PyExc_ImportError,
5929 "WSAStartup failed: network not ready");
5930 break;
5931 case WSAVERNOTSUPPORTED:
5932 case WSAEINVAL:
5933 PyErr_SetString(
5934 PyExc_ImportError,
5935 "WSAStartup failed: requested version not supported");
5936 break;
5937 default:
5938 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5939 break;
5940 }
5941 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005942}
5943
Guido van Rossum8d665e61996-06-26 18:22:49 +00005944#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005945
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005946
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005947
5948#ifndef OS_INIT_DEFINED
5949static int
5950os_init(void)
5951{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005953}
5954#endif
5955
5956
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005957/* C API table - always add new things to the end for binary
5958 compatibility. */
5959static
5960PySocketModule_APIObject PySocketModuleAPI =
5961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005963 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005965};
5966
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005967
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005968/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005969
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005970 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005971 "socket.py" which implements some additional functionality.
5972 The import of "_socket" may fail with an ImportError exception if
5973 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005974 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005975 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005976*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005978PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005979"Implementation module for socket operations.\n\
5980\n\
5981See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005982
Martin v. Löwis1a214512008-06-11 05:26:20 +00005983static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 PyModuleDef_HEAD_INIT,
5985 PySocket_MODULE_NAME,
5986 socket_doc,
5987 -1,
5988 socket_methods,
5989 NULL,
5990 NULL,
5991 NULL,
5992 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005993};
5994
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005995PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005996PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005997{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006000 if (!os_init())
6001 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006002
Victor Stinnerdaf45552013-08-28 00:53:59 +02006003#ifdef MS_WINDOWS
6004 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006005#if defined(_MSC_VER) && _MSC_VER >= 1800
6006 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6007#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006008 DWORD version = GetVersion();
6009 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6010 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6011 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006012 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6013#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006014 }
6015#endif
6016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 Py_TYPE(&sock_type) = &PyType_Type;
6018 m = PyModule_Create(&socketmodule);
6019 if (m == NULL)
6020 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006021
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006022 Py_INCREF(PyExc_OSError);
6023 PySocketModuleAPI.error = PyExc_OSError;
6024 Py_INCREF(PyExc_OSError);
6025 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006027 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006028 if (socket_herror == NULL)
6029 return NULL;
6030 Py_INCREF(socket_herror);
6031 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006032 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006033 NULL);
6034 if (socket_gaierror == NULL)
6035 return NULL;
6036 Py_INCREF(socket_gaierror);
6037 PyModule_AddObject(m, "gaierror", socket_gaierror);
6038 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006039 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 if (socket_timeout == NULL)
6041 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006042 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 Py_INCREF(socket_timeout);
6044 PyModule_AddObject(m, "timeout", socket_timeout);
6045 Py_INCREF((PyObject *)&sock_type);
6046 if (PyModule_AddObject(m, "SocketType",
6047 (PyObject *)&sock_type) != 0)
6048 return NULL;
6049 Py_INCREF((PyObject *)&sock_type);
6050 if (PyModule_AddObject(m, "socket",
6051 (PyObject *)&sock_type) != 0)
6052 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006053
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006054#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006055 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006056#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006058#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 Py_INCREF(has_ipv6);
6060 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 /* Export C API */
6063 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6064 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6065 ) != 0)
6066 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006069#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006070 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006071#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006072 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006073#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006075#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006076#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006077 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006078#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006079#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006081 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006082#endif
6083#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006084 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006085#endif
6086#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006088 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006089#endif
6090#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006092 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006093#endif
6094#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006096 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006097#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006098#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006100 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006101#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006102#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006104 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006105#endif
6106#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006108 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006109#endif
6110#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006111 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006112#endif
6113#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006115 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006116#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006117#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006118 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006119 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006120#endif
6121#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006122 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006123 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006124#endif
6125#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006127 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006128#endif
6129#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006131 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006132#endif
6133#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006135 PyModule_AddIntMacro(m, AF_NETLINK);
6136 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006137#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006138 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006139#endif
6140#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006141 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006142#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6144 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006145#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006146 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006147#endif
6148#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006150#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006151#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006152 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006153#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006154#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006155 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006156#endif
6157#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006159#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006161#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006163#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006164#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006165 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006166#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006167#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006168#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006171#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006172#ifdef AF_LINK
6173 PyModule_AddIntMacro(m, AF_LINK);
6174#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006175#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006177 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006178#endif
6179#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006182#endif
6183#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006186#endif
6187#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006190#endif
6191#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006193 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006194#endif
6195#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006198#endif
6199#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006200 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006202#endif
6203#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006204 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006205 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006206#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006207
Hye-Shik Chang81268602004-02-02 06:05:24 +00006208#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6210 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6211 PyModule_AddIntMacro(m, BTPROTO_HCI);
6212 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006213#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006215#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006216#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006217#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006219#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006220 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6221 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006222#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006223 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6225 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006226#endif
6227
Charles-François Natali47413c12011-10-06 19:47:44 +02006228#ifdef AF_CAN
6229 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006231#endif
6232#ifdef PF_CAN
6233 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006235#endif
6236
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006237/* Reliable Datagram Sockets */
6238#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006239 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006240#endif
6241#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006243#endif
6244
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006245/* Kernel event messages */
6246#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006248#endif
6249#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006250 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006251#endif
6252
Antoine Pitroub156a462010-10-27 20:13:57 +00006253#ifdef AF_PACKET
6254 PyModule_AddIntMacro(m, AF_PACKET);
6255#endif
6256#ifdef PF_PACKET
6257 PyModule_AddIntMacro(m, PF_PACKET);
6258#endif
6259#ifdef PACKET_HOST
6260 PyModule_AddIntMacro(m, PACKET_HOST);
6261#endif
6262#ifdef PACKET_BROADCAST
6263 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6264#endif
6265#ifdef PACKET_MULTICAST
6266 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6267#endif
6268#ifdef PACKET_OTHERHOST
6269 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6270#endif
6271#ifdef PACKET_OUTGOING
6272 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6273#endif
6274#ifdef PACKET_LOOPBACK
6275 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6276#endif
6277#ifdef PACKET_FASTROUTE
6278 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006279#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006280
Christian Heimes043d6f62008-01-07 17:19:16 +00006281#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006284 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6286 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6287 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006288
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6290 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6291 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006293 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, SOL_TIPC);
6295 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6296 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6297 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6298 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006299
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6301 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6302 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6303 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006305 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006306 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6307 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006308#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006309 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006311#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6313 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6314 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6315 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6316 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6317 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006318#endif
6319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006320 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006321 PyModule_AddIntMacro(m, SOCK_STREAM);
6322 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006323/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006324 PyModule_AddIntMacro(m, SOCK_RAW);
6325 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006326#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006327 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006328#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006329#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006330 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006331#endif
6332#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006333 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006334#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006339#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006340 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006341#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006343 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006344#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006345#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006347#endif
6348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006357#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006358#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006359 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006365 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006369#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006371 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006372#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006374 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006380 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006381#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006384#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006385#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006396#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006397#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006398 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006399#endif
6400#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006401 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006402#endif
6403#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006404 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006405#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006406#ifdef SO_BINDTODEVICE
6407 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6408#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006409#ifdef SO_PRIORITY
6410 PyModule_AddIntMacro(m, SO_PRIORITY);
6411#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006412#ifdef SO_MARK
6413 PyModule_AddIntMacro(m, SO_MARK);
6414#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416 /* Maximum number of connections for "listen" */
6417#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006419#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006421#endif
6422
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006423 /* Ancilliary message types */
6424#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006425 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006426#endif
6427#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006429#endif
6430#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006432#endif
6433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434 /* Flags for send, recv */
6435#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006464#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006465#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006467#endif
6468#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006469 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006470#endif
6471#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006472 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006473#endif
6474#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006476#endif
6477#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006478 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006479#endif
6480#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006481 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006482#endif
6483#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006485#endif
6486#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006488#endif
6489#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006491#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006492#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006494#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 /* Protocol level and numbers, usable for [gs]etsockopt */
6497#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006502#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006509 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006515 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006517#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006519#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006521 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006522#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006523 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006524#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006527#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006528 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006529#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006530#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006532#endif
6533#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6535 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006536#endif
6537#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6539 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6540 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006541
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006542 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6543 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6544 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006545#endif
6546#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6548 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6549 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6550 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006551#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006552#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006554 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6555 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6556 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6557 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6558 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6559 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6560 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6561 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6562 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6563 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6564 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6565 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6566#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006567#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006569#endif
6570#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006572#endif
6573#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006575#endif
6576#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006578#endif
6579#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006581#endif
6582#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006584#endif
6585#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006589 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006590#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006598#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006601#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006603#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006604#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006607#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006609#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006610#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006612#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006613#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006615#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006616#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006618#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006619 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006620#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006621#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006622 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006624#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006625 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006626#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006627#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006628 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006629#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006673#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006679#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006680#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006691#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006692#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006697#endif
6698/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006701#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006703#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006705 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006706#endif
6707
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006708#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006710#endif
6711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712 /* Some port configuration */
6713#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006715#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006716 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006718#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006720#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006722#endif
6723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724 /* Some reserved IP v.4 addresses */
6725#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006732#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006737#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006739#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006740#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006741 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006742#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006743 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef INADDR_ALLHOSTS_GROUP
6746 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6747 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006748#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006753#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006758#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006759 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006760#endif
6761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006762 /* IPv4 [gs]etsockopt options */
6763#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006789#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006800 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006802#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006804#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006805#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006806 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006808#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006810#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006811#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006813#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006815 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6816#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006821#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006824#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006825#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006831#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006834 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006835#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006836 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006839#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006841#endif
6842#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006844#endif
6845#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006847#endif
6848#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006850#endif
6851#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006853#endif
6854#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006856#endif
6857#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006859#endif
6860#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006862#endif
6863#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006865#endif
6866#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006867 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006868#endif
6869#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006870 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006871#endif
6872#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006874#endif
6875#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006876 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006877#endif
6878#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006880#endif
6881#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006883#endif
6884#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006886#endif
6887#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006889#endif
6890#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006892#endif
6893#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006895#endif
6896#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006898#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900 /* TCP options */
6901#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006904#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006907#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006909#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006910#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006912#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006916#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006918#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006919#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006922#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006924#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006925#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006928#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006930#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006931#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006933#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006934#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006936#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006937#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006939#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941 /* IPX options */
6942#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006944#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006945
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006946/* Reliable Datagram Sockets */
6947#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006948 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006949#endif
6950#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006952#endif
6953#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006955#endif
6956#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006958#endif
6959#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006961#endif
6962#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006964#endif
6965#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006967#endif
6968#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006970#endif
6971#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006973#endif
6974#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006976#endif
6977#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006979#endif
6980#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006982#endif
6983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006985#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006987#endif
6988#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006990#endif
6991#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006992 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006993#endif
6994#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006996#endif
6997#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006998 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006999#endif
7000#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007002#endif
7003#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007005#endif
7006#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007008#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007009#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007011#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007012#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007014#endif
7015#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007017#endif
7018#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007020#endif
7021#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007023#endif
7024#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007026#endif
7027#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007029#endif
7030#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007032#endif
7033#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007035#endif
7036#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007038#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007039#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007041#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007042#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007044#endif
7045#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007047#endif
7048#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007050#endif
7051#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007053#endif
7054#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007056#endif
7057#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007059#endif
7060#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007062#endif
7063#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007065#endif
7066#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007068#endif
7069#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007071#endif
7072#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007074#endif
7075#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007077#endif
7078#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007080#endif
7081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007082 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007083#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007085#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007086 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007087#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007088 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007089#endif
7090#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007091 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007092#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007093 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007094#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007095 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007096#endif
7097#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007098 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007099#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007100 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007101#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007102 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007103#endif
7104
Christian Heimesfaf2f632008-01-06 16:59:19 +00007105#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007106 {
7107 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7108 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7109 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007110 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111 PyObject *tmp;
7112 tmp = PyLong_FromUnsignedLong(codes[i]);
7113 if (tmp == NULL)
7114 return NULL;
7115 PyModule_AddObject(m, names[i], tmp);
7116 }
7117 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007118 PyModule_AddIntMacro(m, RCVALL_OFF);
7119 PyModule_AddIntMacro(m, RCVALL_ON);
7120 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007121#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007123#endif
7124#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007126#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007127#endif /* _MSTCPIP_ */
7128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007129 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007130#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007131 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007132#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007133 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007134}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007135
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007136
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007137#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007138#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007139
7140/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007141/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007142
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007143int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007144inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007146 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007147#if (SIZEOF_INT != 4)
7148#error "Not sure if in_addr_t exists and int is not 32-bits."
7149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150 unsigned int packed_addr;
7151 packed_addr = inet_addr(src);
7152 if (packed_addr == INADDR_NONE)
7153 return 0;
7154 memcpy(dst, &packed_addr, 4);
7155 return 1;
7156 }
7157 /* Should set errno to EAFNOSUPPORT */
7158 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007159}
7160
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007161const char *
7162inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164 if (af == AF_INET) {
7165 struct in_addr packed_addr;
7166 if (size < 16)
7167 /* Should set errno to ENOSPC. */
7168 return NULL;
7169 memcpy(&packed_addr, src, sizeof(packed_addr));
7170 return strncpy(dst, inet_ntoa(packed_addr), size);
7171 }
7172 /* Should set errno to EAFNOSUPPORT */
7173 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007174}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007175
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007176#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007177#endif