blob: fd20b174d3c83a3418a249c286edbca1769a93c3 [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
Victor Stinner81c41db2015-04-02 11:50:57 +0200485# define GET_SOCK_ERROR WSAGetLastError()
486# define SET_SOCK_ERROR(err) WSASetLastError(err)
487# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
488# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
489#else
490# define GET_SOCK_ERROR errno
491# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
492# define SOCK_TIMEOUT_ERR EWOULDBLOCK
493# define SOCK_INPROGRESS_ERR EINPROGRESS
494#endif
495
496
497#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200498/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
499static int support_wsa_no_inherit = -1;
500#endif
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502/* Convenience function to raise an error according to errno
503 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504
Guido van Rossum73624e91994-10-10 17:59:00 +0000505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000508#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 int err_no = WSAGetLastError();
510 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
511 recognizes the error codes used by both GetLastError() and
512 WSAGetLastError */
513 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200514 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000515#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000516
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200517 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518}
519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000525
526#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (v != NULL) {
532 PyErr_SetObject(socket_herror, v);
533 Py_DECREF(v);
534 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537}
538
539
540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544
Martin v. Löwis272cb402002-03-01 08:31:07 +0000545#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* EAI_SYSTEM is not available on Windows XP. */
547 if (error == EAI_SYSTEM)
548 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000549#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000551#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000553#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (v != NULL) {
557 PyErr_SetObject(socket_gaierror, v);
558 Py_DECREF(v);
559 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562}
563
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000564/* Function to perform the setting of socket blocking mode
565 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000566static int
567internal_setblocking(PySocketSockObject *s, int block)
568{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200569#ifdef MS_WINDOWS
570 u_long arg;
571#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100572#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100573 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100574 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000575#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000576#ifdef SOCK_NONBLOCK
577 if (block)
578 s->sock_type &= (~SOCK_NONBLOCK);
579 else
580 s->sock_type |= SOCK_NONBLOCK;
581#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100585#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 block = !block;
587 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100588#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
590 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100591 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 else
Victor Stinner9a954832013-12-04 00:41:24 +0100593 new_delay_flag = delay_flag | O_NONBLOCK;
594 if (new_delay_flag != delay_flag)
595 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
596#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200598 arg = !block;
599 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Since these don't return anything */
604 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605}
606
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000607static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200608internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
609 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100612#ifdef HAVE_POLL
613 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200614 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100615#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200616 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200617 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100618#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000619
Victor Stinnerb7df3142015-03-27 22:59:32 +0100620#ifdef WITH_THREAD
621 /* must be called with the GIL held */
622 assert(PyGILState_Check());
623#endif
624
Victor Stinner416f2e62015-03-31 13:56:29 +0200625 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200626 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* Guard against closed socket */
629 if (s->sock_fd < 0)
630 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 /* Prefer poll, if available, since you can poll() any fd
633 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100635 pollfd.fd = s->sock_fd;
636 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200637 if (connect) {
638 /* On Windows, the socket becomes writable on connection success,
639 but a connection failure is notified as an error. On POSIX, the
640 socket becomes writable on connection success or on connection
641 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200642 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200643 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644
Victor Stinner71694d52015-03-28 01:18:54 +0100645 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200646 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200647 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000648
Victor Stinner71694d52015-03-28 01:18:54 +0100649 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200650 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100651 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000652#else
Victor Stinnerced11742015-04-09 10:27:25 +0200653 if (interval >= 0) {
654 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
655 tvp = &tv;
656 }
657 else
658 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000659
Victor Stinner71694d52015-03-28 01:18:54 +0100660 FD_ZERO(&fds);
661 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200662 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200663 if (connect) {
664 /* On Windows, the socket becomes writable on connection success,
665 but a connection failure is notified as an error. On POSIX, the
666 socket becomes writable on connection success or on connection
667 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200668 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200669 }
Victor Stinner71694d52015-03-28 01:18:54 +0100670
671 /* See if the socket is ready */
672 Py_BEGIN_ALLOW_THREADS;
673 if (writing)
674 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200675 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100676 else
677 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200678 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100679 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000680#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (n < 0)
683 return -1;
684 if (n == 0)
685 return 1;
686 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687}
688
Victor Stinner31bf2d52015-04-01 21:57:09 +0200689/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000690
Victor Stinner81c41db2015-04-02 11:50:57 +0200691 On error, raise an exception and return -1 if err is set, or fill err and
692 return -1 otherwise. If a signal was received and the signal handler raised
693 an exception, return -1, and set err to -1 if err is set.
694
695 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100696
Victor Stinner31bf2d52015-04-01 21:57:09 +0200697 If the socket has a timeout, wait until the socket is ready before calling
698 the function: wait until the socket is writable if writing is nonzero, wait
699 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100700
Victor Stinner81c41db2015-04-02 11:50:57 +0200701 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200702 the function, except if the signal handler raised an exception (PEP 475).
703
704 When the function is retried, recompute the timeout using a monotonic clock.
705
Victor Stinner81c41db2015-04-02 11:50:57 +0200706 sock_call_ex() must be called with the GIL held. The socket function is
707 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200708static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200709sock_call_ex(PySocketSockObject *s,
710 int writing,
711 int (*sock_func) (PySocketSockObject *s, void *data),
712 void *data,
713 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200714 int *err,
715 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200716{
Victor Stinner8912d142015-04-06 23:16:34 +0200717 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200718 _PyTime_t deadline = 0;
719 int deadline_initialized = 0;
720 int res;
721
722 /* sock_call() must be called with the GIL held. */
723 assert(PyGILState_Check());
724
725 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200726 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200727 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200728 /* For connect(), poll even for blocking socket. The connection
729 runs asynchronously. */
730 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200731 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200732 _PyTime_t interval;
733
Victor Stinner81c41db2015-04-02 11:50:57 +0200734 if (deadline_initialized) {
735 /* recompute the timeout */
736 interval = deadline - _PyTime_GetMonotonicClock();
737 }
738 else {
739 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200740 deadline = _PyTime_GetMonotonicClock() + timeout;
741 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200742 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200743
Victor Stinner10550cd2015-04-03 13:22:27 +0200744 if (interval >= 0)
745 res = internal_select(s, writing, interval, connect);
746 else
747 res = 1;
748 }
749 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200750 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200751 }
752
Victor Stinner31bf2d52015-04-01 21:57:09 +0200753 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 if (err)
755 *err = GET_SOCK_ERROR;
756
Victor Stinner31bf2d52015-04-01 21:57:09 +0200757 if (CHECK_ERRNO(EINTR)) {
758 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200759 if (PyErr_CheckSignals()) {
760 if (err)
761 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200762 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200763 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764
765 /* retry select() */
766 continue;
767 }
768
769 /* select() failed */
770 s->errorhandler();
771 return -1;
772 }
773
774 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200775 if (err)
776 *err = SOCK_TIMEOUT_ERR;
777 else
778 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200779 return -1;
780 }
781
782 /* the socket is ready */
783 }
784
Victor Stinner81c41db2015-04-02 11:50:57 +0200785 /* inner loop to retry sock_func() when sock_func() is interrupted
786 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200787 while (1) {
788 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200789 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200790 Py_END_ALLOW_THREADS
791
792 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 /* sock_func() succeeded */
794 if (err)
795 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 return 0;
797 }
798
Victor Stinner81c41db2015-04-02 11:50:57 +0200799 if (err)
800 *err = GET_SOCK_ERROR;
801
Victor Stinner31bf2d52015-04-01 21:57:09 +0200802 if (!CHECK_ERRNO(EINTR))
803 break;
804
Victor Stinner81c41db2015-04-02 11:50:57 +0200805 /* sock_func() was interrupted by a signal */
806 if (PyErr_CheckSignals()) {
807 if (err)
808 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200809 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200810 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813 }
814
815 if (s->sock_timeout > 0
816 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200817 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200818
819 For example, select() could indicate a socket is ready for
820 reading, but the data then discarded by the OS because of a
821 wrong checksum.
822
823 Loop on select() to recheck for socket readyness. */
824 continue;
825 }
826
Victor Stinner81c41db2015-04-02 11:50:57 +0200827 /* sock_func() failed */
828 if (!err)
829 s->errorhandler();
830 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000831 return -1;
832 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200833}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000834
Victor Stinner81c41db2015-04-02 11:50:57 +0200835static int
836sock_call(PySocketSockObject *s,
837 int writing,
838 int (*func) (PySocketSockObject *s, void *data),
839 void *data)
840{
Victor Stinner8912d142015-04-06 23:16:34 +0200841 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200842}
843
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000844
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000845/* Initialize a new socket object. */
846
Victor Stinner88ed6402015-04-09 10:23:12 +0200847/* Default timeout for new sockets */
848static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000849
Martin v. Löwis1a214512008-06-11 05:26:20 +0000850static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000851init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000853{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 s->sock_fd = fd;
855 s->sock_family = family;
856 s->sock_type = type;
857 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000860#ifdef SOCK_NONBLOCK
861 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100862 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000863 else
864#endif
865 {
866 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100867 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000868 internal_setblocking(s, 0);
869 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000870
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000871}
872
873
Guido van Rossum30a685f1991-06-27 15:51:29 +0000874/* Create a new socket object.
875 This just creates the object and initializes it.
876 If the creation fails, return NULL and set an exception (implicit
877 in NEWOBJ()). */
878
Guido van Rossum73624e91994-10-10 17:59:00 +0000879static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000880new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 PySocketSockObject *s;
883 s = (PySocketSockObject *)
884 PyType_GenericNew(&sock_type, NULL, NULL);
885 if (s != NULL)
886 init_sockobject(s, fd, family, type, proto);
887 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888}
889
Guido van Rossum30a685f1991-06-27 15:51:29 +0000890
Guido van Rossum48a680c2001-03-02 06:34:14 +0000891/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000892 thread to be in gethostbyname or getaddrinfo */
893#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200894static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000895#endif
896
897
Guido van Rossum30a685f1991-06-27 15:51:29 +0000898/* Convert a string specifying a host name or one of a few symbolic
899 names to a numeric IP address. This usually calls gethostbyname()
900 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000901 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000902 an error occurred; then an exception is raised. */
903
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000904static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000905setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 struct addrinfo hints, *res;
908 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
911 if (name[0] == '\0') {
912 int siz;
913 memset(&hints, 0, sizeof(hints));
914 hints.ai_family = af;
915 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
916 hints.ai_flags = AI_PASSIVE;
917 Py_BEGIN_ALLOW_THREADS
918 ACQUIRE_GETADDRINFO_LOCK
919 error = getaddrinfo(NULL, "0", &hints, &res);
920 Py_END_ALLOW_THREADS
921 /* We assume that those thread-unsafe getaddrinfo() versions
922 *are* safe regarding their return value, ie. that a
923 subsequent call to getaddrinfo() does not destroy the
924 outcome of the first call. */
925 RELEASE_GETADDRINFO_LOCK
926 if (error) {
927 set_gaierror(error);
928 return -1;
929 }
930 switch (res->ai_family) {
931 case AF_INET:
932 siz = 4;
933 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000934#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 case AF_INET6:
936 siz = 16;
937 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000939 default:
940 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200941 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 "unsupported address family");
943 return -1;
944 }
945 if (res->ai_next) {
946 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200947 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000948 "wildcard resolved to multiple address");
949 return -1;
950 }
951 if (res->ai_addrlen < addr_ret_size)
952 addr_ret_size = res->ai_addrlen;
953 memcpy(addr_ret, res->ai_addr, addr_ret_size);
954 freeaddrinfo(res);
955 return siz;
956 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200957 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100958 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200959 if (strcmp(name, "255.255.255.255") == 0 ||
960 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 struct sockaddr_in *sin;
962 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200963 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 "address family mismatched");
965 return -1;
966 }
967 sin = (struct sockaddr_in *)addr_ret;
968 memset((void *) sin, '\0', sizeof(*sin));
969 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000970#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000972#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 sin->sin_addr.s_addr = INADDR_BROADCAST;
974 return sizeof(sin->sin_addr);
975 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200976
977 /* avoid a name resolution in case of numeric address */
978#ifdef HAVE_INET_PTON
979 /* check for an IPv4 address */
980 if (af == AF_UNSPEC || af == AF_INET) {
981 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
982 memset(sin, 0, sizeof(*sin));
983 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
984 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000985#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200986 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000987#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200988 return 4;
989 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000990 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200991#ifdef ENABLE_IPV6
992 /* check for an IPv6 address - if the address contains a scope ID, we
993 * fallback to getaddrinfo(), which can handle translation from interface
994 * name to interface index */
995 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
996 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
997 memset(sin, 0, sizeof(*sin));
998 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
999 sin->sin6_family = AF_INET6;
1000#ifdef HAVE_SOCKADDR_SA_LEN
1001 sin->sin6_len = sizeof(*sin);
1002#endif
1003 return 16;
1004 }
1005 }
1006#endif /* ENABLE_IPV6 */
1007#else /* HAVE_INET_PTON */
1008 /* check for an IPv4 address */
1009 if (af == AF_INET || af == AF_UNSPEC) {
1010 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1011 memset(sin, 0, sizeof(*sin));
1012 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1013 sin->sin_family = AF_INET;
1014#ifdef HAVE_SOCKADDR_SA_LEN
1015 sin->sin_len = sizeof(*sin);
1016#endif
1017 return 4;
1018 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001019 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001020#endif /* HAVE_INET_PTON */
1021
1022 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 memset(&hints, 0, sizeof(hints));
1024 hints.ai_family = af;
1025 Py_BEGIN_ALLOW_THREADS
1026 ACQUIRE_GETADDRINFO_LOCK
1027 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001028#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 if (error == EAI_NONAME && af == AF_UNSPEC) {
1030 /* On Tru64 V5.1, numeric-to-addr conversion fails
1031 if no address family is given. Assume IPv4 for now.*/
1032 hints.ai_family = AF_INET;
1033 error = getaddrinfo(name, NULL, &hints, &res);
1034 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001035#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 Py_END_ALLOW_THREADS
1037 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1038 if (error) {
1039 set_gaierror(error);
1040 return -1;
1041 }
1042 if (res->ai_addrlen < addr_ret_size)
1043 addr_ret_size = res->ai_addrlen;
1044 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1045 freeaddrinfo(res);
1046 switch (addr_ret->sa_family) {
1047 case AF_INET:
1048 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001049#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001050 case AF_INET6:
1051 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001053 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001054 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 return -1;
1056 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001057}
1058
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059
Guido van Rossum30a685f1991-06-27 15:51:29 +00001060/* Create a string object representing an IP address.
1061 This is always a string of the form 'dd.dd.dd.dd' (with variable
1062 size numbers). */
1063
Guido van Rossum73624e91994-10-10 17:59:00 +00001064static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001065makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001067 char buf[NI_MAXHOST];
1068 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1071 NI_NUMERICHOST);
1072 if (error) {
1073 set_gaierror(error);
1074 return NULL;
1075 }
1076 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001077}
1078
1079
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001080#ifdef USE_BLUETOOTH
1081/* Convert a string representation of a Bluetooth address into a numeric
1082 address. Returns the length (6), or raises an exception and returns -1 if
1083 an error occurred. */
1084
1085static int
1086setbdaddr(char *name, bdaddr_t *bdaddr)
1087{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001088 unsigned int b0, b1, b2, b3, b4, b5;
1089 char ch;
1090 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1093 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1094 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1095 bdaddr->b[0] = b0;
1096 bdaddr->b[1] = b1;
1097 bdaddr->b[2] = b2;
1098 bdaddr->b[3] = b3;
1099 bdaddr->b[4] = b4;
1100 bdaddr->b[5] = b5;
1101 return 6;
1102 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001103 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001104 return -1;
1105 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001106}
1107
1108/* Create a string representation of the Bluetooth address. This is always a
1109 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1110 value (zero padded if necessary). */
1111
1112static PyObject *
1113makebdaddr(bdaddr_t *bdaddr)
1114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001115 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1118 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1119 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1120 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001121}
1122#endif
1123
1124
Guido van Rossum30a685f1991-06-27 15:51:29 +00001125/* Create an object representing the given socket address,
1126 suitable for passing it back to bind(), connect() etc.
1127 The family field of the sockaddr structure is inspected
1128 to determine what kind of address it really is. */
1129
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001130/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001131static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001132makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 if (addrlen == 0) {
1135 /* No address -- may be recvfrom() from known socket */
1136 Py_INCREF(Py_None);
1137 return Py_None;
1138 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 case AF_INET:
1143 {
1144 struct sockaddr_in *a;
1145 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1146 PyObject *ret = NULL;
1147 if (addrobj) {
1148 a = (struct sockaddr_in *)addr;
1149 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1150 Py_DECREF(addrobj);
1151 }
1152 return ret;
1153 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001154
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001155#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 case AF_UNIX:
1157 {
1158 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001159#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1161 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001162 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 }
1164 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001165#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001166 {
1167 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001168 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 }
1170 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001171#endif /* AF_UNIX */
1172
Martin v. Löwis11017b12006-01-14 18:12:57 +00001173#if defined(AF_NETLINK)
1174 case AF_NETLINK:
1175 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1177 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001178 }
1179#endif /* AF_NETLINK */
1180
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001181#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001182 case AF_INET6:
1183 {
1184 struct sockaddr_in6 *a;
1185 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1186 PyObject *ret = NULL;
1187 if (addrobj) {
1188 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001189 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001190 addrobj,
1191 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001192 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001193 a->sin6_scope_id);
1194 Py_DECREF(addrobj);
1195 }
1196 return ret;
1197 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001198#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001199
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001200#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001201 case AF_BLUETOOTH:
1202 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 case BTPROTO_L2CAP:
1205 {
1206 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1207 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1208 PyObject *ret = NULL;
1209 if (addrobj) {
1210 ret = Py_BuildValue("Oi",
1211 addrobj,
1212 _BT_L2_MEMB(a, psm));
1213 Py_DECREF(addrobj);
1214 }
1215 return ret;
1216 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 case BTPROTO_RFCOMM:
1219 {
1220 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1221 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1222 PyObject *ret = NULL;
1223 if (addrobj) {
1224 ret = Py_BuildValue("Oi",
1225 addrobj,
1226 _BT_RC_MEMB(a, channel));
1227 Py_DECREF(addrobj);
1228 }
1229 return ret;
1230 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 case BTPROTO_HCI:
1233 {
1234 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001235#if defined(__NetBSD__) || defined(__DragonFly__)
1236 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1237#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 PyObject *ret = NULL;
1239 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1240 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001241#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001242 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001243
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001244#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 case BTPROTO_SCO:
1246 {
1247 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1248 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1249 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001250#endif
1251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 default:
1253 PyErr_SetString(PyExc_ValueError,
1254 "Unknown Bluetooth protocol");
1255 return NULL;
1256 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001257#endif
1258
Antoine Pitroub156a462010-10-27 20:13:57 +00001259#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 case AF_PACKET:
1261 {
1262 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1263 char *ifname = "";
1264 struct ifreq ifr;
1265 /* need to look up interface name give index */
1266 if (a->sll_ifindex) {
1267 ifr.ifr_ifindex = a->sll_ifindex;
1268 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1269 ifname = ifr.ifr_name;
1270 }
1271 return Py_BuildValue("shbhy#",
1272 ifname,
1273 ntohs(a->sll_protocol),
1274 a->sll_pkttype,
1275 a->sll_hatype,
1276 a->sll_addr,
1277 a->sll_halen);
1278 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001279#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001280
Christian Heimes043d6f62008-01-07 17:19:16 +00001281#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001282 case AF_TIPC:
1283 {
1284 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1285 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1286 return Py_BuildValue("IIIII",
1287 a->addrtype,
1288 a->addr.nameseq.type,
1289 a->addr.nameseq.lower,
1290 a->addr.nameseq.upper,
1291 a->scope);
1292 } else if (a->addrtype == TIPC_ADDR_NAME) {
1293 return Py_BuildValue("IIIII",
1294 a->addrtype,
1295 a->addr.name.name.type,
1296 a->addr.name.name.instance,
1297 a->addr.name.name.instance,
1298 a->scope);
1299 } else if (a->addrtype == TIPC_ADDR_ID) {
1300 return Py_BuildValue("IIIII",
1301 a->addrtype,
1302 a->addr.id.node,
1303 a->addr.id.ref,
1304 0,
1305 a->scope);
1306 } else {
1307 PyErr_SetString(PyExc_ValueError,
1308 "Invalid address type");
1309 return NULL;
1310 }
1311 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001312#endif
1313
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001314#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001315 case AF_CAN:
1316 {
1317 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1318 char *ifname = "";
1319 struct ifreq ifr;
1320 /* need to look up interface name given index */
1321 if (a->can_ifindex) {
1322 ifr.ifr_ifindex = a->can_ifindex;
1323 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1324 ifname = ifr.ifr_name;
1325 }
1326
1327 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1328 ifname,
1329 a->can_family);
1330 }
1331#endif
1332
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001333#ifdef PF_SYSTEM
1334 case PF_SYSTEM:
1335 switch(proto) {
1336#ifdef SYSPROTO_CONTROL
1337 case SYSPROTO_CONTROL:
1338 {
1339 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1340 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1341 }
1342#endif
1343 default:
1344 PyErr_SetString(PyExc_ValueError,
1345 "Invalid address type");
1346 return 0;
1347 }
1348#endif
1349
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001350 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 default:
1353 /* If we don't know the address family, don't raise an
1354 exception -- return it as an (int, bytes) tuple. */
1355 return Py_BuildValue("iy#",
1356 addr->sa_family,
1357 addr->sa_data,
1358 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001360 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001361}
1362
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001363/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1364 (in particular, numeric IP addresses). */
1365struct maybe_idna {
1366 PyObject *obj;
1367 char *buf;
1368};
1369
1370static void
1371idna_cleanup(struct maybe_idna *data)
1372{
1373 Py_CLEAR(data->obj);
1374}
1375
1376static int
1377idna_converter(PyObject *obj, struct maybe_idna *data)
1378{
1379 size_t len;
1380 PyObject *obj2, *obj3;
1381 if (obj == NULL) {
1382 idna_cleanup(data);
1383 return 1;
1384 }
1385 data->obj = NULL;
1386 len = -1;
1387 if (PyBytes_Check(obj)) {
1388 data->buf = PyBytes_AsString(obj);
1389 len = PyBytes_Size(obj);
1390 }
1391 else if (PyByteArray_Check(obj)) {
1392 data->buf = PyByteArray_AsString(obj);
1393 len = PyByteArray_Size(obj);
1394 }
1395 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1396 data->buf = PyUnicode_DATA(obj);
1397 len = PyUnicode_GET_LENGTH(obj);
1398 }
1399 else {
1400 obj2 = PyUnicode_FromObject(obj);
1401 if (!obj2) {
1402 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1403 obj->ob_type->tp_name);
1404 return 0;
1405 }
1406 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1407 Py_DECREF(obj2);
1408 if (!obj3) {
1409 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1410 return 0;
1411 }
1412 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001413 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001414 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1415 return 0;
1416 }
1417 data->obj = obj3;
1418 data->buf = PyBytes_AS_STRING(obj3);
1419 len = PyBytes_GET_SIZE(obj3);
1420 }
1421 if (strlen(data->buf) != len) {
1422 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001423 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001424 return 0;
1425 }
1426 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001427}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001428
1429/* Parse a socket address argument according to the socket object's
1430 address family. Return 1 if the address was in the proper format,
1431 0 of not. The address is returned through addr_ret, its length
1432 through len_ret. */
1433
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001434static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001435getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001436 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001437{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001439
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001440#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001441 case AF_UNIX:
1442 {
1443 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001444 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001445 int retval = 0;
1446
1447 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1448 allow embedded nulls on Linux. */
1449 if (PyUnicode_Check(args)) {
1450 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1451 return 0;
1452 }
1453 else
1454 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001455 if (!PyArg_Parse(args, "y*", &path)) {
1456 Py_DECREF(args);
1457 return retval;
1458 }
1459 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001462#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001463 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001465 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001466 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001468 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 }
1470 }
1471 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001472#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 {
1474 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001475 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001476 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001477 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001478 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001480 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 }
1482 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001483 memcpy(addr->sun_path, path.buf, path.len);
1484 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001485 retval = 1;
1486 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001487 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001488 Py_DECREF(args);
1489 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001490 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001491#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001492
Martin v. Löwis11017b12006-01-14 18:12:57 +00001493#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001494 case AF_NETLINK:
1495 {
1496 struct sockaddr_nl* addr;
1497 int pid, groups;
1498 addr = (struct sockaddr_nl *)addr_ret;
1499 if (!PyTuple_Check(args)) {
1500 PyErr_Format(
1501 PyExc_TypeError,
1502 "getsockaddrarg: "
1503 "AF_NETLINK address must be tuple, not %.500s",
1504 Py_TYPE(args)->tp_name);
1505 return 0;
1506 }
1507 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1508 return 0;
1509 addr->nl_family = AF_NETLINK;
1510 addr->nl_pid = pid;
1511 addr->nl_groups = groups;
1512 *len_ret = sizeof(*addr);
1513 return 1;
1514 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001515#endif
1516
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001517#ifdef AF_RDS
1518 case AF_RDS:
1519 /* RDS sockets use sockaddr_in: fall-through */
1520#endif
1521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001522 case AF_INET:
1523 {
1524 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001525 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001526 int port, result;
1527 if (!PyTuple_Check(args)) {
1528 PyErr_Format(
1529 PyExc_TypeError,
1530 "getsockaddrarg: "
1531 "AF_INET address must be tuple, not %.500s",
1532 Py_TYPE(args)->tp_name);
1533 return 0;
1534 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001535 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1536 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001537 return 0;
1538 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001539 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001540 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001541 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 if (result < 0)
1543 return 0;
1544 if (port < 0 || port > 0xffff) {
1545 PyErr_SetString(
1546 PyExc_OverflowError,
1547 "getsockaddrarg: port must be 0-65535.");
1548 return 0;
1549 }
1550 addr->sin_family = AF_INET;
1551 addr->sin_port = htons((short)port);
1552 *len_ret = sizeof *addr;
1553 return 1;
1554 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001555
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001556#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 case AF_INET6:
1558 {
1559 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001560 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001561 int port, result;
1562 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 flowinfo = scope_id = 0;
1564 if (!PyTuple_Check(args)) {
1565 PyErr_Format(
1566 PyExc_TypeError,
1567 "getsockaddrarg: "
1568 "AF_INET6 address must be tuple, not %.500s",
1569 Py_TYPE(args)->tp_name);
1570 return 0;
1571 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001572 if (!PyArg_ParseTuple(args, "O&i|II",
1573 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 &scope_id)) {
1575 return 0;
1576 }
1577 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001578 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001579 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001580 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 if (result < 0)
1582 return 0;
1583 if (port < 0 || port > 0xffff) {
1584 PyErr_SetString(
1585 PyExc_OverflowError,
1586 "getsockaddrarg: port must be 0-65535.");
1587 return 0;
1588 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001589 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001590 PyErr_SetString(
1591 PyExc_OverflowError,
1592 "getsockaddrarg: flowinfo must be 0-1048575.");
1593 return 0;
1594 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001595 addr->sin6_family = s->sock_family;
1596 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001597 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 addr->sin6_scope_id = scope_id;
1599 *len_ret = sizeof *addr;
1600 return 1;
1601 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001602#endif
1603
Hye-Shik Chang81268602004-02-02 06:05:24 +00001604#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 case AF_BLUETOOTH:
1606 {
1607 switch (s->sock_proto) {
1608 case BTPROTO_L2CAP:
1609 {
1610 struct sockaddr_l2 *addr;
1611 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 addr = (struct sockaddr_l2 *)addr_ret;
1614 memset(addr, 0, sizeof(struct sockaddr_l2));
1615 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1616 if (!PyArg_ParseTuple(args, "si", &straddr,
1617 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001618 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 "wrong format");
1620 return 0;
1621 }
1622 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1623 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001625 *len_ret = sizeof *addr;
1626 return 1;
1627 }
1628 case BTPROTO_RFCOMM:
1629 {
1630 struct sockaddr_rc *addr;
1631 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001633 addr = (struct sockaddr_rc *)addr_ret;
1634 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1635 if (!PyArg_ParseTuple(args, "si", &straddr,
1636 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001637 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 "wrong format");
1639 return 0;
1640 }
1641 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1642 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001644 *len_ret = sizeof *addr;
1645 return 1;
1646 }
1647 case BTPROTO_HCI:
1648 {
1649 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001650#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001651 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001652
Alexander Belopolskye239d232010-12-08 23:31:48 +00001653 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001654 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001655 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001656 "wrong format");
1657 return 0;
1658 }
1659 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1660 return 0;
1661#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1663 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001664 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 "wrong format");
1666 return 0;
1667 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 *len_ret = sizeof *addr;
1670 return 1;
1671 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001672#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001673 case BTPROTO_SCO:
1674 {
1675 struct sockaddr_sco *addr;
1676 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001677
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001678 addr = (struct sockaddr_sco *)addr_ret;
1679 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1680 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001681 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 "wrong format");
1683 return 0;
1684 }
1685 straddr = PyBytes_AS_STRING(args);
1686 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1687 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 *len_ret = sizeof *addr;
1690 return 1;
1691 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001693 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001694 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 return 0;
1696 }
1697 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001698#endif
1699
Antoine Pitroub156a462010-10-27 20:13:57 +00001700#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 case AF_PACKET:
1702 {
1703 struct sockaddr_ll* addr;
1704 struct ifreq ifr;
1705 char *interfaceName;
1706 int protoNumber;
1707 int hatype = 0;
1708 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001709 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001710
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001711 if (!PyTuple_Check(args)) {
1712 PyErr_Format(
1713 PyExc_TypeError,
1714 "getsockaddrarg: "
1715 "AF_PACKET address must be tuple, not %.500s",
1716 Py_TYPE(args)->tp_name);
1717 return 0;
1718 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001719 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001720 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001721 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 return 0;
1723 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1724 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1725 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1726 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001727 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 return 0;
1729 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001730 if (haddr.buf && haddr.len > 8) {
1731 PyErr_SetString(PyExc_ValueError,
1732 "Hardware address must be 8 bytes or less");
1733 PyBuffer_Release(&haddr);
1734 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 }
1736 if (protoNumber < 0 || protoNumber > 0xffff) {
1737 PyErr_SetString(
1738 PyExc_OverflowError,
1739 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001740 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001741 return 0;
1742 }
1743 addr = (struct sockaddr_ll*)addr_ret;
1744 addr->sll_family = AF_PACKET;
1745 addr->sll_protocol = htons((short)protoNumber);
1746 addr->sll_ifindex = ifr.ifr_ifindex;
1747 addr->sll_pkttype = pkttype;
1748 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001749 if (haddr.buf) {
1750 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1751 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001752 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001753 else
1754 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001756 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 return 1;
1758 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001759#endif
1760
Christian Heimes043d6f62008-01-07 17:19:16 +00001761#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 case AF_TIPC:
1763 {
1764 unsigned int atype, v1, v2, v3;
1765 unsigned int scope = TIPC_CLUSTER_SCOPE;
1766 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001768 if (!PyTuple_Check(args)) {
1769 PyErr_Format(
1770 PyExc_TypeError,
1771 "getsockaddrarg: "
1772 "AF_TIPC address must be tuple, not %.500s",
1773 Py_TYPE(args)->tp_name);
1774 return 0;
1775 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001776
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001777 if (!PyArg_ParseTuple(args,
1778 "IIII|I;Invalid TIPC address format",
1779 &atype, &v1, &v2, &v3, &scope))
1780 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 addr = (struct sockaddr_tipc *) addr_ret;
1783 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001784
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001785 addr->family = AF_TIPC;
1786 addr->scope = scope;
1787 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 if (atype == TIPC_ADDR_NAMESEQ) {
1790 addr->addr.nameseq.type = v1;
1791 addr->addr.nameseq.lower = v2;
1792 addr->addr.nameseq.upper = v3;
1793 } else if (atype == TIPC_ADDR_NAME) {
1794 addr->addr.name.name.type = v1;
1795 addr->addr.name.name.instance = v2;
1796 } else if (atype == TIPC_ADDR_ID) {
1797 addr->addr.id.node = v1;
1798 addr->addr.id.ref = v2;
1799 } else {
1800 /* Shouldn't happen */
1801 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1802 return 0;
1803 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 return 1;
1808 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001809#endif
1810
Vinay Sajiped6783f2014-03-21 11:44:32 +00001811#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001812 case AF_CAN:
1813 switch (s->sock_proto) {
1814 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001815 /* fall-through */
1816 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001817 {
1818 struct sockaddr_can *addr;
1819 PyObject *interfaceName;
1820 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001821 Py_ssize_t len;
1822
Benjamin Peterson18b71912013-05-16 15:29:44 -05001823 addr = (struct sockaddr_can *)addr_ret;
1824
Charles-François Natali47413c12011-10-06 19:47:44 +02001825 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1826 &interfaceName))
1827 return 0;
1828
1829 len = PyBytes_GET_SIZE(interfaceName);
1830
1831 if (len == 0) {
1832 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001833 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001834 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1835 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001836 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1837 s->errorhandler();
1838 Py_DECREF(interfaceName);
1839 return 0;
1840 }
1841 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001842 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001843 "AF_CAN interface name too long");
1844 Py_DECREF(interfaceName);
1845 return 0;
1846 }
1847
1848 addr->can_family = AF_CAN;
1849 addr->can_ifindex = ifr.ifr_ifindex;
1850
1851 *len_ret = sizeof(*addr);
1852 Py_DECREF(interfaceName);
1853 return 1;
1854 }
1855 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001856 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001857 "getsockaddrarg: unsupported CAN protocol");
1858 return 0;
1859 }
1860#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001861
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001862#ifdef PF_SYSTEM
1863 case PF_SYSTEM:
1864 switch (s->sock_proto) {
1865#ifdef SYSPROTO_CONTROL
1866 case SYSPROTO_CONTROL:
1867 {
1868 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001869
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001870 addr = (struct sockaddr_ctl *)addr_ret;
1871 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001872 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001873
1874 if (PyUnicode_Check(args)) {
1875 struct ctl_info info;
1876 PyObject *ctl_name;
1877
1878 if (!PyArg_Parse(args, "O&",
1879 PyUnicode_FSConverter, &ctl_name)) {
1880 return 0;
1881 }
1882
Victor Stinnerf50e1872015-03-20 11:32:24 +01001883 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001884 PyErr_SetString(PyExc_ValueError,
1885 "provided string is too long");
1886 Py_DECREF(ctl_name);
1887 return 0;
1888 }
1889 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1890 sizeof(info.ctl_name));
1891 Py_DECREF(ctl_name);
1892
1893 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1894 PyErr_SetString(PyExc_OSError,
1895 "cannot find kernel control with provided name");
1896 return 0;
1897 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001898
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001899 addr->sc_id = info.ctl_id;
1900 addr->sc_unit = 0;
1901 } else if (!PyArg_ParseTuple(args, "II",
1902 &(addr->sc_id), &(addr->sc_unit))) {
1903 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1904 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001905
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001906 return 0;
1907 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001908
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001909 *len_ret = sizeof(*addr);
1910 return 1;
1911 }
1912#endif
1913 default:
1914 PyErr_SetString(PyExc_OSError,
1915 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1916 return 0;
1917 }
1918#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001923 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001927}
1928
Guido van Rossum30a685f1991-06-27 15:51:29 +00001929
Guido van Rossum48a680c2001-03-02 06:34:14 +00001930/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001931 Return 1 if the family is known, 0 otherwise. The length is returned
1932 through len_ret. */
1933
1934static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001935getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001936{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001937 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001938
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001939#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001940 case AF_UNIX:
1941 {
1942 *len_ret = sizeof (struct sockaddr_un);
1943 return 1;
1944 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001945#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001946#if defined(AF_NETLINK)
1947 case AF_NETLINK:
1948 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001949 *len_ret = sizeof (struct sockaddr_nl);
1950 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001951 }
1952#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001953
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001954#ifdef AF_RDS
1955 case AF_RDS:
1956 /* RDS sockets use sockaddr_in: fall-through */
1957#endif
1958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 case AF_INET:
1960 {
1961 *len_ret = sizeof (struct sockaddr_in);
1962 return 1;
1963 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001964
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001965#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 case AF_INET6:
1967 {
1968 *len_ret = sizeof (struct sockaddr_in6);
1969 return 1;
1970 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001971#endif
1972
Hye-Shik Chang81268602004-02-02 06:05:24 +00001973#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001974 case AF_BLUETOOTH:
1975 {
1976 switch(s->sock_proto)
1977 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 case BTPROTO_L2CAP:
1980 *len_ret = sizeof (struct sockaddr_l2);
1981 return 1;
1982 case BTPROTO_RFCOMM:
1983 *len_ret = sizeof (struct sockaddr_rc);
1984 return 1;
1985 case BTPROTO_HCI:
1986 *len_ret = sizeof (struct sockaddr_hci);
1987 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001988#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 case BTPROTO_SCO:
1990 *len_ret = sizeof (struct sockaddr_sco);
1991 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001993 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001994 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 "unknown BT protocol");
1996 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001998 }
1999 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002000#endif
2001
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002002#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002003 case AF_PACKET:
2004 {
2005 *len_ret = sizeof (struct sockaddr_ll);
2006 return 1;
2007 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002008#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002009
Christian Heimes043d6f62008-01-07 17:19:16 +00002010#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002011 case AF_TIPC:
2012 {
2013 *len_ret = sizeof (struct sockaddr_tipc);
2014 return 1;
2015 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002016#endif
2017
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002018#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002019 case AF_CAN:
2020 {
2021 *len_ret = sizeof (struct sockaddr_can);
2022 return 1;
2023 }
2024#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002025
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002026#ifdef PF_SYSTEM
2027 case PF_SYSTEM:
2028 switch(s->sock_proto) {
2029#ifdef SYSPROTO_CONTROL
2030 case SYSPROTO_CONTROL:
2031 *len_ret = sizeof (struct sockaddr_ctl);
2032 return 1;
2033#endif
2034 default:
2035 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2036 "unknown PF_SYSTEM protocol");
2037 return 0;
2038 }
2039#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002044 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002048}
2049
2050
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002051/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2052 Currently, these methods are only compiled if the RFC 2292/3542
2053 CMSG_LEN() macro is available. Older systems seem to have used
2054 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2055 it may be possible to define CMSG_LEN() that way if it's not
2056 provided. Some architectures might need extra padding after the
2057 cmsghdr, however, and CMSG_LEN() would have to take account of
2058 this. */
2059#ifdef CMSG_LEN
2060/* If length is in range, set *result to CMSG_LEN(length) and return
2061 true; otherwise, return false. */
2062static int
2063get_CMSG_LEN(size_t length, size_t *result)
2064{
2065 size_t tmp;
2066
2067 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2068 return 0;
2069 tmp = CMSG_LEN(length);
2070 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2071 return 0;
2072 *result = tmp;
2073 return 1;
2074}
2075
2076#ifdef CMSG_SPACE
2077/* If length is in range, set *result to CMSG_SPACE(length) and return
2078 true; otherwise, return false. */
2079static int
2080get_CMSG_SPACE(size_t length, size_t *result)
2081{
2082 size_t tmp;
2083
2084 /* Use CMSG_SPACE(1) here in order to take account of the padding
2085 necessary before *and* after the data. */
2086 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2087 return 0;
2088 tmp = CMSG_SPACE(length);
2089 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2090 return 0;
2091 *result = tmp;
2092 return 1;
2093}
2094#endif
2095
2096/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2097 pointer in msg->msg_control with at least "space" bytes after it,
2098 and its cmsg_len member inside the buffer. */
2099static int
2100cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2101{
2102 size_t cmsg_offset;
2103 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2104 sizeof(cmsgh->cmsg_len));
2105
Charles-François Natali466517d2011-08-28 18:23:43 +02002106 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002107 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002108 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002109 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2110 annoying under OS X as it's unsigned there and so it triggers a
2111 tautological comparison warning under Clang when compared against 0.
2112 Since the check is valid on other platforms, silence the warning under
2113 Clang. */
2114 #ifdef __clang__
2115 #pragma clang diagnostic push
2116 #pragma clang diagnostic ignored "-Wtautological-compare"
2117 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002118 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002119 #pragma GCC diagnostic push
2120 #pragma GCC diagnostic ignored "-Wtype-limits"
2121 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002122 if (msg->msg_controllen < 0)
2123 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002124 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002125 #pragma GCC diagnostic pop
2126 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002127 #ifdef __clang__
2128 #pragma clang diagnostic pop
2129 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002130 if (space < cmsg_len_end)
2131 space = cmsg_len_end;
2132 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2133 return (cmsg_offset <= (size_t)-1 - space &&
2134 cmsg_offset + space <= msg->msg_controllen);
2135}
2136
2137/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2138 *space to number of bytes following it in the buffer and return
2139 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2140 msg->msg_controllen are valid. */
2141static int
2142get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2143{
2144 size_t data_offset;
2145 char *data_ptr;
2146
2147 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2148 return 0;
2149 data_offset = data_ptr - (char *)msg->msg_control;
2150 if (data_offset > msg->msg_controllen)
2151 return 0;
2152 *space = msg->msg_controllen - data_offset;
2153 return 1;
2154}
2155
2156/* If cmsgh is invalid or not contained in the buffer pointed to by
2157 msg->msg_control, return -1. If cmsgh is valid and its associated
2158 data is entirely contained in the buffer, set *data_len to the
2159 length of the associated data and return 0. If only part of the
2160 associated data is contained in the buffer but cmsgh is otherwise
2161 valid, set *data_len to the length contained in the buffer and
2162 return 1. */
2163static int
2164get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2165{
2166 size_t space, cmsg_data_len;
2167
2168 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2169 cmsgh->cmsg_len < CMSG_LEN(0))
2170 return -1;
2171 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2172 if (!get_cmsg_data_space(msg, cmsgh, &space))
2173 return -1;
2174 if (space >= cmsg_data_len) {
2175 *data_len = cmsg_data_len;
2176 return 0;
2177 }
2178 *data_len = space;
2179 return 1;
2180}
2181#endif /* CMSG_LEN */
2182
2183
Victor Stinner31bf2d52015-04-01 21:57:09 +02002184struct sock_accept {
2185 socklen_t *addrlen;
2186 sock_addr_t *addrbuf;
2187 SOCKET_T result;
2188};
2189
2190#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2191/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2192static int accept4_works = -1;
2193#endif
2194
2195static int
2196sock_accept_impl(PySocketSockObject *s, void *data)
2197{
2198 struct sock_accept *ctx = data;
2199
2200#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2201 if (accept4_works != 0) {
2202 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2203 SOCK_CLOEXEC);
2204 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2205 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2206 accept4_works = (errno != ENOSYS);
2207 }
2208 }
2209 if (accept4_works == 0)
2210 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2211#else
2212 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2213#endif
2214 return (ctx->result >= 0);
2215}
2216
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002217/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002218
Guido van Rossum73624e91994-10-10 17:59:00 +00002219static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002220sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002223 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 socklen_t addrlen;
2225 PyObject *sock = NULL;
2226 PyObject *addr = NULL;
2227 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002228 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002230 if (!getsockaddrlen(s, &addrlen))
2231 return NULL;
2232 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 if (!IS_SELECTABLE(s))
2235 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002236
Victor Stinner31bf2d52015-04-01 21:57:09 +02002237 ctx.addrlen = &addrlen;
2238 ctx.addrbuf = &addrbuf;
2239 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002241 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002242
Victor Stinnerdaf45552013-08-28 00:53:59 +02002243#ifdef MS_WINDOWS
2244 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2245 PyErr_SetFromWindowsErr(0);
2246 SOCKETCLOSE(newfd);
2247 goto finally;
2248 }
2249#else
2250
2251#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2252 if (!accept4_works)
2253#endif
2254 {
2255 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2256 SOCKETCLOSE(newfd);
2257 goto finally;
2258 }
2259 }
2260#endif
2261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 sock = PyLong_FromSocket_t(newfd);
2263 if (sock == NULL) {
2264 SOCKETCLOSE(newfd);
2265 goto finally;
2266 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2269 addrlen, s->sock_proto);
2270 if (addr == NULL)
2271 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002273 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002274
Guido van Rossum67f7a382002-06-06 21:08:16 +00002275finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002276 Py_XDECREF(sock);
2277 Py_XDECREF(addr);
2278 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002279}
2280
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002281PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002282"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002283\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002284Wait for an incoming connection. Return a new socket file descriptor\n\
2285representing the connection, and the address of the client.\n\
2286For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002287
Guido van Rossum11ba0942002-06-13 15:07:44 +00002288/* s.setblocking(flag) method. Argument:
2289 False -- non-blocking mode; same as settimeout(0)
2290 True -- blocking mode; same as settimeout(None)
2291*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002292
Guido van Rossum73624e91994-10-10 17:59:00 +00002293static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002294sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002295{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002296 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 block = PyLong_AsLong(arg);
2299 if (block == -1 && PyErr_Occurred())
2300 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002301
Victor Stinner9001d802015-04-06 23:06:01 +02002302 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 Py_INCREF(Py_None);
2306 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002307}
Guido van Rossume4485b01994-09-07 14:32:49 +00002308
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002309PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002310"setblocking(flag)\n\
2311\n\
2312Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002313setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002314setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002315
Victor Stinner71694d52015-03-28 01:18:54 +01002316static int
2317socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2318{
2319#ifdef MS_WINDOWS
2320 struct timeval tv;
2321#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002322#ifndef HAVE_POLL
2323 _PyTime_t ms;
2324#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002325 int overflow = 0;
2326
2327 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002328 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002329 return 0;
2330 }
2331
Victor Stinner869e1772015-03-30 03:49:14 +02002332 if (_PyTime_FromSecondsObject(timeout,
2333 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002334 return -1;
2335
2336 if (*timeout < 0) {
2337 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2338 return -1;
2339 }
2340
2341#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002342 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002343#endif
2344#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002345 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2346 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002347#endif
2348 if (overflow) {
2349 PyErr_SetString(PyExc_OverflowError,
2350 "timeout doesn't fit into C timeval");
2351 return -1;
2352 }
2353
2354 return 0;
2355}
2356
Guido van Rossum11ba0942002-06-13 15:07:44 +00002357/* s.settimeout(timeout) method. Argument:
2358 None -- no timeout, blocking mode; same as setblocking(True)
2359 0.0 -- non-blocking mode; same as setblocking(False)
2360 > 0 -- timeout mode; operations time out after timeout seconds
2361 < 0 -- illegal; raises an exception
2362*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002363static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002364sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002365{
Victor Stinner71694d52015-03-28 01:18:54 +01002366 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002367
Victor Stinner71694d52015-03-28 01:18:54 +01002368 if (socket_parse_timeout(&timeout, arg) < 0)
2369 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002371 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002372 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002374 Py_INCREF(Py_None);
2375 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002376}
2377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002378PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002379"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002380\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002381Set a timeout on socket operations. 'timeout' can be a float,\n\
2382giving in seconds, or None. Setting a timeout of None disables\n\
2383the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002384Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002385
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002386/* s.gettimeout() method.
2387 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002388static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002389sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002390{
Victor Stinner71694d52015-03-28 01:18:54 +01002391 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002392 Py_INCREF(Py_None);
2393 return Py_None;
2394 }
Victor Stinner71694d52015-03-28 01:18:54 +01002395 else {
2396 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2397 return PyFloat_FromDouble(seconds);
2398 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399}
2400
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002401PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002402"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002403\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002404Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002405operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002406operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002407
Guido van Rossumaee08791992-09-08 09:05:33 +00002408/* s.setsockopt() method.
2409 With an integer third argument, sets an integer option.
2410 With a string third argument, sets an option from a buffer;
2411 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002412
Guido van Rossum73624e91994-10-10 17:59:00 +00002413static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002414sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002415{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 int level;
2417 int optname;
2418 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002419 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002422 if (PyArg_ParseTuple(args, "iii:setsockopt",
2423 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002424 res = setsockopt(s->sock_fd, level, optname,
2425 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002426 }
2427 else {
2428 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002429 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2430 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002431 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002432 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2433 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002434 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (res < 0)
2436 return s->errorhandler();
2437 Py_INCREF(Py_None);
2438 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002439}
2440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002441PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002442"setsockopt(level, option, value)\n\
2443\n\
2444Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002445The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002446
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002447
Guido van Rossumaee08791992-09-08 09:05:33 +00002448/* s.getsockopt() method.
2449 With two arguments, retrieves an integer option.
2450 With a third integer argument, retrieves a string buffer of that size;
2451 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002452
Guido van Rossum73624e91994-10-10 17:59:00 +00002453static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002454sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002455{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 int level;
2457 int optname;
2458 int res;
2459 PyObject *buf;
2460 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002462 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2463 &level, &optname, &buflen))
2464 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 if (buflen == 0) {
2467 int flag = 0;
2468 socklen_t flagsize = sizeof flag;
2469 res = getsockopt(s->sock_fd, level, optname,
2470 (void *)&flag, &flagsize);
2471 if (res < 0)
2472 return s->errorhandler();
2473 return PyLong_FromLong(flag);
2474 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002476 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002477 "getsockopt buflen out of range");
2478 return NULL;
2479 }
2480 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2481 if (buf == NULL)
2482 return NULL;
2483 res = getsockopt(s->sock_fd, level, optname,
2484 (void *)PyBytes_AS_STRING(buf), &buflen);
2485 if (res < 0) {
2486 Py_DECREF(buf);
2487 return s->errorhandler();
2488 }
2489 _PyBytes_Resize(&buf, buflen);
2490 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002491}
2492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002494"getsockopt(level, option[, buffersize]) -> value\n\
2495\n\
2496Get a socket option. See the Unix manual for level and option.\n\
2497If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002498string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002499
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002500
Fred Drake728819a2000-07-01 03:40:12 +00002501/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002502
Guido van Rossum73624e91994-10-10 17:59:00 +00002503static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002504sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002505{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 sock_addr_t addrbuf;
2507 int addrlen;
2508 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002510 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2511 return NULL;
2512 Py_BEGIN_ALLOW_THREADS
2513 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2514 Py_END_ALLOW_THREADS
2515 if (res < 0)
2516 return s->errorhandler();
2517 Py_INCREF(Py_None);
2518 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002519}
2520
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002521PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002522"bind(address)\n\
2523\n\
2524Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002525pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002526sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002527
Guido van Rossum30a685f1991-06-27 15:51:29 +00002528
2529/* s.close() method.
2530 Set the file descriptor to -1 so operations tried subsequently
2531 will surely fail. */
2532
Guido van Rossum73624e91994-10-10 17:59:00 +00002533static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002534sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002537
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002538 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2539 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2540 * for more details.
2541 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002542 if ((fd = s->sock_fd) != -1) {
2543 s->sock_fd = -1;
2544 Py_BEGIN_ALLOW_THREADS
2545 (void) SOCKETCLOSE(fd);
2546 Py_END_ALLOW_THREADS
2547 }
2548 Py_INCREF(Py_None);
2549 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002550}
2551
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002552PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002553"close()\n\
2554\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002555Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002556
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002557static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002558sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002559{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002560 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002561 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002562 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002563}
2564
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002565PyDoc_STRVAR(detach_doc,
2566"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002567\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002568Close the socket object without closing the underlying file descriptor.\n\
2569The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002570can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002571
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002572static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002573sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002574{
Victor Stinner81c41db2015-04-02 11:50:57 +02002575 int err;
2576 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002577
Victor Stinner81c41db2015-04-02 11:50:57 +02002578 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2579 /* getsockopt() failed */
2580 return 0;
2581 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002582
Victor Stinner81c41db2015-04-02 11:50:57 +02002583 if (err == EISCONN)
2584 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002585 if (err != 0) {
2586 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2587 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002588 return 0;
2589 }
2590 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002591}
2592
2593static int
2594internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2595 int raise)
2596{
2597 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002598
2599 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002601 Py_END_ALLOW_THREADS
2602
Victor Stinner70a46f62015-03-31 22:03:59 +02002603 if (!res) {
2604 /* connect() succeeded, the socket is connected */
2605 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002606 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002607
Victor Stinner81c41db2015-04-02 11:50:57 +02002608 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002609
Victor Stinner81c41db2015-04-02 11:50:57 +02002610 /* save error, PyErr_CheckSignals() can replace it */
2611 err = GET_SOCK_ERROR;
2612 if (CHECK_ERRNO(EINTR)) {
2613 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002614 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002615
2616 /* Issue #23618: when connect() fails with EINTR, the connection is
2617 running asynchronously.
2618
2619 If the socket is blocking or has a timeout, wait until the
2620 connection completes, fails or timed out using select(), and then
2621 get the connection status using getsockopt(SO_ERROR).
2622
2623 If the socket is non-blocking, raise InterruptedError. The caller is
2624 responsible to wait until the connection completes, fails or timed
2625 out (it's the case in asyncio for example). */
2626 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2627 }
2628 else {
2629 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2630 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002631 }
2632
Victor Stinner81c41db2015-04-02 11:50:57 +02002633 if (!wait_connect) {
2634 if (raise) {
2635 /* restore error, maybe replaced by PyErr_CheckSignals() */
2636 SET_SOCK_ERROR(err);
2637 s->errorhandler();
2638 return -1;
2639 }
2640 else
2641 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002642 }
2643
Victor Stinner81c41db2015-04-02 11:50:57 +02002644 if (raise) {
2645 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002646 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2647 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002648 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002649 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002650 else {
2651 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002652 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2653 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002654 return err;
2655 }
2656 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002657}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002658
Fred Drake728819a2000-07-01 03:40:12 +00002659/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002660
Guido van Rossum73624e91994-10-10 17:59:00 +00002661static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002662sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002663{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 sock_addr_t addrbuf;
2665 int addrlen;
2666 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002667
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002668 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2669 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002670
Victor Stinner81c41db2015-04-02 11:50:57 +02002671 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002672 if (res < 0)
2673 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002674
Victor Stinneree699e92015-03-31 21:28:42 +02002675 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002676}
2677
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002678PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002679"connect(address)\n\
2680\n\
2681Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002682is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002683
Guido van Rossum30a685f1991-06-27 15:51:29 +00002684
Fred Drake728819a2000-07-01 03:40:12 +00002685/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002686
2687static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002688sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002690 sock_addr_t addrbuf;
2691 int addrlen;
2692 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002694 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2695 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002696
Victor Stinner81c41db2015-04-02 11:50:57 +02002697 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002698 if (res < 0)
2699 return NULL;
2700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002702}
2703
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002704PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002705"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002706\n\
2707This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002709
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002710
Guido van Rossumed233a51992-06-23 09:07:03 +00002711/* s.fileno() method */
2712
Guido van Rossum73624e91994-10-10 17:59:00 +00002713static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002714sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002716 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002717}
2718
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002719PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002720"fileno() -> integer\n\
2721\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002722Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002723
Guido van Rossumed233a51992-06-23 09:07:03 +00002724
Guido van Rossumc89705d1992-11-26 08:54:07 +00002725/* s.getsockname() method */
2726
Guido van Rossum73624e91994-10-10 17:59:00 +00002727static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002728sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002730 sock_addr_t addrbuf;
2731 int res;
2732 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002733
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002734 if (!getsockaddrlen(s, &addrlen))
2735 return NULL;
2736 memset(&addrbuf, 0, addrlen);
2737 Py_BEGIN_ALLOW_THREADS
2738 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2739 Py_END_ALLOW_THREADS
2740 if (res < 0)
2741 return s->errorhandler();
2742 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2743 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002744}
2745
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002746PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002747"getsockname() -> address info\n\
2748\n\
2749Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002750info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002751
Guido van Rossumc89705d1992-11-26 08:54:07 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002754/* s.getpeername() method */
2755
Guido van Rossum73624e91994-10-10 17:59:00 +00002756static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002757sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002758{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759 sock_addr_t addrbuf;
2760 int res;
2761 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002763 if (!getsockaddrlen(s, &addrlen))
2764 return NULL;
2765 memset(&addrbuf, 0, addrlen);
2766 Py_BEGIN_ALLOW_THREADS
2767 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2768 Py_END_ALLOW_THREADS
2769 if (res < 0)
2770 return s->errorhandler();
2771 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2772 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002773}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002774
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002775PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002776"getpeername() -> address info\n\
2777\n\
2778Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002779info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002780
Guido van Rossumb6775db1994-08-01 11:34:53 +00002781#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002782
2783
Guido van Rossum30a685f1991-06-27 15:51:29 +00002784/* s.listen(n) method */
2785
Guido van Rossum73624e91994-10-10 17:59:00 +00002786static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002787sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002788{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002789 /* We try to choose a default backlog high enough to avoid connection drops
2790 * for common workloads, yet not too high to limit resource usage. */
2791 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002793
Charles-François Natali644b8f52014-05-22 19:45:39 +01002794 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002797 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002798 /* To avoid problems on systems that don't allow a negative backlog
2799 * (which doesn't make sense anyway) we force a minimum value of 0. */
2800 if (backlog < 0)
2801 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 res = listen(s->sock_fd, backlog);
2803 Py_END_ALLOW_THREADS
2804 if (res < 0)
2805 return s->errorhandler();
2806 Py_INCREF(Py_None);
2807 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002808}
2809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002810PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002811"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002812\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002813Enable a server to accept connections. If backlog is specified, it must be\n\
2814at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002815unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002816connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002817
Victor Stinner31bf2d52015-04-01 21:57:09 +02002818struct sock_recv {
2819 char *cbuf;
2820 Py_ssize_t len;
2821 int flags;
2822 Py_ssize_t result;
2823};
2824
2825static int
2826sock_recv_impl(PySocketSockObject *s, void *data)
2827{
2828 struct sock_recv *ctx = data;
2829
2830#ifdef MS_WINDOWS
2831 if (ctx->len > INT_MAX)
2832 ctx->len = INT_MAX;
2833 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2834#else
2835 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2836#endif
2837 return (ctx->result >= 0);
2838}
2839
Guido van Rossum82a5c661998-07-07 20:45:43 +00002840
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002842 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002843 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002844 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002845 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846 * also possible that we return a number of bytes smaller than the request
2847 * bytes.
2848 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002849
Antoine Pitrou19467d22010-08-17 19:33:30 +00002850static Py_ssize_t
2851sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002852{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002853 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 if (!IS_SELECTABLE(s)) {
2856 select_error();
2857 return -1;
2858 }
2859 if (len == 0) {
2860 /* If 0 bytes were requested, do nothing. */
2861 return 0;
2862 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002863
Victor Stinner31bf2d52015-04-01 21:57:09 +02002864 ctx.cbuf = cbuf;
2865 ctx.len = len;
2866 ctx.flags = flags;
2867 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002869
2870 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002871}
2872
Guido van Rossum48a680c2001-03-02 06:34:14 +00002873
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002874/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002875
Guido van Rossum73624e91994-10-10 17:59:00 +00002876static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002877sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002878{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002879 Py_ssize_t recvlen, outlen;
2880 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002881 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002882
Antoine Pitrou19467d22010-08-17 19:33:30 +00002883 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 if (recvlen < 0) {
2887 PyErr_SetString(PyExc_ValueError,
2888 "negative buffersize in recv");
2889 return NULL;
2890 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 /* Allocate a new string. */
2893 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2894 if (buf == NULL)
2895 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002896
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002897 /* Call the guts */
2898 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2899 if (outlen < 0) {
2900 /* An error occurred, release the string and return an
2901 error. */
2902 Py_DECREF(buf);
2903 return NULL;
2904 }
2905 if (outlen != recvlen) {
2906 /* We did not read as many bytes as we anticipated, resize the
2907 string if possible and be successful. */
2908 _PyBytes_Resize(&buf, outlen);
2909 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002910
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002911 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002912}
2913
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002915"recv(buffersize[, flags]) -> data\n\
2916\n\
2917Receive up to buffersize bytes from the socket. For the optional flags\n\
2918argument, see the Unix manual. When no data is available, block until\n\
2919at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002920the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002921
Guido van Rossum30a685f1991-06-27 15:51:29 +00002922
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002923/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002924
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002926sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002929
Antoine Pitrou19467d22010-08-17 19:33:30 +00002930 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 Py_buffer pbuf;
2932 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002933 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002936 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 &pbuf, &recvlen, &flags))
2938 return NULL;
2939 buf = pbuf.buf;
2940 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 if (recvlen < 0) {
2943 PyBuffer_Release(&pbuf);
2944 PyErr_SetString(PyExc_ValueError,
2945 "negative buffersize in recv_into");
2946 return NULL;
2947 }
2948 if (recvlen == 0) {
2949 /* If nbytes was not specified, use the buffer's length */
2950 recvlen = buflen;
2951 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 /* Check if the buffer is large enough */
2954 if (buflen < recvlen) {
2955 PyBuffer_Release(&pbuf);
2956 PyErr_SetString(PyExc_ValueError,
2957 "buffer too small for requested bytes");
2958 return NULL;
2959 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002961 /* Call the guts */
2962 readlen = sock_recv_guts(s, buf, recvlen, flags);
2963 if (readlen < 0) {
2964 /* Return an error. */
2965 PyBuffer_Release(&pbuf);
2966 return NULL;
2967 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002969 PyBuffer_Release(&pbuf);
2970 /* Return the number of bytes read. Note that we do not do anything
2971 special here in the case that readlen < recvlen. */
2972 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002973}
2974
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002975PyDoc_STRVAR(recv_into_doc,
2976"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002977\n\
2978A version of recv() that stores its data into a buffer rather than creating \n\
2979a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2980is not specified (or 0), receive up to the size available in the given buffer.\n\
2981\n\
2982See recv() for documentation about the flags.");
2983
Victor Stinner31bf2d52015-04-01 21:57:09 +02002984struct sock_recvfrom {
2985 char* cbuf;
2986 Py_ssize_t len;
2987 int flags;
2988 socklen_t *addrlen;
2989 sock_addr_t *addrbuf;
2990 Py_ssize_t result;
2991};
2992
2993static int
2994sock_recvfrom_impl(PySocketSockObject *s, void *data)
2995{
2996 struct sock_recvfrom *ctx = data;
2997
2998 memset(ctx->addrbuf, 0, *ctx->addrlen);
2999
3000#ifdef MS_WINDOWS
3001 if (ctx->len > INT_MAX)
3002 ctx->len = INT_MAX;
3003 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3004 SAS2SA(ctx->addrbuf), ctx->addrlen);
3005#else
3006 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3007 SAS2SA(ctx->addrbuf), ctx->addrlen);
3008#endif
3009 return (ctx->result >= 0);
3010}
3011
Thomas Wouters477c8d52006-05-27 19:21:47 +00003012
3013/*
Christian Heimes99170a52007-12-19 02:07:34 +00003014 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3015 * into a char buffer. If you have any inc/def ref to do to the objects that
3016 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003017 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003018 * that it is also possible that we return a number of bytes smaller than the
3019 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003020 *
3021 * 'addr' is a return value for the address object. Note that you must decref
3022 * it yourself.
3023 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003024static Py_ssize_t
3025sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003029 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003030 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 if (!getsockaddrlen(s, &addrlen))
3035 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003037 if (!IS_SELECTABLE(s)) {
3038 select_error();
3039 return -1;
3040 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003041
Victor Stinner31bf2d52015-04-01 21:57:09 +02003042 ctx.cbuf = cbuf;
3043 ctx.len = len;
3044 ctx.flags = flags;
3045 ctx.addrbuf = &addrbuf;
3046 ctx.addrlen = &addrlen;
3047 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003049
Victor Stinner31bf2d52015-04-01 21:57:09 +02003050 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3051 s->sock_proto);
3052 if (*addr == NULL)
3053 return -1;
3054
3055 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003056}
3057
3058/* s.recvfrom(nbytes [,flags]) method */
3059
3060static PyObject *
3061sock_recvfrom(PySocketSockObject *s, PyObject *args)
3062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 PyObject *buf = NULL;
3064 PyObject *addr = NULL;
3065 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003066 int flags = 0;
3067 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003068
Antoine Pitrou19467d22010-08-17 19:33:30 +00003069 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 if (recvlen < 0) {
3073 PyErr_SetString(PyExc_ValueError,
3074 "negative buffersize in recvfrom");
3075 return NULL;
3076 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3079 if (buf == NULL)
3080 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3083 recvlen, flags, &addr);
3084 if (outlen < 0) {
3085 goto finally;
3086 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 if (outlen != recvlen) {
3089 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003090 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003091 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003092 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 goto finally;
3094 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003096 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003097
3098finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 Py_XDECREF(buf);
3100 Py_XDECREF(addr);
3101 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003102}
3103
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003104PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003105"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3106\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003107Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003108
Thomas Wouters477c8d52006-05-27 19:21:47 +00003109
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003110/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003111
3112static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003113sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003115 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003116
Antoine Pitrou19467d22010-08-17 19:33:30 +00003117 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003118 Py_buffer pbuf;
3119 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003120 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003123
Antoine Pitrou19467d22010-08-17 19:33:30 +00003124 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 kwlist, &pbuf,
3126 &recvlen, &flags))
3127 return NULL;
3128 buf = pbuf.buf;
3129 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003130
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 if (recvlen < 0) {
3132 PyBuffer_Release(&pbuf);
3133 PyErr_SetString(PyExc_ValueError,
3134 "negative buffersize in recvfrom_into");
3135 return NULL;
3136 }
3137 if (recvlen == 0) {
3138 /* If nbytes was not specified, use the buffer's length */
3139 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003140 } else if (recvlen > buflen) {
3141 PyBuffer_Release(&pbuf);
3142 PyErr_SetString(PyExc_ValueError,
3143 "nbytes is greater than the length of the buffer");
3144 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003145 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003147 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3148 if (readlen < 0) {
3149 PyBuffer_Release(&pbuf);
3150 /* Return an error */
3151 Py_XDECREF(addr);
3152 return NULL;
3153 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003155 PyBuffer_Release(&pbuf);
3156 /* Return the number of bytes read and the address. Note that we do
3157 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003158 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003159}
3160
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003161PyDoc_STRVAR(recvfrom_into_doc,
3162"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003163\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003164Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003165
Victor Stinner35bee932015-04-02 12:28:07 +02003166/* The sendmsg() and recvmsg[_into]() methods require a working
3167 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3168#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003169struct sock_recvmsg {
3170 struct msghdr *msg;
3171 int flags;
3172 ssize_t result;
3173};
3174
3175static int
3176sock_recvmsg_impl(PySocketSockObject *s, void *data)
3177{
3178 struct sock_recvmsg *ctx = data;
3179
3180 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3181 return (ctx->result >= 0);
3182}
3183
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003184/*
3185 * Call recvmsg() with the supplied iovec structures, flags, and
3186 * ancillary data buffer size (controllen). Returns the tuple return
3187 * value for recvmsg() or recvmsg_into(), with the first item provided
3188 * by the supplied makeval() function. makeval() will be called with
3189 * the length read and makeval_data as arguments, and must return a
3190 * new reference (which will be decrefed if there is a subsequent
3191 * error). On error, closes any file descriptors received via
3192 * SCM_RIGHTS.
3193 */
3194static PyObject *
3195sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3196 int flags, Py_ssize_t controllen,
3197 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3198{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003199 sock_addr_t addrbuf;
3200 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003201 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003202 PyObject *cmsg_list = NULL, *retval = NULL;
3203 void *controlbuf = NULL;
3204 struct cmsghdr *cmsgh;
3205 size_t cmsgdatalen = 0;
3206 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003207 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003208
3209 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3210 ignored" when the socket is connected (Linux fills them in
3211 anyway for AF_UNIX sockets at least). Normally msg_namelen
3212 seems to be set to 0 if there's no address, but try to
3213 initialize msg_name to something that won't be mistaken for a
3214 real address if that doesn't happen. */
3215 if (!getsockaddrlen(s, &addrbuflen))
3216 return NULL;
3217 memset(&addrbuf, 0, addrbuflen);
3218 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3219
3220 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3221 PyErr_SetString(PyExc_ValueError,
3222 "invalid ancillary data buffer length");
3223 return NULL;
3224 }
3225 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3226 return PyErr_NoMemory();
3227
3228 /* Make the system call. */
3229 if (!IS_SELECTABLE(s)) {
3230 select_error();
3231 goto finally;
3232 }
3233
Victor Stinner31bf2d52015-04-01 21:57:09 +02003234 msg.msg_name = SAS2SA(&addrbuf);
3235 msg.msg_namelen = addrbuflen;
3236 msg.msg_iov = iov;
3237 msg.msg_iovlen = iovlen;
3238 msg.msg_control = controlbuf;
3239 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003240
Victor Stinner31bf2d52015-04-01 21:57:09 +02003241 ctx.msg = &msg;
3242 ctx.flags = flags;
3243 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003244 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003245
3246 /* Make list of (level, type, data) tuples from control messages. */
3247 if ((cmsg_list = PyList_New(0)) == NULL)
3248 goto err_closefds;
3249 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3250 implementations didn't do so. */
3251 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3252 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3253 PyObject *bytes, *tuple;
3254 int tmp;
3255
3256 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3257 if (cmsg_status != 0) {
3258 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3259 "received malformed or improperly-truncated "
3260 "ancillary data", 1) == -1)
3261 goto err_closefds;
3262 }
3263 if (cmsg_status < 0)
3264 break;
3265 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003266 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003267 goto err_closefds;
3268 }
3269
3270 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3271 cmsgdatalen);
3272 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3273 (int)cmsgh->cmsg_type, bytes);
3274 if (tuple == NULL)
3275 goto err_closefds;
3276 tmp = PyList_Append(cmsg_list, tuple);
3277 Py_DECREF(tuple);
3278 if (tmp != 0)
3279 goto err_closefds;
3280
3281 if (cmsg_status != 0)
3282 break;
3283 }
3284
3285 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003286 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003287 cmsg_list,
3288 (int)msg.msg_flags,
3289 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3290 ((msg.msg_namelen > addrbuflen) ?
3291 addrbuflen : msg.msg_namelen),
3292 s->sock_proto));
3293 if (retval == NULL)
3294 goto err_closefds;
3295
3296finally:
3297 Py_XDECREF(cmsg_list);
3298 PyMem_Free(controlbuf);
3299 return retval;
3300
3301err_closefds:
3302#ifdef SCM_RIGHTS
3303 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3304 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3305 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3306 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3307 if (cmsg_status < 0)
3308 break;
3309 if (cmsgh->cmsg_level == SOL_SOCKET &&
3310 cmsgh->cmsg_type == SCM_RIGHTS) {
3311 size_t numfds;
3312 int *fdp;
3313
3314 numfds = cmsgdatalen / sizeof(int);
3315 fdp = (int *)CMSG_DATA(cmsgh);
3316 while (numfds-- > 0)
3317 close(*fdp++);
3318 }
3319 if (cmsg_status != 0)
3320 break;
3321 }
3322#endif /* SCM_RIGHTS */
3323 goto finally;
3324}
3325
3326
3327static PyObject *
3328makeval_recvmsg(ssize_t received, void *data)
3329{
3330 PyObject **buf = data;
3331
3332 if (received < PyBytes_GET_SIZE(*buf))
3333 _PyBytes_Resize(buf, received);
3334 Py_XINCREF(*buf);
3335 return *buf;
3336}
3337
3338/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3339
3340static PyObject *
3341sock_recvmsg(PySocketSockObject *s, PyObject *args)
3342{
3343 Py_ssize_t bufsize, ancbufsize = 0;
3344 int flags = 0;
3345 struct iovec iov;
3346 PyObject *buf = NULL, *retval = NULL;
3347
3348 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3349 return NULL;
3350
3351 if (bufsize < 0) {
3352 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3353 return NULL;
3354 }
3355 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3356 return NULL;
3357 iov.iov_base = PyBytes_AS_STRING(buf);
3358 iov.iov_len = bufsize;
3359
3360 /* Note that we're passing a pointer to *our pointer* to the bytes
3361 object here (&buf); makeval_recvmsg() may incref the object, or
3362 deallocate it and set our pointer to NULL. */
3363 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3364 &makeval_recvmsg, &buf);
3365 Py_XDECREF(buf);
3366 return retval;
3367}
3368
3369PyDoc_STRVAR(recvmsg_doc,
3370"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3371\n\
3372Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3373socket. The ancbufsize argument sets the size in bytes of the\n\
3374internal buffer used to receive the ancillary data; it defaults to 0,\n\
3375meaning that no ancillary data will be received. Appropriate buffer\n\
3376sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3377CMSG_LEN(), and items which do not fit into the buffer might be\n\
3378truncated or discarded. The flags argument defaults to 0 and has the\n\
3379same meaning as for recv().\n\
3380\n\
3381The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3382The data item is a bytes object holding the non-ancillary data\n\
3383received. The ancdata item is a list of zero or more tuples\n\
3384(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3385(control messages) received: cmsg_level and cmsg_type are integers\n\
3386specifying the protocol level and protocol-specific type respectively,\n\
3387and cmsg_data is a bytes object holding the associated data. The\n\
3388msg_flags item is the bitwise OR of various flags indicating\n\
3389conditions on the received message; see your system documentation for\n\
3390details. If the receiving socket is unconnected, address is the\n\
3391address of the sending socket, if available; otherwise, its value is\n\
3392unspecified.\n\
3393\n\
3394If recvmsg() raises an exception after the system call returns, it\n\
3395will first attempt to close any file descriptors received via the\n\
3396SCM_RIGHTS mechanism.");
3397
3398
3399static PyObject *
3400makeval_recvmsg_into(ssize_t received, void *data)
3401{
3402 return PyLong_FromSsize_t(received);
3403}
3404
3405/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3406
3407static PyObject *
3408sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3409{
3410 Py_ssize_t ancbufsize = 0;
3411 int flags = 0;
3412 struct iovec *iovs = NULL;
3413 Py_ssize_t i, nitems, nbufs = 0;
3414 Py_buffer *bufs = NULL;
3415 PyObject *buffers_arg, *fast, *retval = NULL;
3416
3417 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3418 &buffers_arg, &ancbufsize, &flags))
3419 return NULL;
3420
3421 if ((fast = PySequence_Fast(buffers_arg,
3422 "recvmsg_into() argument 1 must be an "
3423 "iterable")) == NULL)
3424 return NULL;
3425 nitems = PySequence_Fast_GET_SIZE(fast);
3426 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003427 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003428 goto finally;
3429 }
3430
3431 /* Fill in an iovec for each item, and save the Py_buffer
3432 structs to release afterwards. */
3433 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3434 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3435 PyErr_NoMemory();
3436 goto finally;
3437 }
3438 for (; nbufs < nitems; nbufs++) {
3439 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3440 "w*;recvmsg_into() argument 1 must be an iterable "
3441 "of single-segment read-write buffers",
3442 &bufs[nbufs]))
3443 goto finally;
3444 iovs[nbufs].iov_base = bufs[nbufs].buf;
3445 iovs[nbufs].iov_len = bufs[nbufs].len;
3446 }
3447
3448 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3449 &makeval_recvmsg_into, NULL);
3450finally:
3451 for (i = 0; i < nbufs; i++)
3452 PyBuffer_Release(&bufs[i]);
3453 PyMem_Free(bufs);
3454 PyMem_Free(iovs);
3455 Py_DECREF(fast);
3456 return retval;
3457}
3458
3459PyDoc_STRVAR(recvmsg_into_doc,
3460"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3461\n\
3462Receive normal data and ancillary data from the socket, scattering the\n\
3463non-ancillary data into a series of buffers. The buffers argument\n\
3464must be an iterable of objects that export writable buffers\n\
3465(e.g. bytearray objects); these will be filled with successive chunks\n\
3466of the non-ancillary data until it has all been written or there are\n\
3467no more buffers. The ancbufsize argument sets the size in bytes of\n\
3468the internal buffer used to receive the ancillary data; it defaults to\n\
34690, meaning that no ancillary data will be received. Appropriate\n\
3470buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3471or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3472truncated or discarded. The flags argument defaults to 0 and has the\n\
3473same meaning as for recv().\n\
3474\n\
3475The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3476The nbytes item is the total number of bytes of non-ancillary data\n\
3477written into the buffers. The ancdata item is a list of zero or more\n\
3478tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3479data (control messages) received: cmsg_level and cmsg_type are\n\
3480integers specifying the protocol level and protocol-specific type\n\
3481respectively, and cmsg_data is a bytes object holding the associated\n\
3482data. The msg_flags item is the bitwise OR of various flags\n\
3483indicating conditions on the received message; see your system\n\
3484documentation for details. If the receiving socket is unconnected,\n\
3485address is the address of the sending socket, if available; otherwise,\n\
3486its value is unspecified.\n\
3487\n\
3488If recvmsg_into() raises an exception after the system call returns,\n\
3489it will first attempt to close any file descriptors received via the\n\
3490SCM_RIGHTS mechanism.");
3491#endif /* CMSG_LEN */
3492
3493
Victor Stinner31bf2d52015-04-01 21:57:09 +02003494struct sock_send {
3495 char *buf;
3496 Py_ssize_t len;
3497 int flags;
3498 Py_ssize_t result;
3499};
3500
3501static int
3502sock_send_impl(PySocketSockObject *s, void *data)
3503{
3504 struct sock_send *ctx = data;
3505
3506#ifdef MS_WINDOWS
3507 if (ctx->len > INT_MAX)
3508 ctx->len = INT_MAX;
3509 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3510#else
3511 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3512#endif
3513 return (ctx->result >= 0);
3514}
3515
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003516/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003517
Guido van Rossum73624e91994-10-10 17:59:00 +00003518static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003519sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003520{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003521 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003523 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003525 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3526 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003527
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 if (!IS_SELECTABLE(s)) {
3529 PyBuffer_Release(&pbuf);
3530 return select_error();
3531 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003532 ctx.buf = pbuf.buf;
3533 ctx.len = pbuf.len;
3534 ctx.flags = flags;
3535 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003536 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003537 return NULL;
3538 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003539 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003540
3541 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003542}
3543
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003544PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003545"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003546\n\
3547Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003548argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003549sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003550
3551
3552/* s.sendall(data [,flags]) method */
3553
3554static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003555sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003556{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003557 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003558 Py_ssize_t len, n;
3559 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003560 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003561 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003562 int has_timeout = (s->sock_timeout > 0);
3563 _PyTime_t interval = s->sock_timeout;
3564 _PyTime_t deadline = 0;
3565 int deadline_initialized = 0;
3566 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003568 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3569 return NULL;
3570 buf = pbuf.buf;
3571 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003572
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003573 if (!IS_SELECTABLE(s)) {
3574 PyBuffer_Release(&pbuf);
3575 return select_error();
3576 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003578 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003579 if (has_timeout) {
3580 if (deadline_initialized) {
3581 /* recompute the timeout */
3582 interval = deadline - _PyTime_GetMonotonicClock();
3583 }
3584 else {
3585 deadline_initialized = 1;
3586 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3587 }
3588
3589 if (interval <= 0) {
3590 PyErr_SetString(socket_timeout, "timed out");
3591 goto done;
3592 }
3593 }
3594
Victor Stinner02f32ab2015-04-01 22:53:26 +02003595 ctx.buf = buf;
3596 ctx.len = len;
3597 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003598 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3599 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003600 n = ctx.result;
3601 assert(n >= 0);
3602
3603 buf += n;
3604 len -= n;
3605
3606 /* We must run our signal handlers before looping again.
3607 send() can return a successful partial write when it is
3608 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003609 if (PyErr_CheckSignals())
3610 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003611 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003612 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003613
Victor Stinner8912d142015-04-06 23:16:34 +02003614 Py_INCREF(Py_None);
3615 res = Py_None;
3616
3617done:
3618 PyBuffer_Release(&pbuf);
3619 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003620}
3621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003622PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003623"sendall(data[, flags])\n\
3624\n\
3625Send a data string to the socket. For the optional flags\n\
3626argument, see the Unix manual. This calls send() repeatedly\n\
3627until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003628to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003629
Guido van Rossum30a685f1991-06-27 15:51:29 +00003630
Victor Stinner31bf2d52015-04-01 21:57:09 +02003631struct sock_sendto {
3632 char *buf;
3633 Py_ssize_t len;
3634 int flags;
3635 int addrlen;
3636 sock_addr_t *addrbuf;
3637 Py_ssize_t result;
3638};
3639
3640static int
3641sock_sendto_impl(PySocketSockObject *s, void *data)
3642{
3643 struct sock_sendto *ctx = data;
3644
3645#ifdef MS_WINDOWS
3646 if (ctx->len > INT_MAX)
3647 ctx->len = INT_MAX;
3648 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3649 SAS2SA(ctx->addrbuf), ctx->addrlen);
3650#else
3651 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3652 SAS2SA(ctx->addrbuf), ctx->addrlen);
3653#endif
3654 return (ctx->result >= 0);
3655}
3656
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003657/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003658
Guido van Rossum73624e91994-10-10 17:59:00 +00003659static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003660sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003661{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 Py_buffer pbuf;
3663 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003664 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003665 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003666 int addrlen, flags;
3667 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003670 arglen = PyTuple_Size(args);
3671 switch (arglen) {
3672 case 2:
3673 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3674 break;
3675 case 3:
3676 PyArg_ParseTuple(args, "y*iO:sendto",
3677 &pbuf, &flags, &addro);
3678 break;
3679 default:
3680 PyErr_Format(PyExc_TypeError,
3681 "sendto() takes 2 or 3 arguments (%d given)",
3682 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003683 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003684 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003685 if (PyErr_Occurred())
3686 return NULL;
3687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003688 if (!IS_SELECTABLE(s)) {
3689 PyBuffer_Release(&pbuf);
3690 return select_error();
3691 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003692
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003693 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3694 PyBuffer_Release(&pbuf);
3695 return NULL;
3696 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003697
Victor Stinner31bf2d52015-04-01 21:57:09 +02003698 ctx.buf = pbuf.buf;
3699 ctx.len = pbuf.len;
3700 ctx.flags = flags;
3701 ctx.addrlen = addrlen;
3702 ctx.addrbuf = &addrbuf;
3703 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003704 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003705 return NULL;
3706 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003707 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003708
3709 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003710}
3711
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003712PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003713"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003714\n\
3715Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003716For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003717
Guido van Rossum30a685f1991-06-27 15:51:29 +00003718
Victor Stinner35bee932015-04-02 12:28:07 +02003719/* The sendmsg() and recvmsg[_into]() methods require a working
3720 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3721#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003722struct sock_sendmsg {
3723 struct msghdr *msg;
3724 int flags;
3725 ssize_t result;
3726};
3727
3728static int
3729sock_sendmsg_impl(PySocketSockObject *s, void *data)
3730{
3731 struct sock_sendmsg *ctx = data;
3732
3733 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3734 return (ctx->result >= 0);
3735}
3736
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003737/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3738
3739static PyObject *
3740sock_sendmsg(PySocketSockObject *s, PyObject *args)
3741{
3742 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3743 Py_buffer *databufs = NULL;
3744 struct iovec *iovs = NULL;
3745 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003746 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747 struct cmsginfo {
3748 int level;
3749 int type;
3750 Py_buffer data;
3751 } *cmsgs = NULL;
3752 void *controlbuf = NULL;
3753 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003754 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003755 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3756 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003757 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003758
3759 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3760 &data_arg, &cmsg_arg, &flags, &addr_arg))
3761 return NULL;
3762
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003763 /* Parse destination address. */
3764 if (addr_arg != NULL && addr_arg != Py_None) {
3765 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3766 goto finally;
3767 msg.msg_name = &addrbuf;
3768 msg.msg_namelen = addrlen;
3769 }
3770
3771 /* Fill in an iovec for each message part, and save the Py_buffer
3772 structs to release afterwards. */
3773 if ((data_fast = PySequence_Fast(data_arg,
3774 "sendmsg() argument 1 must be an "
3775 "iterable")) == NULL)
3776 goto finally;
3777 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3778 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003779 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003780 goto finally;
3781 }
3782 msg.msg_iovlen = ndataparts;
3783 if (ndataparts > 0 &&
3784 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3785 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3786 PyErr_NoMemory();
3787 goto finally;
3788 }
3789 for (; ndatabufs < ndataparts; ndatabufs++) {
3790 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3791 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003792 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003793 &databufs[ndatabufs]))
3794 goto finally;
3795 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3796 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3797 }
3798
3799 if (cmsg_arg == NULL)
3800 ncmsgs = 0;
3801 else {
3802 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3803 "sendmsg() argument 2 must be an "
3804 "iterable")) == NULL)
3805 goto finally;
3806 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3807 }
3808
3809#ifndef CMSG_SPACE
3810 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003811 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003812 "sending multiple control messages is not supported "
3813 "on this system");
3814 goto finally;
3815 }
3816#endif
3817 /* Save level, type and Py_buffer for each control message,
3818 and calculate total size. */
3819 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3820 PyErr_NoMemory();
3821 goto finally;
3822 }
3823 controllen = controllen_last = 0;
3824 while (ncmsgbufs < ncmsgs) {
3825 size_t bufsize, space;
3826
3827 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3828 "(iiy*):[sendmsg() ancillary data items]",
3829 &cmsgs[ncmsgbufs].level,
3830 &cmsgs[ncmsgbufs].type,
3831 &cmsgs[ncmsgbufs].data))
3832 goto finally;
3833 bufsize = cmsgs[ncmsgbufs++].data.len;
3834
3835#ifdef CMSG_SPACE
3836 if (!get_CMSG_SPACE(bufsize, &space)) {
3837#else
3838 if (!get_CMSG_LEN(bufsize, &space)) {
3839#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003840 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003841 goto finally;
3842 }
3843 controllen += space;
3844 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003845 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003846 goto finally;
3847 }
3848 controllen_last = controllen;
3849 }
3850
3851 /* Construct ancillary data block from control message info. */
3852 if (ncmsgbufs > 0) {
3853 struct cmsghdr *cmsgh = NULL;
3854
3855 if ((msg.msg_control = controlbuf =
3856 PyMem_Malloc(controllen)) == NULL) {
3857 PyErr_NoMemory();
3858 goto finally;
3859 }
3860 msg.msg_controllen = controllen;
3861
3862 /* Need to zero out the buffer as a workaround for glibc's
3863 CMSG_NXTHDR() implementation. After getting the pointer to
3864 the next header, it checks its (uninitialized) cmsg_len
3865 member to see if the "message" fits in the buffer, and
3866 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003867 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003868 memset(controlbuf, 0, controllen);
3869
3870 for (i = 0; i < ncmsgbufs; i++) {
3871 size_t msg_len, data_len = cmsgs[i].data.len;
3872 int enough_space = 0;
3873
3874 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3875 if (cmsgh == NULL) {
3876 PyErr_Format(PyExc_RuntimeError,
3877 "unexpected NULL result from %s()",
3878 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3879 goto finally;
3880 }
3881 if (!get_CMSG_LEN(data_len, &msg_len)) {
3882 PyErr_SetString(PyExc_RuntimeError,
3883 "item size out of range for CMSG_LEN()");
3884 goto finally;
3885 }
3886 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3887 size_t space;
3888
3889 cmsgh->cmsg_len = msg_len;
3890 if (get_cmsg_data_space(&msg, cmsgh, &space))
3891 enough_space = (space >= data_len);
3892 }
3893 if (!enough_space) {
3894 PyErr_SetString(PyExc_RuntimeError,
3895 "ancillary data does not fit in calculated "
3896 "space");
3897 goto finally;
3898 }
3899 cmsgh->cmsg_level = cmsgs[i].level;
3900 cmsgh->cmsg_type = cmsgs[i].type;
3901 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3902 }
3903 }
3904
3905 /* Make the system call. */
3906 if (!IS_SELECTABLE(s)) {
3907 select_error();
3908 goto finally;
3909 }
3910
Victor Stinner31bf2d52015-04-01 21:57:09 +02003911 ctx.msg = &msg;
3912 ctx.flags = flags;
3913 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003914 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003915
3916 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003917
3918finally:
3919 PyMem_Free(controlbuf);
3920 for (i = 0; i < ncmsgbufs; i++)
3921 PyBuffer_Release(&cmsgs[i].data);
3922 PyMem_Free(cmsgs);
3923 Py_XDECREF(cmsg_fast);
3924 for (i = 0; i < ndatabufs; i++)
3925 PyBuffer_Release(&databufs[i]);
3926 PyMem_Free(databufs);
3927 PyMem_Free(iovs);
3928 Py_XDECREF(data_fast);
3929 return retval;
3930}
3931
3932PyDoc_STRVAR(sendmsg_doc,
3933"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3934\n\
3935Send normal and ancillary data to the socket, gathering the\n\
3936non-ancillary data from a series of buffers and concatenating it into\n\
3937a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003938data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003939The ancdata argument specifies the ancillary data (control messages)\n\
3940as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3941cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3942protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003943is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003944argument defaults to 0 and has the same meaning as for send(). If\n\
3945address is supplied and not None, it sets a destination address for\n\
3946the message. The return value is the number of bytes of non-ancillary\n\
3947data sent.");
3948#endif /* CMSG_LEN */
3949
3950
Guido van Rossum30a685f1991-06-27 15:51:29 +00003951/* s.shutdown(how) method */
3952
Guido van Rossum73624e91994-10-10 17:59:00 +00003953static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003954sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 int how;
3957 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003958
Serhiy Storchaka78980432013-01-15 01:12:17 +02003959 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003960 if (how == -1 && PyErr_Occurred())
3961 return NULL;
3962 Py_BEGIN_ALLOW_THREADS
3963 res = shutdown(s->sock_fd, how);
3964 Py_END_ALLOW_THREADS
3965 if (res < 0)
3966 return s->errorhandler();
3967 Py_INCREF(Py_None);
3968 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003969}
3970
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003971PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003972"shutdown(flag)\n\
3973\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003974Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3975of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003976
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003977#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003978static PyObject*
3979sock_ioctl(PySocketSockObject *s, PyObject *arg)
3980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003981 unsigned long cmd = SIO_RCVALL;
3982 PyObject *argO;
3983 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003985 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3986 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 switch (cmd) {
3989 case SIO_RCVALL: {
3990 unsigned int option = RCVALL_ON;
3991 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3992 return NULL;
3993 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3994 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3995 return set_error();
3996 }
3997 return PyLong_FromUnsignedLong(recv); }
3998 case SIO_KEEPALIVE_VALS: {
3999 struct tcp_keepalive ka;
4000 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4001 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4002 return NULL;
4003 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4004 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4005 return set_error();
4006 }
4007 return PyLong_FromUnsignedLong(recv); }
4008 default:
4009 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4010 return NULL;
4011 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004012}
4013PyDoc_STRVAR(sock_ioctl_doc,
4014"ioctl(cmd, option) -> long\n\
4015\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004016Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4017SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4018SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004019#endif
4020
4021#if defined(MS_WINDOWS)
4022static PyObject*
4023sock_share(PySocketSockObject *s, PyObject *arg)
4024{
4025 WSAPROTOCOL_INFO info;
4026 DWORD processId;
4027 int result;
4028
4029 if (!PyArg_ParseTuple(arg, "I", &processId))
4030 return NULL;
4031
4032 Py_BEGIN_ALLOW_THREADS
4033 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4034 Py_END_ALLOW_THREADS
4035 if (result == SOCKET_ERROR)
4036 return set_error();
4037 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4038}
4039PyDoc_STRVAR(sock_share_doc,
4040"share(process_id) -> bytes\n\
4041\n\
4042Share the socket with another process. The target process id\n\
4043must be provided and the resulting bytes object passed to the target\n\
4044process. There the shared socket can be instantiated by calling\n\
4045socket.fromshare().");
4046
Christian Heimesfaf2f632008-01-06 16:59:19 +00004047
4048#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004049
4050/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004051
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004052static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4054 accept_doc},
4055 {"bind", (PyCFunction)sock_bind, METH_O,
4056 bind_doc},
4057 {"close", (PyCFunction)sock_close, METH_NOARGS,
4058 close_doc},
4059 {"connect", (PyCFunction)sock_connect, METH_O,
4060 connect_doc},
4061 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4062 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004063 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4064 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4066 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004067#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 {"getpeername", (PyCFunction)sock_getpeername,
4069 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004070#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004071 {"getsockname", (PyCFunction)sock_getsockname,
4072 METH_NOARGS, getsockname_doc},
4073 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4074 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004075#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4077 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004078#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004079#if defined(MS_WINDOWS)
4080 {"share", (PyCFunction)sock_share, METH_VARARGS,
4081 sock_share_doc},
4082#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004083 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 listen_doc},
4085 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4086 recv_doc},
4087 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4088 recv_into_doc},
4089 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4090 recvfrom_doc},
4091 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4092 recvfrom_into_doc},
4093 {"send", (PyCFunction)sock_send, METH_VARARGS,
4094 send_doc},
4095 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4096 sendall_doc},
4097 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4098 sendto_doc},
4099 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4100 setblocking_doc},
4101 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4102 settimeout_doc},
4103 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4104 gettimeout_doc},
4105 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4106 setsockopt_doc},
4107 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4108 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004109#ifdef CMSG_LEN
4110 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4111 recvmsg_doc},
4112 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4113 recvmsg_into_doc,},
4114 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4115 sendmsg_doc},
4116#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004117 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004118};
4119
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004120/* SockObject members */
4121static PyMemberDef sock_memberlist[] = {
4122 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4123 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4124 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004125 {0},
4126};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004127
Victor Stinner71694d52015-03-28 01:18:54 +01004128static PyGetSetDef sock_getsetlist[] = {
4129 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4130 {NULL} /* sentinel */
4131};
4132
Guido van Rossum73624e91994-10-10 17:59:00 +00004133/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004134 First close the file description. */
4135
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004136static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004137sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004138{
Antoine Pitroue033e062010-10-29 10:38:18 +00004139 if (s->sock_fd != -1) {
4140 PyObject *exc, *val, *tb;
4141 Py_ssize_t old_refcount = Py_REFCNT(s);
4142 ++Py_REFCNT(s);
4143 PyErr_Fetch(&exc, &val, &tb);
4144 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4145 "unclosed %R", s))
4146 /* Spurious errors can appear at shutdown */
4147 if (PyErr_ExceptionMatches(PyExc_Warning))
4148 PyErr_WriteUnraisable((PyObject *) s);
4149 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004151 Py_REFCNT(s) = old_refcount;
4152 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004153 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004154}
4155
Guido van Rossum30a685f1991-06-27 15:51:29 +00004156
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004158sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004159{
Victor Stinnere254e532014-07-26 14:36:55 +02004160 long sock_fd;
4161 /* On Windows, this test is needed because SOCKET_T is unsigned */
4162 if (s->sock_fd == INVALID_SOCKET) {
4163 sock_fd = -1;
4164 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004165#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004166 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004167 /* this can occur on Win64, and actually there is a special
4168 ugly printf formatter for decimal pointer length integer
4169 printing, only bother if necessary*/
4170 PyErr_SetString(PyExc_OverflowError,
4171 "no printf formatter to display "
4172 "the socket descriptor in decimal");
4173 return NULL;
4174 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004175#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004176 else
4177 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004178 return PyUnicode_FromFormat(
4179 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004180 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 s->sock_type,
4182 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004183}
4184
4185
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004186/* Create a new, uninitialized socket object. */
4187
4188static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004189sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004190{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 new = type->tp_alloc(type, 0);
4194 if (new != NULL) {
4195 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner9001d802015-04-06 23:06:01 +02004196 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 ((PySocketSockObject *)new)->errorhandler = &set_error;
4198 }
4199 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004200}
4201
4202
4203/* Initialize a new socket object. */
4204
Victor Stinnerdaf45552013-08-28 00:53:59 +02004205#ifdef SOCK_CLOEXEC
4206/* socket() and socketpair() fail with EINVAL on Linux kernel older
4207 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4208static int sock_cloexec_works = -1;
4209#endif
4210
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004211/*ARGSUSED*/
4212static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004213sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004215 PySocketSockObject *s = (PySocketSockObject *)self;
4216 PyObject *fdobj = NULL;
4217 SOCKET_T fd = INVALID_SOCKET;
4218 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4219 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004220#ifndef MS_WINDOWS
4221#ifdef SOCK_CLOEXEC
4222 int *atomic_flag_works = &sock_cloexec_works;
4223#else
4224 int *atomic_flag_works = NULL;
4225#endif
4226#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004228 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4229 "|iiiO:socket", keywords,
4230 &family, &type, &proto, &fdobj))
4231 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004234#ifdef MS_WINDOWS
4235 /* recreate a socket that was duplicated */
4236 if (PyBytes_Check(fdobj)) {
4237 WSAPROTOCOL_INFO info;
4238 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4239 PyErr_Format(PyExc_ValueError,
4240 "socket descriptor string has wrong size, "
4241 "should be %zu bytes.", sizeof(info));
4242 return -1;
4243 }
4244 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4245 Py_BEGIN_ALLOW_THREADS
4246 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4247 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4248 Py_END_ALLOW_THREADS
4249 if (fd == INVALID_SOCKET) {
4250 set_error();
4251 return -1;
4252 }
4253 family = info.iAddressFamily;
4254 type = info.iSocketType;
4255 proto = info.iProtocol;
4256 }
4257 else
4258#endif
4259 {
4260 fd = PyLong_AsSocket_t(fdobj);
4261 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4262 return -1;
4263 if (fd == INVALID_SOCKET) {
4264 PyErr_SetString(PyExc_ValueError,
4265 "can't use invalid socket value");
4266 return -1;
4267 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004268 }
4269 }
4270 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004271#ifdef MS_WINDOWS
4272 /* Windows implementation */
4273#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4274#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4275#endif
4276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004278 if (support_wsa_no_inherit) {
4279 fd = WSASocket(family, type, proto,
4280 NULL, 0,
4281 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4282 if (fd == INVALID_SOCKET) {
4283 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4284 support_wsa_no_inherit = 0;
4285 fd = socket(family, type, proto);
4286 }
4287 }
4288 else {
4289 fd = socket(family, type, proto);
4290 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004291 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004293 if (fd == INVALID_SOCKET) {
4294 set_error();
4295 return -1;
4296 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004297
4298 if (!support_wsa_no_inherit) {
4299 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4300 closesocket(fd);
4301 PyErr_SetFromWindowsErr(0);
4302 return -1;
4303 }
4304 }
4305#else
4306 /* UNIX */
4307 Py_BEGIN_ALLOW_THREADS
4308#ifdef SOCK_CLOEXEC
4309 if (sock_cloexec_works != 0) {
4310 fd = socket(family, type | SOCK_CLOEXEC, proto);
4311 if (sock_cloexec_works == -1) {
4312 if (fd >= 0) {
4313 sock_cloexec_works = 1;
4314 }
4315 else if (errno == EINVAL) {
4316 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4317 sock_cloexec_works = 0;
4318 fd = socket(family, type, proto);
4319 }
4320 }
4321 }
4322 else
4323#endif
4324 {
4325 fd = socket(family, type, proto);
4326 }
4327 Py_END_ALLOW_THREADS
4328
4329 if (fd == INVALID_SOCKET) {
4330 set_error();
4331 return -1;
4332 }
4333
4334 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4335 SOCKETCLOSE(fd);
4336 return -1;
4337 }
4338#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 }
4340 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004342 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004343
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004344}
4345
4346
Guido van Rossumb6775db1994-08-01 11:34:53 +00004347/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004348
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004349static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004350 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4351 "_socket.socket", /* tp_name */
4352 sizeof(PySocketSockObject), /* tp_basicsize */
4353 0, /* tp_itemsize */
4354 (destructor)sock_dealloc, /* tp_dealloc */
4355 0, /* tp_print */
4356 0, /* tp_getattr */
4357 0, /* tp_setattr */
4358 0, /* tp_reserved */
4359 (reprfunc)sock_repr, /* tp_repr */
4360 0, /* tp_as_number */
4361 0, /* tp_as_sequence */
4362 0, /* tp_as_mapping */
4363 0, /* tp_hash */
4364 0, /* tp_call */
4365 0, /* tp_str */
4366 PyObject_GenericGetAttr, /* tp_getattro */
4367 0, /* tp_setattro */
4368 0, /* tp_as_buffer */
4369 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4370 sock_doc, /* tp_doc */
4371 0, /* tp_traverse */
4372 0, /* tp_clear */
4373 0, /* tp_richcompare */
4374 0, /* tp_weaklistoffset */
4375 0, /* tp_iter */
4376 0, /* tp_iternext */
4377 sock_methods, /* tp_methods */
4378 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004379 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 0, /* tp_base */
4381 0, /* tp_dict */
4382 0, /* tp_descr_get */
4383 0, /* tp_descr_set */
4384 0, /* tp_dictoffset */
4385 sock_initobj, /* tp_init */
4386 PyType_GenericAlloc, /* tp_alloc */
4387 sock_new, /* tp_new */
4388 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004389};
4390
Guido van Rossum30a685f1991-06-27 15:51:29 +00004391
Guido van Rossum81194471991-07-27 21:42:02 +00004392/* Python interface to gethostname(). */
4393
4394/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004395static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004396socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004397{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004398#ifdef MS_WINDOWS
4399 /* Don't use winsock's gethostname, as this returns the ANSI
4400 version of the hostname, whereas we need a Unicode string.
4401 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004402 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004403 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004404 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004405 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004406
4407 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004408 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004409
4410 if (GetLastError() != ERROR_MORE_DATA)
4411 return PyErr_SetFromWindowsErr(0);
4412
4413 if (size == 0)
4414 return PyUnicode_New(0, 0);
4415
4416 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4417 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004418 name = PyMem_New(wchar_t, size);
4419 if (!name) {
4420 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004421 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004422 }
Victor Stinner74168972011-11-17 01:11:36 +01004423 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4424 name,
4425 &size))
4426 {
4427 PyMem_Free(name);
4428 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004429 }
Victor Stinner74168972011-11-17 01:11:36 +01004430
4431 result = PyUnicode_FromWideChar(name, size);
4432 PyMem_Free(name);
4433 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004434#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 char buf[1024];
4436 int res;
4437 Py_BEGIN_ALLOW_THREADS
4438 res = gethostname(buf, (int) sizeof buf - 1);
4439 Py_END_ALLOW_THREADS
4440 if (res < 0)
4441 return set_error();
4442 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004443 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004444#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004445}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004446
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004447PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004448"gethostname() -> string\n\
4449\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004450Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004451
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004452#ifdef HAVE_SETHOSTNAME
4453PyDoc_STRVAR(sethostname_doc,
4454"sethostname(name)\n\n\
4455Sets the hostname to name.");
4456
4457static PyObject *
4458socket_sethostname(PyObject *self, PyObject *args)
4459{
4460 PyObject *hnobj;
4461 Py_buffer buf;
4462 int res, flag = 0;
4463
Christian Heimesd2774c72013-06-19 02:06:29 +02004464#ifdef _AIX
4465/* issue #18259, not declared in any useful header file */
4466extern int sethostname(const char *, size_t);
4467#endif
4468
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004469 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4470 PyErr_Clear();
4471 if (!PyArg_ParseTuple(args, "O&:sethostname",
4472 PyUnicode_FSConverter, &hnobj))
4473 return NULL;
4474 flag = 1;
4475 }
4476 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4477 if (!res) {
4478 res = sethostname(buf.buf, buf.len);
4479 PyBuffer_Release(&buf);
4480 }
4481 if (flag)
4482 Py_DECREF(hnobj);
4483 if (res)
4484 return set_error();
4485 Py_RETURN_NONE;
4486}
4487#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004488
Guido van Rossum30a685f1991-06-27 15:51:29 +00004489/* Python interface to gethostbyname(name). */
4490
4491/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004493socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004494{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 char *name;
4496 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004497 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004498
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004499 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004500 return NULL;
4501 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004502 goto finally;
4503 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4504finally:
4505 PyMem_Free(name);
4506 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004507}
4508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004509PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004510"gethostbyname(host) -> address\n\
4511\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004512Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004513
4514
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004515/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4516
4517static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004518gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004519{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 char **pch;
4521 PyObject *rtn_tuple = (PyObject *)NULL;
4522 PyObject *name_list = (PyObject *)NULL;
4523 PyObject *addr_list = (PyObject *)NULL;
4524 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 if (h == NULL) {
4527 /* Let's get real error message to return */
4528 set_herror(h_errno);
4529 return NULL;
4530 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004532 if (h->h_addrtype != af) {
4533 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004534 errno = EAFNOSUPPORT;
4535 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004536 return NULL;
4537 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 case AF_INET:
4542 if (alen < sizeof(struct sockaddr_in))
4543 return NULL;
4544 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004545
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004546#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 case AF_INET6:
4548 if (alen < sizeof(struct sockaddr_in6))
4549 return NULL;
4550 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004551#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 if ((name_list = PyList_New(0)) == NULL)
4556 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004558 if ((addr_list = PyList_New(0)) == NULL)
4559 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 /* SF #1511317: h_aliases can be NULL */
4562 if (h->h_aliases) {
4563 for (pch = h->h_aliases; *pch != NULL; pch++) {
4564 int status;
4565 tmp = PyUnicode_FromString(*pch);
4566 if (tmp == NULL)
4567 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 status = PyList_Append(name_list, tmp);
4570 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 if (status)
4573 goto err;
4574 }
4575 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4578 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 case AF_INET:
4583 {
4584 struct sockaddr_in sin;
4585 memset(&sin, 0, sizeof(sin));
4586 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004587#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4591 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 if (pch == h->h_addr_list && alen >= sizeof(sin))
4594 memcpy((char *) addr, &sin, sizeof(sin));
4595 break;
4596 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004597
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004598#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 case AF_INET6:
4600 {
4601 struct sockaddr_in6 sin6;
4602 memset(&sin6, 0, sizeof(sin6));
4603 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004604#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004606#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4608 tmp = makeipaddr((struct sockaddr *)&sin6,
4609 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4612 memcpy((char *) addr, &sin6, sizeof(sin6));
4613 break;
4614 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004615#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004618 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 "unsupported address family");
4620 return NULL;
4621 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 if (tmp == NULL)
4624 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 status = PyList_Append(addr_list, tmp);
4627 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004628
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004629 if (status)
4630 goto err;
4631 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004634
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004635 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 Py_XDECREF(name_list);
4637 Py_XDECREF(addr_list);
4638 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004639}
4640
4641
4642/* Python interface to gethostbyname_ex(name). */
4643
4644/*ARGSUSED*/
4645static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004646socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004647{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 char *name;
4649 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004650 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004651 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004652 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004653#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004655#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004657#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 char buf[16384];
4659 int buf_len = (sizeof buf) - 1;
4660 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004661#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004662#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004664#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004665#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004666
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004667 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004669 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004670 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004672#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004673#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004674 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004676#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004678#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 memset((void *) &data, '\0', sizeof(data));
4680 result = gethostbyname_r(name, &hp_allocated, &data);
4681 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004682#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004683#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004684#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004688#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 Py_END_ALLOW_THREADS
4690 /* Some C libraries would require addr.__ss_family instead of
4691 addr.ss_family.
4692 Therefore, we cast the sockaddr_storage into sockaddr to
4693 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004694 sa = SAS2SA(&addr);
4695 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004697#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004698 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004699#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004700finally:
4701 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004703}
4704
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004705PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004706"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4707\n\
4708Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004709for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004710
4711
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004712/* Python interface to gethostbyaddr(IP). */
4713
4714/*ARGSUSED*/
4715static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004716socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004717{
Charles-François Natali8b759652011-12-23 16:44:51 +01004718 sock_addr_t addr;
4719 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 char *ip_num;
4721 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004722 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004723#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004725#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004728 /* glibcs up to 2.10 assume that the buf argument to
4729 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4730 does not ensure. The attribute below instructs the compiler
4731 to maintain this alignment. */
4732 char buf[16384] Py_ALIGNED(8);
4733 int buf_len = (sizeof buf) - 1;
4734 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004735#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004736#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004737 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004738#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004739#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 char *ap;
4741 int al;
4742 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004743
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004744 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004745 return NULL;
4746 af = AF_UNSPEC;
4747 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004748 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 af = sa->sa_family;
4750 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004751 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 switch (af) {
4753 case AF_INET:
4754 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4755 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4756 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004757#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 case AF_INET6:
4759 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4760 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4761 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004764 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004765 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 }
4767 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004768#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004769#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004770 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 &hp_allocated, buf, buf_len,
4772 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004773#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 h = gethostbyaddr_r(ap, al, af,
4775 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004776#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 memset((void *) &data, '\0', sizeof(data));
4778 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4779 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004780#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004781#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004782#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004783 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004784#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004785 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004786#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004788 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004789#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004791#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004792finally:
4793 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004794 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004795}
4796
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004797PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004798"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4799\n\
4800Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004801for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004802
Guido van Rossum30a685f1991-06-27 15:51:29 +00004803
4804/* Python interface to getservbyname(name).
4805 This only returns the port number, since the other info is already
4806 known or not useful (like the list of aliases). */
4807
4808/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004809static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004810socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 char *name, *proto=NULL;
4813 struct servent *sp;
4814 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4815 return NULL;
4816 Py_BEGIN_ALLOW_THREADS
4817 sp = getservbyname(name, proto);
4818 Py_END_ALLOW_THREADS
4819 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004820 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004821 return NULL;
4822 }
4823 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004824}
4825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004826PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004827"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004828\n\
4829Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004830The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4831otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004832
Guido van Rossum30a685f1991-06-27 15:51:29 +00004833
Barry Warsaw11b91a02004-06-28 00:50:43 +00004834/* Python interface to getservbyport(port).
4835 This only returns the service name, since the other info is already
4836 known or not useful (like the list of aliases). */
4837
4838/*ARGSUSED*/
4839static PyObject *
4840socket_getservbyport(PyObject *self, PyObject *args)
4841{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 int port;
4843 char *proto=NULL;
4844 struct servent *sp;
4845 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4846 return NULL;
4847 if (port < 0 || port > 0xffff) {
4848 PyErr_SetString(
4849 PyExc_OverflowError,
4850 "getservbyport: port must be 0-65535.");
4851 return NULL;
4852 }
4853 Py_BEGIN_ALLOW_THREADS
4854 sp = getservbyport(htons((short)port), proto);
4855 Py_END_ALLOW_THREADS
4856 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004857 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004858 return NULL;
4859 }
4860 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004861}
4862
4863PyDoc_STRVAR(getservbyport_doc,
4864"getservbyport(port[, protocolname]) -> string\n\
4865\n\
4866Return the service name from a port number and protocol name.\n\
4867The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4868otherwise any protocol will match.");
4869
Guido van Rossum3901d851996-12-19 16:35:04 +00004870/* Python interface to getprotobyname(name).
4871 This only returns the protocol number, since the other info is
4872 already known or not useful (like the list of aliases). */
4873
4874/*ARGSUSED*/
4875static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004876socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 char *name;
4879 struct protoent *sp;
4880 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4881 return NULL;
4882 Py_BEGIN_ALLOW_THREADS
4883 sp = getprotobyname(name);
4884 Py_END_ALLOW_THREADS
4885 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004886 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 return NULL;
4888 }
4889 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004890}
4891
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004892PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004893"getprotobyname(name) -> integer\n\
4894\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004895Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004896
Guido van Rossum3901d851996-12-19 16:35:04 +00004897
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004898#ifndef NO_DUP
4899/* dup() function for socket fds */
4900
4901static PyObject *
4902socket_dup(PyObject *self, PyObject *fdobj)
4903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 SOCKET_T fd, newfd;
4905 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004906#ifdef MS_WINDOWS
4907 WSAPROTOCOL_INFO info;
4908#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 fd = PyLong_AsSocket_t(fdobj);
4911 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4912 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004913
Victor Stinnerdaf45552013-08-28 00:53:59 +02004914#ifdef MS_WINDOWS
4915 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4916 return set_error();
4917
4918 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4919 FROM_PROTOCOL_INFO,
4920 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 if (newfd == INVALID_SOCKET)
4922 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004923
Victor Stinnerdaf45552013-08-28 00:53:59 +02004924 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4925 closesocket(newfd);
4926 PyErr_SetFromWindowsErr(0);
4927 return NULL;
4928 }
4929#else
4930 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4931 newfd = _Py_dup(fd);
4932 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004933 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004934#endif
4935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004936 newfdobj = PyLong_FromSocket_t(newfd);
4937 if (newfdobj == NULL)
4938 SOCKETCLOSE(newfd);
4939 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004940}
4941
4942PyDoc_STRVAR(dup_doc,
4943"dup(integer) -> integer\n\
4944\n\
4945Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4946sockets; on some platforms os.dup() won't work for socket file descriptors.");
4947#endif
4948
4949
Dave Cole331708b2004-08-09 04:51:41 +00004950#ifdef HAVE_SOCKETPAIR
4951/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004952 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004953 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004954
4955/*ARGSUSED*/
4956static PyObject *
4957socket_socketpair(PyObject *self, PyObject *args)
4958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 PySocketSockObject *s0 = NULL, *s1 = NULL;
4960 SOCKET_T sv[2];
4961 int family, type = SOCK_STREAM, proto = 0;
4962 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004963#ifdef SOCK_CLOEXEC
4964 int *atomic_flag_works = &sock_cloexec_works;
4965#else
4966 int *atomic_flag_works = NULL;
4967#endif
4968 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004969
4970#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004971 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004972#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4976 &family, &type, &proto))
4977 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004980 Py_BEGIN_ALLOW_THREADS
4981#ifdef SOCK_CLOEXEC
4982 if (sock_cloexec_works != 0) {
4983 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4984 if (sock_cloexec_works == -1) {
4985 if (ret >= 0) {
4986 sock_cloexec_works = 1;
4987 }
4988 else if (errno == EINVAL) {
4989 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4990 sock_cloexec_works = 0;
4991 ret = socketpair(family, type, proto, sv);
4992 }
4993 }
4994 }
4995 else
4996#endif
4997 {
4998 ret = socketpair(family, type, proto, sv);
4999 }
5000 Py_END_ALLOW_THREADS
5001
5002 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005004
5005 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5006 goto finally;
5007 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5008 goto finally;
5009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 s0 = new_sockobject(sv[0], family, type, proto);
5011 if (s0 == NULL)
5012 goto finally;
5013 s1 = new_sockobject(sv[1], family, type, proto);
5014 if (s1 == NULL)
5015 goto finally;
5016 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005017
5018finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 if (res == NULL) {
5020 if (s0 == NULL)
5021 SOCKETCLOSE(sv[0]);
5022 if (s1 == NULL)
5023 SOCKETCLOSE(sv[1]);
5024 }
5025 Py_XDECREF(s0);
5026 Py_XDECREF(s1);
5027 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005028}
5029
5030PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005031"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005032\n\
5033Create a pair of socket objects from the sockets returned by the platform\n\
5034socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005035The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005036AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005037
5038#endif /* HAVE_SOCKETPAIR */
5039
5040
Guido van Rossum006bf911996-06-12 04:04:55 +00005041static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005042socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005043{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005044 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005046 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5047 return NULL;
5048 }
5049 if (x1 < 0) {
5050 PyErr_SetString(PyExc_OverflowError,
5051 "can't convert negative number to unsigned long");
5052 return NULL;
5053 }
5054 x2 = (unsigned int)ntohs((unsigned short)x1);
5055 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005056}
5057
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005058PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005059"ntohs(integer) -> integer\n\
5060\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005061Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005062
5063
Guido van Rossum006bf911996-06-12 04:04:55 +00005064static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005065socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005066{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 if (PyLong_Check(arg)) {
5070 x = PyLong_AsUnsignedLong(arg);
5071 if (x == (unsigned long) -1 && PyErr_Occurred())
5072 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005073#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005074 {
5075 unsigned long y;
5076 /* only want the trailing 32 bits */
5077 y = x & 0xFFFFFFFFUL;
5078 if (y ^ x)
5079 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005080 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 x = y;
5082 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005083#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 }
5085 else
5086 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005087 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005090}
5091
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005092PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005093"ntohl(integer) -> integer\n\
5094\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005095Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005096
5097
Guido van Rossum006bf911996-06-12 04:04:55 +00005098static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005099socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005100{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5104 return NULL;
5105 }
5106 if (x1 < 0) {
5107 PyErr_SetString(PyExc_OverflowError,
5108 "can't convert negative number to unsigned long");
5109 return NULL;
5110 }
5111 x2 = (unsigned int)htons((unsigned short)x1);
5112 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005113}
5114
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005115PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005116"htons(integer) -> integer\n\
5117\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005118Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005119
5120
Guido van Rossum006bf911996-06-12 04:04:55 +00005121static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005122socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005123{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005124 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005126 if (PyLong_Check(arg)) {
5127 x = PyLong_AsUnsignedLong(arg);
5128 if (x == (unsigned long) -1 && PyErr_Occurred())
5129 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005130#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005131 {
5132 unsigned long y;
5133 /* only want the trailing 32 bits */
5134 y = x & 0xFFFFFFFFUL;
5135 if (y ^ x)
5136 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005137 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 x = y;
5139 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 }
5142 else
5143 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005144 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 Py_TYPE(arg)->tp_name);
5146 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005147}
5148
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005149PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005150"htonl(integer) -> integer\n\
5151\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005152Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005153
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005154/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005155
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005156PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005157"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005158\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005159Convert 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 +00005160binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005161
5162static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005163socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005164{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005165#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005166 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005167#endif
5168
5169#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005170#if (SIZEOF_INT != 4)
5171#error "Not sure if in_addr_t exists and int is not 32-bits."
5172#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005173 /* Have to use inet_addr() instead */
5174 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005175#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5179 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005180
Tim Peters1df9fdd2003-02-13 03:13:40 +00005181
5182#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005183
5184#ifdef USE_INET_ATON_WEAKLINK
5185 if (inet_aton != NULL) {
5186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 if (inet_aton(ip_addr, &buf))
5188 return PyBytes_FromStringAndSize((char *)(&buf),
5189 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005190
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005191 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005192 "illegal IP address string passed to inet_aton");
5193 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005194
Thomas Wouters477c8d52006-05-27 19:21:47 +00005195#ifdef USE_INET_ATON_WEAKLINK
5196 } else {
5197#endif
5198
5199#endif
5200
5201#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 /* special-case this address as inet_addr might return INADDR_NONE
5204 * for this */
5205 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005206 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005209 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005212 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 "illegal IP address string passed to inet_aton");
5214 return NULL;
5215 }
5216 }
5217 return PyBytes_FromStringAndSize((char *) &packed_addr,
5218 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005219
5220#ifdef USE_INET_ATON_WEAKLINK
5221 }
5222#endif
5223
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005224#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005225}
5226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005227PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005228"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005229\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005230Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005231
5232static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005233socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005234{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005235 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005237
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005238 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 return NULL;
5240 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005241
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005242 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005243 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005245 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 return NULL;
5247 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005248
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005249 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5250 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005253}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005254
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005255#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005256
5257PyDoc_STRVAR(inet_pton_doc,
5258"inet_pton(af, ip) -> packed IP address string\n\
5259\n\
5260Convert an IP address from string format to a packed string suitable\n\
5261for use with low-level network functions.");
5262
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005263#endif
5264
5265#ifdef HAVE_INET_PTON
5266
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005267static PyObject *
5268socket_inet_pton(PyObject *self, PyObject *args)
5269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 int af;
5271 char* ip;
5272 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005273#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005274 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005275#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005277#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5279 return NULL;
5280 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005281
Martin v. Löwis04697e82004-06-02 12:35:29 +00005282#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005284 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005285 "can't use AF_INET6, IPv6 is disabled");
5286 return NULL;
5287 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005288#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 retval = inet_pton(af, ip, packed);
5291 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005292 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005293 return NULL;
5294 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005295 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 "illegal IP address string passed to inet_pton");
5297 return NULL;
5298 } else if (af == AF_INET) {
5299 return PyBytes_FromStringAndSize(packed,
5300 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005301#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 } else if (af == AF_INET6) {
5303 return PyBytes_FromStringAndSize(packed,
5304 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005305#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005307 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005308 return NULL;
5309 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005310}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005311#elif defined(MS_WINDOWS)
5312
5313static PyObject *
5314socket_inet_pton(PyObject *self, PyObject *args)
5315{
5316 int af;
5317 char* ip;
5318 struct sockaddr_in6 addr;
5319 INT ret, size;
5320
5321 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5322 return NULL;
5323 }
5324
Victor Stinnere990c6e2013-11-16 00:18:58 +01005325 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005326 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5327
5328 if (ret) {
5329 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5330 return NULL;
5331 } else if(af == AF_INET) {
5332 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005333 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005334 sizeof(addr4->sin_addr));
5335 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005336 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005337 sizeof(addr.sin6_addr));
5338 } else {
5339 PyErr_SetString(PyExc_OSError, "unknown address family");
5340 return NULL;
5341 }
5342}
5343
5344#endif
5345
5346#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005347
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005348PyDoc_STRVAR(inet_ntop_doc,
5349"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5350\n\
5351Convert a packed IP address of the given family to string format.");
5352
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005353#endif
5354
5355
5356#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005357static PyObject *
5358socket_inet_ntop(PyObject *self, PyObject *args)
5359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005361 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005363#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005364 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005365#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005367#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005368
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005369 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5370 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005371
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005372 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 return NULL;
5374 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005377 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 PyErr_SetString(PyExc_ValueError,
5379 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005380 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 return NULL;
5382 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005383#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005385 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 PyErr_SetString(PyExc_ValueError,
5387 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005388 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005389 return NULL;
5390 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005392 } else {
5393 PyErr_Format(PyExc_ValueError,
5394 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005395 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 return NULL;
5397 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005398
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005399 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5400 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005401 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005402 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005403 return NULL;
5404 } else {
5405 return PyUnicode_FromString(retval);
5406 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 /* NOTREACHED */
5409 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5410 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005411}
5412
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005413#elif defined(MS_WINDOWS)
5414
5415static PyObject *
5416socket_inet_ntop(PyObject *self, PyObject *args)
5417{
5418 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005419 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005420 struct sockaddr_in6 addr;
5421 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005422#ifdef ENABLE_IPV6
5423 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5424#else
5425 char ip[INET_ADDRSTRLEN + 1];
5426#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005427
5428 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5429 memset((void *) &ip[0], '\0', sizeof(ip));
5430
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005431 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005432 return NULL;
5433 }
5434
5435 if (af == AF_INET) {
5436 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5437
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005438 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005439 PyErr_SetString(PyExc_ValueError,
5440 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005441 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005442 return NULL;
5443 }
5444 memset(addr4, 0, sizeof(struct sockaddr_in));
5445 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005446 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005447 addrlen = sizeof(struct sockaddr_in);
5448 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005449 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005450 PyErr_SetString(PyExc_ValueError,
5451 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005452 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005453 return NULL;
5454 }
5455
5456 memset(&addr, 0, sizeof(addr));
5457 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005458 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005459 addrlen = sizeof(addr);
5460 } else {
5461 PyErr_Format(PyExc_ValueError,
5462 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005463 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005464 return NULL;
5465 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005466 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005467
5468 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005469 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005470 ip, &retlen);
5471
5472 if (ret) {
5473 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5474 return NULL;
5475 } else {
5476 return PyUnicode_FromString(ip);
5477 }
5478}
5479
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005480#endif /* HAVE_INET_PTON */
5481
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482/* Python interface to getaddrinfo(host, port). */
5483
5484/*ARGSUSED*/
5485static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005486socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005487{
Victor Stinner77af1722011-05-26 14:05:59 +02005488 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005489 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005490 struct addrinfo hints, *res;
5491 struct addrinfo *res0 = NULL;
5492 PyObject *hobj = NULL;
5493 PyObject *pobj = (PyObject *)NULL;
5494 char pbuf[30];
5495 char *hptr, *pptr;
5496 int family, socktype, protocol, flags;
5497 int error;
5498 PyObject *all = (PyObject *)NULL;
5499 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005500
Georg Brandl6083a4b2013-10-14 06:51:46 +02005501 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005503 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005504 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 &protocol, &flags)) {
5506 return NULL;
5507 }
5508 if (hobj == Py_None) {
5509 hptr = NULL;
5510 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005511 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005512
5513 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 if (!idna)
5515 return NULL;
5516 assert(PyBytes_Check(idna));
5517 hptr = PyBytes_AS_STRING(idna);
5518 } else if (PyBytes_Check(hobj)) {
5519 hptr = PyBytes_AsString(hobj);
5520 } else {
5521 PyErr_SetString(PyExc_TypeError,
5522 "getaddrinfo() argument 1 must be string or None");
5523 return NULL;
5524 }
5525 if (PyLong_CheckExact(pobj)) {
5526 long value = PyLong_AsLong(pobj);
5527 if (value == -1 && PyErr_Occurred())
5528 goto err;
5529 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5530 pptr = pbuf;
5531 } else if (PyUnicode_Check(pobj)) {
5532 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005533 if (pptr == NULL)
5534 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005536 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005537 } else if (pobj == Py_None) {
5538 pptr = (char *)NULL;
5539 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005540 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005541 goto err;
5542 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005543#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005544 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5545 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005546 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5547 * This workaround avoids a segfault in libsystem.
5548 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005549 pptr = "00";
5550 }
5551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 memset(&hints, 0, sizeof(hints));
5553 hints.ai_family = family;
5554 hints.ai_socktype = socktype;
5555 hints.ai_protocol = protocol;
5556 hints.ai_flags = flags;
5557 Py_BEGIN_ALLOW_THREADS
5558 ACQUIRE_GETADDRINFO_LOCK
5559 error = getaddrinfo(hptr, pptr, &hints, &res0);
5560 Py_END_ALLOW_THREADS
5561 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5562 if (error) {
5563 set_gaierror(error);
5564 goto err;
5565 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005566
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005567 all = PyList_New(0);
5568 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 goto err;
5570 for (res = res0; res; res = res->ai_next) {
5571 PyObject *single;
5572 PyObject *addr =
5573 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5574 if (addr == NULL)
5575 goto err;
5576 single = Py_BuildValue("iiisO", res->ai_family,
5577 res->ai_socktype, res->ai_protocol,
5578 res->ai_canonname ? res->ai_canonname : "",
5579 addr);
5580 Py_DECREF(addr);
5581 if (single == NULL)
5582 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 if (PyList_Append(all, single))
5585 goto err;
5586 Py_XDECREF(single);
5587 }
5588 Py_XDECREF(idna);
5589 if (res0)
5590 freeaddrinfo(res0);
5591 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005592 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005593 Py_XDECREF(all);
5594 Py_XDECREF(idna);
5595 if (res0)
5596 freeaddrinfo(res0);
5597 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005598}
5599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005600PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005601"getaddrinfo(host, port [, family, type, proto, flags])\n\
5602 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005603\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005604Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005605
5606/* Python interface to getnameinfo(sa, flags). */
5607
5608/*ARGSUSED*/
5609static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005610socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005611{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 PyObject *sa = (PyObject *)NULL;
5613 int flags;
5614 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005615 int port;
5616 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005617 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5618 struct addrinfo hints, *res = NULL;
5619 int error;
5620 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 flags = flowinfo = scope_id = 0;
5623 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5624 return NULL;
5625 if (!PyTuple_Check(sa)) {
5626 PyErr_SetString(PyExc_TypeError,
5627 "getnameinfo() argument 1 must be a tuple");
5628 return NULL;
5629 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005630 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 &hostp, &port, &flowinfo, &scope_id))
5632 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005633 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005634 PyErr_SetString(PyExc_OverflowError,
5635 "getsockaddrarg: flowinfo must be 0-1048575.");
5636 return NULL;
5637 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5639 memset(&hints, 0, sizeof(hints));
5640 hints.ai_family = AF_UNSPEC;
5641 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005642 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005643 Py_BEGIN_ALLOW_THREADS
5644 ACQUIRE_GETADDRINFO_LOCK
5645 error = getaddrinfo(hostp, pbuf, &hints, &res);
5646 Py_END_ALLOW_THREADS
5647 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5648 if (error) {
5649 set_gaierror(error);
5650 goto fail;
5651 }
5652 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005653 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 "sockaddr resolved to multiple addresses");
5655 goto fail;
5656 }
5657 switch (res->ai_family) {
5658 case AF_INET:
5659 {
5660 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005661 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 "IPv4 sockaddr must be 2 tuple");
5663 goto fail;
5664 }
5665 break;
5666 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005667#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005668 case AF_INET6:
5669 {
5670 struct sockaddr_in6 *sin6;
5671 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005672 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 sin6->sin6_scope_id = scope_id;
5674 break;
5675 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005676#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005678 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005679 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5680 if (error) {
5681 set_gaierror(error);
5682 goto fail;
5683 }
5684 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005685
5686fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005687 if (res)
5688 freeaddrinfo(res);
5689 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005690}
5691
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005692PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005693"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005694\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005695Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005696
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005697
5698/* Python API to getting and setting the default timeout value. */
5699
5700static PyObject *
5701socket_getdefaulttimeout(PyObject *self)
5702{
Victor Stinner71694d52015-03-28 01:18:54 +01005703 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005704 Py_INCREF(Py_None);
5705 return Py_None;
5706 }
Victor Stinner71694d52015-03-28 01:18:54 +01005707 else {
5708 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5709 return PyFloat_FromDouble(seconds);
5710 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005711}
5712
5713PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005714"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005715\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005716Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005717A value of None indicates that new socket objects have no timeout.\n\
5718When the socket module is first imported, the default is None.");
5719
5720static PyObject *
5721socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5722{
Victor Stinner71694d52015-03-28 01:18:54 +01005723 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005724
Victor Stinner71694d52015-03-28 01:18:54 +01005725 if (socket_parse_timeout(&timeout, arg) < 0)
5726 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005728 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 Py_INCREF(Py_None);
5731 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005732}
5733
5734PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005735"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005736\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005737Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005738A value of None indicates that new socket objects have no timeout.\n\
5739When the socket module is first imported, the default is None.");
5740
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005741#ifdef HAVE_IF_NAMEINDEX
5742/* Python API for getting interface indices and names */
5743
5744static PyObject *
5745socket_if_nameindex(PyObject *self, PyObject *arg)
5746{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005747 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005748 int i;
5749 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005750
Charles-François Natali60713592011-05-20 16:55:06 +02005751 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005752 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005753 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005754 return NULL;
5755 }
5756
5757 list = PyList_New(0);
5758 if (list == NULL) {
5759 if_freenameindex(ni);
5760 return NULL;
5761 }
5762
Charles-François Natali60713592011-05-20 16:55:06 +02005763 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5764 PyObject *ni_tuple = Py_BuildValue("IO&",
5765 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005766
5767 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5768 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005769 Py_DECREF(list);
5770 if_freenameindex(ni);
5771 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005772 }
5773 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005774 }
5775
5776 if_freenameindex(ni);
5777 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005778}
5779
5780PyDoc_STRVAR(if_nameindex_doc,
5781"if_nameindex()\n\
5782\n\
5783Returns a list of network interface information (index, name) tuples.");
5784
Charles-François Natali60713592011-05-20 16:55:06 +02005785static PyObject *
5786socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005787{
Charles-François Natali60713592011-05-20 16:55:06 +02005788 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005789 unsigned long index;
5790
Charles-François Natali60713592011-05-20 16:55:06 +02005791 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5792 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005793 return NULL;
5794
Charles-François Natali60713592011-05-20 16:55:06 +02005795 index = if_nametoindex(PyBytes_AS_STRING(oname));
5796 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005797 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005798 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005799 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005800 return NULL;
5801 }
5802
5803 return PyLong_FromUnsignedLong(index);
5804}
5805
5806PyDoc_STRVAR(if_nametoindex_doc,
5807"if_nametoindex(if_name)\n\
5808\n\
5809Returns the interface index corresponding to the interface name if_name.");
5810
Charles-François Natali60713592011-05-20 16:55:06 +02005811static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005812socket_if_indextoname(PyObject *self, PyObject *arg)
5813{
Charles-François Natali60713592011-05-20 16:55:06 +02005814 unsigned long index;
5815 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005816
Charles-François Natali60713592011-05-20 16:55:06 +02005817 index = PyLong_AsUnsignedLong(arg);
5818 if (index == (unsigned long) -1)
5819 return NULL;
5820
5821 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005822 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005823 return NULL;
5824 }
5825
Charles-François Natali60713592011-05-20 16:55:06 +02005826 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005827}
5828
5829PyDoc_STRVAR(if_indextoname_doc,
5830"if_indextoname(if_index)\n\
5831\n\
5832Returns the interface name corresponding to the interface index if_index.");
5833
5834#endif /* HAVE_IF_NAMEINDEX */
5835
5836
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005837#ifdef CMSG_LEN
5838/* Python interface to CMSG_LEN(length). */
5839
5840static PyObject *
5841socket_CMSG_LEN(PyObject *self, PyObject *args)
5842{
5843 Py_ssize_t length;
5844 size_t result;
5845
5846 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5847 return NULL;
5848 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5849 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5850 return NULL;
5851 }
5852 return PyLong_FromSize_t(result);
5853}
5854
5855PyDoc_STRVAR(CMSG_LEN_doc,
5856"CMSG_LEN(length) -> control message length\n\
5857\n\
5858Return the total length, without trailing padding, of an ancillary\n\
5859data item with associated data of the given length. This value can\n\
5860often be used as the buffer size for recvmsg() to receive a single\n\
5861item of ancillary data, but RFC 3542 requires portable applications to\n\
5862use CMSG_SPACE() and thus include space for padding, even when the\n\
5863item will be the last in the buffer. Raises OverflowError if length\n\
5864is outside the permissible range of values.");
5865
5866
5867#ifdef CMSG_SPACE
5868/* Python interface to CMSG_SPACE(length). */
5869
5870static PyObject *
5871socket_CMSG_SPACE(PyObject *self, PyObject *args)
5872{
5873 Py_ssize_t length;
5874 size_t result;
5875
5876 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5877 return NULL;
5878 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5879 PyErr_SetString(PyExc_OverflowError,
5880 "CMSG_SPACE() argument out of range");
5881 return NULL;
5882 }
5883 return PyLong_FromSize_t(result);
5884}
5885
5886PyDoc_STRVAR(CMSG_SPACE_doc,
5887"CMSG_SPACE(length) -> buffer size\n\
5888\n\
5889Return the buffer size needed for recvmsg() to receive an ancillary\n\
5890data item with associated data of the given length, along with any\n\
5891trailing padding. The buffer space needed to receive multiple items\n\
5892is the sum of the CMSG_SPACE() values for their associated data\n\
5893lengths. Raises OverflowError if length is outside the permissible\n\
5894range of values.");
5895#endif /* CMSG_SPACE */
5896#endif /* CMSG_LEN */
5897
5898
Guido van Rossum30a685f1991-06-27 15:51:29 +00005899/* List of functions exported by this module. */
5900
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005901static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005902 {"gethostbyname", socket_gethostbyname,
5903 METH_VARARGS, gethostbyname_doc},
5904 {"gethostbyname_ex", socket_gethostbyname_ex,
5905 METH_VARARGS, ghbn_ex_doc},
5906 {"gethostbyaddr", socket_gethostbyaddr,
5907 METH_VARARGS, gethostbyaddr_doc},
5908 {"gethostname", socket_gethostname,
5909 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005910#ifdef HAVE_SETHOSTNAME
5911 {"sethostname", socket_sethostname,
5912 METH_VARARGS, sethostname_doc},
5913#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005914 {"getservbyname", socket_getservbyname,
5915 METH_VARARGS, getservbyname_doc},
5916 {"getservbyport", socket_getservbyport,
5917 METH_VARARGS, getservbyport_doc},
5918 {"getprotobyname", socket_getprotobyname,
5919 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005920#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005921 {"dup", socket_dup,
5922 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005923#endif
Dave Cole331708b2004-08-09 04:51:41 +00005924#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 {"socketpair", socket_socketpair,
5926 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005927#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005928 {"ntohs", socket_ntohs,
5929 METH_VARARGS, ntohs_doc},
5930 {"ntohl", socket_ntohl,
5931 METH_O, ntohl_doc},
5932 {"htons", socket_htons,
5933 METH_VARARGS, htons_doc},
5934 {"htonl", socket_htonl,
5935 METH_O, htonl_doc},
5936 {"inet_aton", socket_inet_aton,
5937 METH_VARARGS, inet_aton_doc},
5938 {"inet_ntoa", socket_inet_ntoa,
5939 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005940#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 {"inet_pton", socket_inet_pton,
5942 METH_VARARGS, inet_pton_doc},
5943 {"inet_ntop", socket_inet_ntop,
5944 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005945#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005946 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5947 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 {"getnameinfo", socket_getnameinfo,
5949 METH_VARARGS, getnameinfo_doc},
5950 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5951 METH_NOARGS, getdefaulttimeout_doc},
5952 {"setdefaulttimeout", socket_setdefaulttimeout,
5953 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005954#ifdef HAVE_IF_NAMEINDEX
5955 {"if_nameindex", socket_if_nameindex,
5956 METH_NOARGS, if_nameindex_doc},
5957 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005958 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005959 {"if_indextoname", socket_if_indextoname,
5960 METH_O, if_indextoname_doc},
5961#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005962#ifdef CMSG_LEN
5963 {"CMSG_LEN", socket_CMSG_LEN,
5964 METH_VARARGS, CMSG_LEN_doc},
5965#ifdef CMSG_SPACE
5966 {"CMSG_SPACE", socket_CMSG_SPACE,
5967 METH_VARARGS, CMSG_SPACE_doc},
5968#endif
5969#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005971};
5972
Guido van Rossum30a685f1991-06-27 15:51:29 +00005973
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005974#ifdef MS_WINDOWS
5975#define OS_INIT_DEFINED
5976
5977/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005978
5979static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005980os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005983}
5984
5985static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005986os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005988 WSADATA WSAData;
5989 int ret;
5990 ret = WSAStartup(0x0101, &WSAData);
5991 switch (ret) {
5992 case 0: /* No error */
5993 Py_AtExit(os_cleanup);
5994 return 1; /* Success */
5995 case WSASYSNOTREADY:
5996 PyErr_SetString(PyExc_ImportError,
5997 "WSAStartup failed: network not ready");
5998 break;
5999 case WSAVERNOTSUPPORTED:
6000 case WSAEINVAL:
6001 PyErr_SetString(
6002 PyExc_ImportError,
6003 "WSAStartup failed: requested version not supported");
6004 break;
6005 default:
6006 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6007 break;
6008 }
6009 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006010}
6011
Guido van Rossum8d665e61996-06-26 18:22:49 +00006012#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006013
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006014
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006015
6016#ifndef OS_INIT_DEFINED
6017static int
6018os_init(void)
6019{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006021}
6022#endif
6023
6024
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006025/* C API table - always add new things to the end for binary
6026 compatibility. */
6027static
6028PySocketModule_APIObject PySocketModuleAPI =
6029{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006030 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006031 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006032 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006033};
6034
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006035
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006036/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006037
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006038 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006039 "socket.py" which implements some additional functionality.
6040 The import of "_socket" may fail with an ImportError exception if
6041 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006042 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006043 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006044*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006045
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006046PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006047"Implementation module for socket operations.\n\
6048\n\
6049See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006050
Martin v. Löwis1a214512008-06-11 05:26:20 +00006051static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 PyModuleDef_HEAD_INIT,
6053 PySocket_MODULE_NAME,
6054 socket_doc,
6055 -1,
6056 socket_methods,
6057 NULL,
6058 NULL,
6059 NULL,
6060 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006061};
6062
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006063PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006064PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006065{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006066 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 if (!os_init())
6069 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006070
Victor Stinnerdaf45552013-08-28 00:53:59 +02006071#ifdef MS_WINDOWS
6072 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006073#if defined(_MSC_VER) && _MSC_VER >= 1800
6074 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6075#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006076 DWORD version = GetVersion();
6077 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6078 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6079 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006080 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6081#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006082 }
6083#endif
6084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 Py_TYPE(&sock_type) = &PyType_Type;
6086 m = PyModule_Create(&socketmodule);
6087 if (m == NULL)
6088 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006089
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006090 Py_INCREF(PyExc_OSError);
6091 PySocketModuleAPI.error = PyExc_OSError;
6092 Py_INCREF(PyExc_OSError);
6093 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006095 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 if (socket_herror == NULL)
6097 return NULL;
6098 Py_INCREF(socket_herror);
6099 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006100 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006101 NULL);
6102 if (socket_gaierror == NULL)
6103 return NULL;
6104 Py_INCREF(socket_gaierror);
6105 PyModule_AddObject(m, "gaierror", socket_gaierror);
6106 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006107 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006108 if (socket_timeout == NULL)
6109 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006110 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 Py_INCREF(socket_timeout);
6112 PyModule_AddObject(m, "timeout", socket_timeout);
6113 Py_INCREF((PyObject *)&sock_type);
6114 if (PyModule_AddObject(m, "SocketType",
6115 (PyObject *)&sock_type) != 0)
6116 return NULL;
6117 Py_INCREF((PyObject *)&sock_type);
6118 if (PyModule_AddObject(m, "socket",
6119 (PyObject *)&sock_type) != 0)
6120 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006121
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006122#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006125 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006126#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127 Py_INCREF(has_ipv6);
6128 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 /* Export C API */
6131 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6132 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6133 ) != 0)
6134 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006137#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006138 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006139#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006140 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006141#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006142 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006143#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006144#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006146#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006147#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006148 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006149 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006150#endif
6151#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006152 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006153#endif
6154#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006156 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006157#endif
6158#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006161#endif
6162#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006164 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006165#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006166#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006168 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006169#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006170#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006173#endif
6174#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006176 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006177#endif
6178#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006180#endif
6181#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006184#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006185#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006188#endif
6189#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006192#endif
6193#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006196#endif
6197#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006200#endif
6201#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, AF_NETLINK);
6204 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006205#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006207#endif
6208#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006209 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006210#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6212 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006213#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006215#endif
6216#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006218#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006219#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006220 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006221#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006222#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006223 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006224#endif
6225#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006226 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006227#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006229#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006231#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006232#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006234#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006235#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006236#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006239#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006240#ifdef AF_LINK
6241 PyModule_AddIntMacro(m, AF_LINK);
6242#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006243#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006245 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006246#endif
6247#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006250#endif
6251#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006254#endif
6255#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006258#endif
6259#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006260 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006261 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006262#endif
6263#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006266#endif
6267#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006268 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006269 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006270#endif
6271#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006272 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006274#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006275
Hye-Shik Chang81268602004-02-02 06:05:24 +00006276#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006277 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6278 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6279 PyModule_AddIntMacro(m, BTPROTO_HCI);
6280 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006281#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006283#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006284#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006285#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006287#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6289 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006290#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006292 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6293 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006294#endif
6295
Charles-François Natali47413c12011-10-06 19:47:44 +02006296#ifdef AF_CAN
6297 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006299#endif
6300#ifdef PF_CAN
6301 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006303#endif
6304
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006305/* Reliable Datagram Sockets */
6306#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006307 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006308#endif
6309#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006310 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006311#endif
6312
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006313/* Kernel event messages */
6314#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006315 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006316#endif
6317#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006319#endif
6320
Antoine Pitroub156a462010-10-27 20:13:57 +00006321#ifdef AF_PACKET
6322 PyModule_AddIntMacro(m, AF_PACKET);
6323#endif
6324#ifdef PF_PACKET
6325 PyModule_AddIntMacro(m, PF_PACKET);
6326#endif
6327#ifdef PACKET_HOST
6328 PyModule_AddIntMacro(m, PACKET_HOST);
6329#endif
6330#ifdef PACKET_BROADCAST
6331 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6332#endif
6333#ifdef PACKET_MULTICAST
6334 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6335#endif
6336#ifdef PACKET_OTHERHOST
6337 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6338#endif
6339#ifdef PACKET_OUTGOING
6340 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6341#endif
6342#ifdef PACKET_LOOPBACK
6343 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6344#endif
6345#ifdef PACKET_FASTROUTE
6346 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006347#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006348
Christian Heimes043d6f62008-01-07 17:19:16 +00006349#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6354 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6355 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006356
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006357 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6358 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6359 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006360
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, SOL_TIPC);
6363 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6364 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6365 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6366 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006367
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6369 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6370 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6371 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006374 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6375 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006376#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006378 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006379#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006380 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6381 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6382 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6383 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6384 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6385 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006386#endif
6387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SOCK_STREAM);
6390 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006391/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, SOCK_RAW);
6393 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006394#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006396#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006397#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006398 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006399#endif
6400#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006401 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006402#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006412#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006413#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006414 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006415#endif
6416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006430 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006464#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006465#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006467#endif
6468#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006469 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006470#endif
6471#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006472 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006473#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006474#ifdef SO_BINDTODEVICE
6475 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6476#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006477#ifdef SO_PRIORITY
6478 PyModule_AddIntMacro(m, SO_PRIORITY);
6479#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006480#ifdef SO_MARK
6481 PyModule_AddIntMacro(m, SO_MARK);
6482#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484 /* Maximum number of connections for "listen" */
6485#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006486 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006487#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006488 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006489#endif
6490
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006491 /* Ancilliary message types */
6492#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006494#endif
6495#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006497#endif
6498#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006500#endif
6501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502 /* Flags for send, recv */
6503#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006518#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006529#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006530#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006532#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006533#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006535#endif
6536#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006537 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006538#endif
6539#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006541#endif
6542#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006544#endif
6545#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006547#endif
6548#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006550#endif
6551#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006553#endif
6554#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006556#endif
6557#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006559#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006560#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006562#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564 /* Protocol level and numbers, usable for [gs]etsockopt */
6565#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006569 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006570#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006589 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006590#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006595#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006597#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006598#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006600#endif
6601#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006602 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6603 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006604#endif
6605#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6607 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6608 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006609
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6611 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6612 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006613#endif
6614#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6616 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6617 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6618 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006619#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006620#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006622 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6623 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6624 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6625 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6626 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6627 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6628 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6629 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6630 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6631 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6632 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6633 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6634#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006635#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006637#endif
6638#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006640#endif
6641#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006643#endif
6644#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006646#endif
6647#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006649#endif
6650#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006652#endif
6653#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006658#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006666#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006686#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006691#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006692#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006693 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006695#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006696 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006697#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006700#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006703#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006709#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006718#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006759#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006760#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006765#endif
6766/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006769#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006774#endif
6775
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006776#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006777 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006778#endif
6779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 /* Some port configuration */
6781#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006783#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006788#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006790#endif
6791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792 /* Some reserved IP v.4 addresses */
6793#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006795#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006797#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006798#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006800#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006801 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006805#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006808#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006810#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813#ifdef INADDR_ALLHOSTS_GROUP
6814 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6815 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006816#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006817 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006821#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006824#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006826#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006827 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006828#endif
6829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830 /* IPv4 [gs]etsockopt options */
6831#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006834#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006837#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006843#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006846#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006849#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006856 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006858#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006859 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006878#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006879#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006881#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6884#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006887#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006897 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006900 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006901#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006903#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006906 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006907#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006909#endif
6910#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006912#endif
6913#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006915#endif
6916#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006918#endif
6919#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006921#endif
6922#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006924#endif
6925#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006927#endif
6928#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006930#endif
6931#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006933#endif
6934#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006936#endif
6937#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006939#endif
6940#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006942#endif
6943#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006945#endif
6946#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006948#endif
6949#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006951#endif
6952#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006954#endif
6955#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006957#endif
6958#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006960#endif
6961#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006963#endif
6964#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006966#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968 /* TCP options */
6969#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006987#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006990#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006996#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006999#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007002#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007004#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007005#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007007#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007008
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007009 /* IPX options */
7010#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007011 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007012#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007013
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007014/* Reliable Datagram Sockets */
7015#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007017#endif
7018#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007020#endif
7021#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007023#endif
7024#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007026#endif
7027#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007029#endif
7030#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007032#endif
7033#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007035#endif
7036#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007038#endif
7039#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007041#endif
7042#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007044#endif
7045#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007047#endif
7048#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007050#endif
7051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007052 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007053#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007055#endif
7056#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007058#endif
7059#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007061#endif
7062#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007064#endif
7065#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007067#endif
7068#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007070#endif
7071#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007073#endif
7074#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007076#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007077#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007079#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007080#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007082#endif
7083#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007085#endif
7086#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007088#endif
7089#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007091#endif
7092#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007094#endif
7095#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007097#endif
7098#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007100#endif
7101#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007103#endif
7104#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007106#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007107#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007109#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007110#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007112#endif
7113#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007115#endif
7116#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007118#endif
7119#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007121#endif
7122#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007124#endif
7125#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007127#endif
7128#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007130#endif
7131#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007133#endif
7134#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007136#endif
7137#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007139#endif
7140#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007142#endif
7143#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007145#endif
7146#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007148#endif
7149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007151#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007152 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007153#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007155#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007156 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007157#endif
7158#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007160#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007161 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007162#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007164#endif
7165#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007166 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007167#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007169#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007170 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007171#endif
7172
Christian Heimesfaf2f632008-01-06 16:59:19 +00007173#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007174 {
7175 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7176 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7177 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007178 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007179 PyObject *tmp;
7180 tmp = PyLong_FromUnsignedLong(codes[i]);
7181 if (tmp == NULL)
7182 return NULL;
7183 PyModule_AddObject(m, names[i], tmp);
7184 }
7185 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007186 PyModule_AddIntMacro(m, RCVALL_OFF);
7187 PyModule_AddIntMacro(m, RCVALL_ON);
7188 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007189#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007190 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007191#endif
7192#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007193 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007194#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007195#endif /* _MSTCPIP_ */
7196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007197 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007198#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007199 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007200#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007202}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007203
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007204
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007205#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007206#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007207
7208/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007209/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007210
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007211int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007212inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007214 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007215#if (SIZEOF_INT != 4)
7216#error "Not sure if in_addr_t exists and int is not 32-bits."
7217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007218 unsigned int packed_addr;
7219 packed_addr = inet_addr(src);
7220 if (packed_addr == INADDR_NONE)
7221 return 0;
7222 memcpy(dst, &packed_addr, 4);
7223 return 1;
7224 }
7225 /* Should set errno to EAFNOSUPPORT */
7226 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007227}
7228
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007229const char *
7230inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007232 if (af == AF_INET) {
7233 struct in_addr packed_addr;
7234 if (size < 16)
7235 /* Should set errno to ENOSPC. */
7236 return NULL;
7237 memcpy(&packed_addr, src, sizeof(packed_addr));
7238 return strncpy(dst, inet_ntoa(packed_addr), size);
7239 }
7240 /* Should set errno to EAFNOSUPPORT */
7241 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007242}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007243
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007244#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007245#endif