blob: 1ecec5a3b9cb78a810a8d23c6f8e5581831087da [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 Stinner71694d52015-03-28 01:18:54 +0100617 struct timeval tv;
618#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 Stinner10550cd2015-04-03 13:22:27 +0200653 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000654
Victor Stinner71694d52015-03-28 01:18:54 +0100655 FD_ZERO(&fds);
656 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200657 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200658 if (connect) {
659 /* On Windows, the socket becomes writable on connection success,
660 but a connection failure is notified as an error. On POSIX, the
661 socket becomes writable on connection success or on connection
662 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200663 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200664 }
Victor Stinner71694d52015-03-28 01:18:54 +0100665
666 /* See if the socket is ready */
667 Py_BEGIN_ALLOW_THREADS;
668 if (writing)
669 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200670 NULL, &fds, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100671 else
672 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200673 &fds, NULL, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100674 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (n < 0)
678 return -1;
679 if (n == 0)
680 return 1;
681 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682}
683
Victor Stinner31bf2d52015-04-01 21:57:09 +0200684/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685
Victor Stinner81c41db2015-04-02 11:50:57 +0200686 On error, raise an exception and return -1 if err is set, or fill err and
687 return -1 otherwise. If a signal was received and the signal handler raised
688 an exception, return -1, and set err to -1 if err is set.
689
690 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100691
Victor Stinner31bf2d52015-04-01 21:57:09 +0200692 If the socket has a timeout, wait until the socket is ready before calling
693 the function: wait until the socket is writable if writing is nonzero, wait
694 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100695
Victor Stinner81c41db2015-04-02 11:50:57 +0200696 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200697 the function, except if the signal handler raised an exception (PEP 475).
698
699 When the function is retried, recompute the timeout using a monotonic clock.
700
Victor Stinner81c41db2015-04-02 11:50:57 +0200701 sock_call_ex() must be called with the GIL held. The socket function is
702 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200703static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200704sock_call_ex(PySocketSockObject *s,
705 int writing,
706 int (*sock_func) (PySocketSockObject *s, void *data),
707 void *data,
708 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200709 int *err,
710 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200711{
Victor Stinner8912d142015-04-06 23:16:34 +0200712 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200713 _PyTime_t deadline = 0;
714 int deadline_initialized = 0;
715 int res;
716
717 /* sock_call() must be called with the GIL held. */
718 assert(PyGILState_Check());
719
720 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200721 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200722 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200723 /* For connect(), poll even for blocking socket. The connection
724 runs asynchronously. */
725 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200726 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200727 _PyTime_t interval;
728
Victor Stinner81c41db2015-04-02 11:50:57 +0200729 if (deadline_initialized) {
730 /* recompute the timeout */
731 interval = deadline - _PyTime_GetMonotonicClock();
732 }
733 else {
734 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200735 deadline = _PyTime_GetMonotonicClock() + timeout;
736 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200737 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200738
Victor Stinner10550cd2015-04-03 13:22:27 +0200739 if (interval >= 0)
740 res = internal_select(s, writing, interval, connect);
741 else
742 res = 1;
743 }
744 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200745 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200746 }
747
Victor Stinner31bf2d52015-04-01 21:57:09 +0200748 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200749 if (err)
750 *err = GET_SOCK_ERROR;
751
Victor Stinner31bf2d52015-04-01 21:57:09 +0200752 if (CHECK_ERRNO(EINTR)) {
753 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200754 if (PyErr_CheckSignals()) {
755 if (err)
756 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200757 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200758 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200759
760 /* retry select() */
761 continue;
762 }
763
764 /* select() failed */
765 s->errorhandler();
766 return -1;
767 }
768
769 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200770 if (err)
771 *err = SOCK_TIMEOUT_ERR;
772 else
773 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200774 return -1;
775 }
776
777 /* the socket is ready */
778 }
779
Victor Stinner81c41db2015-04-02 11:50:57 +0200780 /* inner loop to retry sock_func() when sock_func() is interrupted
781 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200782 while (1) {
783 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200784 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200785 Py_END_ALLOW_THREADS
786
787 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200788 /* sock_func() succeeded */
789 if (err)
790 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200791 return 0;
792 }
793
Victor Stinner81c41db2015-04-02 11:50:57 +0200794 if (err)
795 *err = GET_SOCK_ERROR;
796
Victor Stinner31bf2d52015-04-01 21:57:09 +0200797 if (!CHECK_ERRNO(EINTR))
798 break;
799
Victor Stinner81c41db2015-04-02 11:50:57 +0200800 /* sock_func() was interrupted by a signal */
801 if (PyErr_CheckSignals()) {
802 if (err)
803 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200804 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200805 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200806
Victor Stinner81c41db2015-04-02 11:50:57 +0200807 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200808 }
809
810 if (s->sock_timeout > 0
811 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813
814 For example, select() could indicate a socket is ready for
815 reading, but the data then discarded by the OS because of a
816 wrong checksum.
817
818 Loop on select() to recheck for socket readyness. */
819 continue;
820 }
821
Victor Stinner81c41db2015-04-02 11:50:57 +0200822 /* sock_func() failed */
823 if (!err)
824 s->errorhandler();
825 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000826 return -1;
827 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200828}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000829
Victor Stinner81c41db2015-04-02 11:50:57 +0200830static int
831sock_call(PySocketSockObject *s,
832 int writing,
833 int (*func) (PySocketSockObject *s, void *data),
834 void *data)
835{
Victor Stinner8912d142015-04-06 23:16:34 +0200836 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200837}
838
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000839
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000840/* Initialize a new socket object. */
841
Victor Stinner71694d52015-03-28 01:18:54 +0100842static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000843
Martin v. Löwis1a214512008-06-11 05:26:20 +0000844static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000845init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000846 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 s->sock_fd = fd;
849 s->sock_family = family;
850 s->sock_type = type;
851 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000854#ifdef SOCK_NONBLOCK
855 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100856 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000857 else
858#endif
859 {
860 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100861 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000862 internal_setblocking(s, 0);
863 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000864
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000865}
866
867
Guido van Rossum30a685f1991-06-27 15:51:29 +0000868/* Create a new socket object.
869 This just creates the object and initializes it.
870 If the creation fails, return NULL and set an exception (implicit
871 in NEWOBJ()). */
872
Guido van Rossum73624e91994-10-10 17:59:00 +0000873static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000874new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000875{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000876 PySocketSockObject *s;
877 s = (PySocketSockObject *)
878 PyType_GenericNew(&sock_type, NULL, NULL);
879 if (s != NULL)
880 init_sockobject(s, fd, family, type, proto);
881 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000882}
883
Guido van Rossum30a685f1991-06-27 15:51:29 +0000884
Guido van Rossum48a680c2001-03-02 06:34:14 +0000885/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000886 thread to be in gethostbyname or getaddrinfo */
887#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200888static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000889#endif
890
891
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892/* Convert a string specifying a host name or one of a few symbolic
893 names to a numeric IP address. This usually calls gethostbyname()
894 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000895 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000896 an error occurred; then an exception is raised. */
897
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000898static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000899setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000900{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 struct addrinfo hints, *res;
902 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
905 if (name[0] == '\0') {
906 int siz;
907 memset(&hints, 0, sizeof(hints));
908 hints.ai_family = af;
909 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
910 hints.ai_flags = AI_PASSIVE;
911 Py_BEGIN_ALLOW_THREADS
912 ACQUIRE_GETADDRINFO_LOCK
913 error = getaddrinfo(NULL, "0", &hints, &res);
914 Py_END_ALLOW_THREADS
915 /* We assume that those thread-unsafe getaddrinfo() versions
916 *are* safe regarding their return value, ie. that a
917 subsequent call to getaddrinfo() does not destroy the
918 outcome of the first call. */
919 RELEASE_GETADDRINFO_LOCK
920 if (error) {
921 set_gaierror(error);
922 return -1;
923 }
924 switch (res->ai_family) {
925 case AF_INET:
926 siz = 4;
927 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000928#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 case AF_INET6:
930 siz = 16;
931 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 default:
934 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200935 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 "unsupported address family");
937 return -1;
938 }
939 if (res->ai_next) {
940 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200941 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 "wildcard resolved to multiple address");
943 return -1;
944 }
945 if (res->ai_addrlen < addr_ret_size)
946 addr_ret_size = res->ai_addrlen;
947 memcpy(addr_ret, res->ai_addr, addr_ret_size);
948 freeaddrinfo(res);
949 return siz;
950 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200951 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100952 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200953 if (strcmp(name, "255.255.255.255") == 0 ||
954 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 struct sockaddr_in *sin;
956 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200957 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 "address family mismatched");
959 return -1;
960 }
961 sin = (struct sockaddr_in *)addr_ret;
962 memset((void *) sin, '\0', sizeof(*sin));
963 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000964#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000966#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 sin->sin_addr.s_addr = INADDR_BROADCAST;
968 return sizeof(sin->sin_addr);
969 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200970
971 /* avoid a name resolution in case of numeric address */
972#ifdef HAVE_INET_PTON
973 /* check for an IPv4 address */
974 if (af == AF_UNSPEC || af == AF_INET) {
975 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
976 memset(sin, 0, sizeof(*sin));
977 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
978 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000979#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200980 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000981#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200982 return 4;
983 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200985#ifdef ENABLE_IPV6
986 /* check for an IPv6 address - if the address contains a scope ID, we
987 * fallback to getaddrinfo(), which can handle translation from interface
988 * name to interface index */
989 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
990 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
991 memset(sin, 0, sizeof(*sin));
992 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
993 sin->sin6_family = AF_INET6;
994#ifdef HAVE_SOCKADDR_SA_LEN
995 sin->sin6_len = sizeof(*sin);
996#endif
997 return 16;
998 }
999 }
1000#endif /* ENABLE_IPV6 */
1001#else /* HAVE_INET_PTON */
1002 /* check for an IPv4 address */
1003 if (af == AF_INET || af == AF_UNSPEC) {
1004 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1005 memset(sin, 0, sizeof(*sin));
1006 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1007 sin->sin_family = AF_INET;
1008#ifdef HAVE_SOCKADDR_SA_LEN
1009 sin->sin_len = sizeof(*sin);
1010#endif
1011 return 4;
1012 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001013 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001014#endif /* HAVE_INET_PTON */
1015
1016 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 memset(&hints, 0, sizeof(hints));
1018 hints.ai_family = af;
1019 Py_BEGIN_ALLOW_THREADS
1020 ACQUIRE_GETADDRINFO_LOCK
1021 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001022#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 if (error == EAI_NONAME && af == AF_UNSPEC) {
1024 /* On Tru64 V5.1, numeric-to-addr conversion fails
1025 if no address family is given. Assume IPv4 for now.*/
1026 hints.ai_family = AF_INET;
1027 error = getaddrinfo(name, NULL, &hints, &res);
1028 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001029#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 Py_END_ALLOW_THREADS
1031 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1032 if (error) {
1033 set_gaierror(error);
1034 return -1;
1035 }
1036 if (res->ai_addrlen < addr_ret_size)
1037 addr_ret_size = res->ai_addrlen;
1038 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1039 freeaddrinfo(res);
1040 switch (addr_ret->sa_family) {
1041 case AF_INET:
1042 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001043#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 case AF_INET6:
1045 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001046#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001048 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 return -1;
1050 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001051}
1052
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053
Guido van Rossum30a685f1991-06-27 15:51:29 +00001054/* Create a string object representing an IP address.
1055 This is always a string of the form 'dd.dd.dd.dd' (with variable
1056 size numbers). */
1057
Guido van Rossum73624e91994-10-10 17:59:00 +00001058static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001059makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001061 char buf[NI_MAXHOST];
1062 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001063
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001064 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1065 NI_NUMERICHOST);
1066 if (error) {
1067 set_gaierror(error);
1068 return NULL;
1069 }
1070 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001071}
1072
1073
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001074#ifdef USE_BLUETOOTH
1075/* Convert a string representation of a Bluetooth address into a numeric
1076 address. Returns the length (6), or raises an exception and returns -1 if
1077 an error occurred. */
1078
1079static int
1080setbdaddr(char *name, bdaddr_t *bdaddr)
1081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001082 unsigned int b0, b1, b2, b3, b4, b5;
1083 char ch;
1084 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1087 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1088 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1089 bdaddr->b[0] = b0;
1090 bdaddr->b[1] = b1;
1091 bdaddr->b[2] = b2;
1092 bdaddr->b[3] = b3;
1093 bdaddr->b[4] = b4;
1094 bdaddr->b[5] = b5;
1095 return 6;
1096 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001097 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 return -1;
1099 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001100}
1101
1102/* Create a string representation of the Bluetooth address. This is always a
1103 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1104 value (zero padded if necessary). */
1105
1106static PyObject *
1107makebdaddr(bdaddr_t *bdaddr)
1108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001109 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001110
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1112 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1113 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1114 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001115}
1116#endif
1117
1118
Guido van Rossum30a685f1991-06-27 15:51:29 +00001119/* Create an object representing the given socket address,
1120 suitable for passing it back to bind(), connect() etc.
1121 The family field of the sockaddr structure is inspected
1122 to determine what kind of address it really is. */
1123
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001124/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001125static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001126makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001127{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001128 if (addrlen == 0) {
1129 /* No address -- may be recvfrom() from known socket */
1130 Py_INCREF(Py_None);
1131 return Py_None;
1132 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001134 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 case AF_INET:
1137 {
1138 struct sockaddr_in *a;
1139 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1140 PyObject *ret = NULL;
1141 if (addrobj) {
1142 a = (struct sockaddr_in *)addr;
1143 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1144 Py_DECREF(addrobj);
1145 }
1146 return ret;
1147 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001148
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001149#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001150 case AF_UNIX:
1151 {
1152 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001153#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001154 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1155 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001156 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001157 }
1158 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001159#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001160 {
1161 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001162 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 }
1164 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001165#endif /* AF_UNIX */
1166
Martin v. Löwis11017b12006-01-14 18:12:57 +00001167#if defined(AF_NETLINK)
1168 case AF_NETLINK:
1169 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1171 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001172 }
1173#endif /* AF_NETLINK */
1174
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001175#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 case AF_INET6:
1177 {
1178 struct sockaddr_in6 *a;
1179 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1180 PyObject *ret = NULL;
1181 if (addrobj) {
1182 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001183 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 addrobj,
1185 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001186 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001187 a->sin6_scope_id);
1188 Py_DECREF(addrobj);
1189 }
1190 return ret;
1191 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001192#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001193
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001194#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 case AF_BLUETOOTH:
1196 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 case BTPROTO_L2CAP:
1199 {
1200 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1201 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1202 PyObject *ret = NULL;
1203 if (addrobj) {
1204 ret = Py_BuildValue("Oi",
1205 addrobj,
1206 _BT_L2_MEMB(a, psm));
1207 Py_DECREF(addrobj);
1208 }
1209 return ret;
1210 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001212 case BTPROTO_RFCOMM:
1213 {
1214 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1215 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1216 PyObject *ret = NULL;
1217 if (addrobj) {
1218 ret = Py_BuildValue("Oi",
1219 addrobj,
1220 _BT_RC_MEMB(a, channel));
1221 Py_DECREF(addrobj);
1222 }
1223 return ret;
1224 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001226 case BTPROTO_HCI:
1227 {
1228 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001229#if defined(__NetBSD__) || defined(__DragonFly__)
1230 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1231#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 PyObject *ret = NULL;
1233 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1234 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001235#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001236 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001237
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001238#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 case BTPROTO_SCO:
1240 {
1241 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1242 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1243 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001244#endif
1245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001246 default:
1247 PyErr_SetString(PyExc_ValueError,
1248 "Unknown Bluetooth protocol");
1249 return NULL;
1250 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001251#endif
1252
Antoine Pitroub156a462010-10-27 20:13:57 +00001253#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 case AF_PACKET:
1255 {
1256 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1257 char *ifname = "";
1258 struct ifreq ifr;
1259 /* need to look up interface name give index */
1260 if (a->sll_ifindex) {
1261 ifr.ifr_ifindex = a->sll_ifindex;
1262 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1263 ifname = ifr.ifr_name;
1264 }
1265 return Py_BuildValue("shbhy#",
1266 ifname,
1267 ntohs(a->sll_protocol),
1268 a->sll_pkttype,
1269 a->sll_hatype,
1270 a->sll_addr,
1271 a->sll_halen);
1272 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001273#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001274
Christian Heimes043d6f62008-01-07 17:19:16 +00001275#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 case AF_TIPC:
1277 {
1278 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1279 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1280 return Py_BuildValue("IIIII",
1281 a->addrtype,
1282 a->addr.nameseq.type,
1283 a->addr.nameseq.lower,
1284 a->addr.nameseq.upper,
1285 a->scope);
1286 } else if (a->addrtype == TIPC_ADDR_NAME) {
1287 return Py_BuildValue("IIIII",
1288 a->addrtype,
1289 a->addr.name.name.type,
1290 a->addr.name.name.instance,
1291 a->addr.name.name.instance,
1292 a->scope);
1293 } else if (a->addrtype == TIPC_ADDR_ID) {
1294 return Py_BuildValue("IIIII",
1295 a->addrtype,
1296 a->addr.id.node,
1297 a->addr.id.ref,
1298 0,
1299 a->scope);
1300 } else {
1301 PyErr_SetString(PyExc_ValueError,
1302 "Invalid address type");
1303 return NULL;
1304 }
1305 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001306#endif
1307
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001308#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001309 case AF_CAN:
1310 {
1311 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1312 char *ifname = "";
1313 struct ifreq ifr;
1314 /* need to look up interface name given index */
1315 if (a->can_ifindex) {
1316 ifr.ifr_ifindex = a->can_ifindex;
1317 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1318 ifname = ifr.ifr_name;
1319 }
1320
1321 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1322 ifname,
1323 a->can_family);
1324 }
1325#endif
1326
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001327#ifdef PF_SYSTEM
1328 case PF_SYSTEM:
1329 switch(proto) {
1330#ifdef SYSPROTO_CONTROL
1331 case SYSPROTO_CONTROL:
1332 {
1333 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1334 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1335 }
1336#endif
1337 default:
1338 PyErr_SetString(PyExc_ValueError,
1339 "Invalid address type");
1340 return 0;
1341 }
1342#endif
1343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001346 default:
1347 /* If we don't know the address family, don't raise an
1348 exception -- return it as an (int, bytes) tuple. */
1349 return Py_BuildValue("iy#",
1350 addr->sa_family,
1351 addr->sa_data,
1352 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001355}
1356
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001357/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1358 (in particular, numeric IP addresses). */
1359struct maybe_idna {
1360 PyObject *obj;
1361 char *buf;
1362};
1363
1364static void
1365idna_cleanup(struct maybe_idna *data)
1366{
1367 Py_CLEAR(data->obj);
1368}
1369
1370static int
1371idna_converter(PyObject *obj, struct maybe_idna *data)
1372{
1373 size_t len;
1374 PyObject *obj2, *obj3;
1375 if (obj == NULL) {
1376 idna_cleanup(data);
1377 return 1;
1378 }
1379 data->obj = NULL;
1380 len = -1;
1381 if (PyBytes_Check(obj)) {
1382 data->buf = PyBytes_AsString(obj);
1383 len = PyBytes_Size(obj);
1384 }
1385 else if (PyByteArray_Check(obj)) {
1386 data->buf = PyByteArray_AsString(obj);
1387 len = PyByteArray_Size(obj);
1388 }
1389 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1390 data->buf = PyUnicode_DATA(obj);
1391 len = PyUnicode_GET_LENGTH(obj);
1392 }
1393 else {
1394 obj2 = PyUnicode_FromObject(obj);
1395 if (!obj2) {
1396 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1397 obj->ob_type->tp_name);
1398 return 0;
1399 }
1400 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1401 Py_DECREF(obj2);
1402 if (!obj3) {
1403 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1404 return 0;
1405 }
1406 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001407 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001408 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1409 return 0;
1410 }
1411 data->obj = obj3;
1412 data->buf = PyBytes_AS_STRING(obj3);
1413 len = PyBytes_GET_SIZE(obj3);
1414 }
1415 if (strlen(data->buf) != len) {
1416 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001417 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001418 return 0;
1419 }
1420 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001421}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001422
1423/* Parse a socket address argument according to the socket object's
1424 address family. Return 1 if the address was in the proper format,
1425 0 of not. The address is returned through addr_ret, its length
1426 through len_ret. */
1427
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001428static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001429getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001432 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001433
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001434#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001435 case AF_UNIX:
1436 {
1437 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001438 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001439 int retval = 0;
1440
1441 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1442 allow embedded nulls on Linux. */
1443 if (PyUnicode_Check(args)) {
1444 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1445 return 0;
1446 }
1447 else
1448 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001449 if (!PyArg_Parse(args, "y*", &path)) {
1450 Py_DECREF(args);
1451 return retval;
1452 }
1453 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001456#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001457 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001458 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001459 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001460 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001462 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 }
1464 }
1465 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001466#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001467 {
1468 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001469 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001470 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001472 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001473 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001474 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 }
1476 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001477 memcpy(addr->sun_path, path.buf, path.len);
1478 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001479 retval = 1;
1480 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001481 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001482 Py_DECREF(args);
1483 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001485#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001486
Martin v. Löwis11017b12006-01-14 18:12:57 +00001487#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 case AF_NETLINK:
1489 {
1490 struct sockaddr_nl* addr;
1491 int pid, groups;
1492 addr = (struct sockaddr_nl *)addr_ret;
1493 if (!PyTuple_Check(args)) {
1494 PyErr_Format(
1495 PyExc_TypeError,
1496 "getsockaddrarg: "
1497 "AF_NETLINK address must be tuple, not %.500s",
1498 Py_TYPE(args)->tp_name);
1499 return 0;
1500 }
1501 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1502 return 0;
1503 addr->nl_family = AF_NETLINK;
1504 addr->nl_pid = pid;
1505 addr->nl_groups = groups;
1506 *len_ret = sizeof(*addr);
1507 return 1;
1508 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001509#endif
1510
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001511#ifdef AF_RDS
1512 case AF_RDS:
1513 /* RDS sockets use sockaddr_in: fall-through */
1514#endif
1515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001516 case AF_INET:
1517 {
1518 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001519 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001520 int port, result;
1521 if (!PyTuple_Check(args)) {
1522 PyErr_Format(
1523 PyExc_TypeError,
1524 "getsockaddrarg: "
1525 "AF_INET address must be tuple, not %.500s",
1526 Py_TYPE(args)->tp_name);
1527 return 0;
1528 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001529 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1530 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001531 return 0;
1532 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001533 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001534 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001535 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001536 if (result < 0)
1537 return 0;
1538 if (port < 0 || port > 0xffff) {
1539 PyErr_SetString(
1540 PyExc_OverflowError,
1541 "getsockaddrarg: port must be 0-65535.");
1542 return 0;
1543 }
1544 addr->sin_family = AF_INET;
1545 addr->sin_port = htons((short)port);
1546 *len_ret = sizeof *addr;
1547 return 1;
1548 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001549
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001550#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001551 case AF_INET6:
1552 {
1553 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001554 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001555 int port, result;
1556 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001557 flowinfo = scope_id = 0;
1558 if (!PyTuple_Check(args)) {
1559 PyErr_Format(
1560 PyExc_TypeError,
1561 "getsockaddrarg: "
1562 "AF_INET6 address must be tuple, not %.500s",
1563 Py_TYPE(args)->tp_name);
1564 return 0;
1565 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001566 if (!PyArg_ParseTuple(args, "O&i|II",
1567 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001568 &scope_id)) {
1569 return 0;
1570 }
1571 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001572 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001574 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 if (result < 0)
1576 return 0;
1577 if (port < 0 || port > 0xffff) {
1578 PyErr_SetString(
1579 PyExc_OverflowError,
1580 "getsockaddrarg: port must be 0-65535.");
1581 return 0;
1582 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001583 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001584 PyErr_SetString(
1585 PyExc_OverflowError,
1586 "getsockaddrarg: flowinfo must be 0-1048575.");
1587 return 0;
1588 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001589 addr->sin6_family = s->sock_family;
1590 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001591 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001592 addr->sin6_scope_id = scope_id;
1593 *len_ret = sizeof *addr;
1594 return 1;
1595 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001596#endif
1597
Hye-Shik Chang81268602004-02-02 06:05:24 +00001598#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001599 case AF_BLUETOOTH:
1600 {
1601 switch (s->sock_proto) {
1602 case BTPROTO_L2CAP:
1603 {
1604 struct sockaddr_l2 *addr;
1605 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 addr = (struct sockaddr_l2 *)addr_ret;
1608 memset(addr, 0, sizeof(struct sockaddr_l2));
1609 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1610 if (!PyArg_ParseTuple(args, "si", &straddr,
1611 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001612 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001613 "wrong format");
1614 return 0;
1615 }
1616 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1617 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001619 *len_ret = sizeof *addr;
1620 return 1;
1621 }
1622 case BTPROTO_RFCOMM:
1623 {
1624 struct sockaddr_rc *addr;
1625 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 addr = (struct sockaddr_rc *)addr_ret;
1628 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1629 if (!PyArg_ParseTuple(args, "si", &straddr,
1630 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001631 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 "wrong format");
1633 return 0;
1634 }
1635 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1636 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001638 *len_ret = sizeof *addr;
1639 return 1;
1640 }
1641 case BTPROTO_HCI:
1642 {
1643 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001644#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001645 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001646
Alexander Belopolskye239d232010-12-08 23:31:48 +00001647 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001648 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001649 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001650 "wrong format");
1651 return 0;
1652 }
1653 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1654 return 0;
1655#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001656 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1657 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001658 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001659 "wrong format");
1660 return 0;
1661 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 *len_ret = sizeof *addr;
1664 return 1;
1665 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001666#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 case BTPROTO_SCO:
1668 {
1669 struct sockaddr_sco *addr;
1670 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 addr = (struct sockaddr_sco *)addr_ret;
1673 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1674 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001675 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 "wrong format");
1677 return 0;
1678 }
1679 straddr = PyBytes_AS_STRING(args);
1680 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1681 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001682
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001683 *len_ret = sizeof *addr;
1684 return 1;
1685 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001688 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 return 0;
1690 }
1691 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001692#endif
1693
Antoine Pitroub156a462010-10-27 20:13:57 +00001694#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 case AF_PACKET:
1696 {
1697 struct sockaddr_ll* addr;
1698 struct ifreq ifr;
1699 char *interfaceName;
1700 int protoNumber;
1701 int hatype = 0;
1702 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001703 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 if (!PyTuple_Check(args)) {
1706 PyErr_Format(
1707 PyExc_TypeError,
1708 "getsockaddrarg: "
1709 "AF_PACKET address must be tuple, not %.500s",
1710 Py_TYPE(args)->tp_name);
1711 return 0;
1712 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001713 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001714 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001715 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 return 0;
1717 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1718 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1719 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1720 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001721 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 return 0;
1723 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001724 if (haddr.buf && haddr.len > 8) {
1725 PyErr_SetString(PyExc_ValueError,
1726 "Hardware address must be 8 bytes or less");
1727 PyBuffer_Release(&haddr);
1728 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 }
1730 if (protoNumber < 0 || protoNumber > 0xffff) {
1731 PyErr_SetString(
1732 PyExc_OverflowError,
1733 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001734 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 return 0;
1736 }
1737 addr = (struct sockaddr_ll*)addr_ret;
1738 addr->sll_family = AF_PACKET;
1739 addr->sll_protocol = htons((short)protoNumber);
1740 addr->sll_ifindex = ifr.ifr_ifindex;
1741 addr->sll_pkttype = pkttype;
1742 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001743 if (haddr.buf) {
1744 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1745 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001746 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001747 else
1748 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001749 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001750 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001751 return 1;
1752 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001753#endif
1754
Christian Heimes043d6f62008-01-07 17:19:16 +00001755#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001756 case AF_TIPC:
1757 {
1758 unsigned int atype, v1, v2, v3;
1759 unsigned int scope = TIPC_CLUSTER_SCOPE;
1760 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 if (!PyTuple_Check(args)) {
1763 PyErr_Format(
1764 PyExc_TypeError,
1765 "getsockaddrarg: "
1766 "AF_TIPC address must be tuple, not %.500s",
1767 Py_TYPE(args)->tp_name);
1768 return 0;
1769 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001770
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001771 if (!PyArg_ParseTuple(args,
1772 "IIII|I;Invalid TIPC address format",
1773 &atype, &v1, &v2, &v3, &scope))
1774 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 addr = (struct sockaddr_tipc *) addr_ret;
1777 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 addr->family = AF_TIPC;
1780 addr->scope = scope;
1781 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001783 if (atype == TIPC_ADDR_NAMESEQ) {
1784 addr->addr.nameseq.type = v1;
1785 addr->addr.nameseq.lower = v2;
1786 addr->addr.nameseq.upper = v3;
1787 } else if (atype == TIPC_ADDR_NAME) {
1788 addr->addr.name.name.type = v1;
1789 addr->addr.name.name.instance = v2;
1790 } else if (atype == TIPC_ADDR_ID) {
1791 addr->addr.id.node = v1;
1792 addr->addr.id.ref = v2;
1793 } else {
1794 /* Shouldn't happen */
1795 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1796 return 0;
1797 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001799 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001801 return 1;
1802 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001803#endif
1804
Vinay Sajiped6783f2014-03-21 11:44:32 +00001805#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001806 case AF_CAN:
1807 switch (s->sock_proto) {
1808 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001809 /* fall-through */
1810 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001811 {
1812 struct sockaddr_can *addr;
1813 PyObject *interfaceName;
1814 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001815 Py_ssize_t len;
1816
Benjamin Peterson18b71912013-05-16 15:29:44 -05001817 addr = (struct sockaddr_can *)addr_ret;
1818
Charles-François Natali47413c12011-10-06 19:47:44 +02001819 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1820 &interfaceName))
1821 return 0;
1822
1823 len = PyBytes_GET_SIZE(interfaceName);
1824
1825 if (len == 0) {
1826 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001827 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001828 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1829 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001830 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1831 s->errorhandler();
1832 Py_DECREF(interfaceName);
1833 return 0;
1834 }
1835 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001836 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001837 "AF_CAN interface name too long");
1838 Py_DECREF(interfaceName);
1839 return 0;
1840 }
1841
1842 addr->can_family = AF_CAN;
1843 addr->can_ifindex = ifr.ifr_ifindex;
1844
1845 *len_ret = sizeof(*addr);
1846 Py_DECREF(interfaceName);
1847 return 1;
1848 }
1849 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001850 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001851 "getsockaddrarg: unsupported CAN protocol");
1852 return 0;
1853 }
1854#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001855
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001856#ifdef PF_SYSTEM
1857 case PF_SYSTEM:
1858 switch (s->sock_proto) {
1859#ifdef SYSPROTO_CONTROL
1860 case SYSPROTO_CONTROL:
1861 {
1862 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001863
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001864 addr = (struct sockaddr_ctl *)addr_ret;
1865 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001866 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001867
1868 if (PyUnicode_Check(args)) {
1869 struct ctl_info info;
1870 PyObject *ctl_name;
1871
1872 if (!PyArg_Parse(args, "O&",
1873 PyUnicode_FSConverter, &ctl_name)) {
1874 return 0;
1875 }
1876
Victor Stinnerf50e1872015-03-20 11:32:24 +01001877 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001878 PyErr_SetString(PyExc_ValueError,
1879 "provided string is too long");
1880 Py_DECREF(ctl_name);
1881 return 0;
1882 }
1883 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1884 sizeof(info.ctl_name));
1885 Py_DECREF(ctl_name);
1886
1887 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1888 PyErr_SetString(PyExc_OSError,
1889 "cannot find kernel control with provided name");
1890 return 0;
1891 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001892
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001893 addr->sc_id = info.ctl_id;
1894 addr->sc_unit = 0;
1895 } else if (!PyArg_ParseTuple(args, "II",
1896 &(addr->sc_id), &(addr->sc_unit))) {
1897 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1898 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001899
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001900 return 0;
1901 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001902
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001903 *len_ret = sizeof(*addr);
1904 return 1;
1905 }
1906#endif
1907 default:
1908 PyErr_SetString(PyExc_OSError,
1909 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1910 return 0;
1911 }
1912#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001913
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001914 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001916 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001917 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001918 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001920 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001921}
1922
Guido van Rossum30a685f1991-06-27 15:51:29 +00001923
Guido van Rossum48a680c2001-03-02 06:34:14 +00001924/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001925 Return 1 if the family is known, 0 otherwise. The length is returned
1926 through len_ret. */
1927
1928static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001929getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001930{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001932
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001933#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001934 case AF_UNIX:
1935 {
1936 *len_ret = sizeof (struct sockaddr_un);
1937 return 1;
1938 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001939#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001940#if defined(AF_NETLINK)
1941 case AF_NETLINK:
1942 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001943 *len_ret = sizeof (struct sockaddr_nl);
1944 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001945 }
1946#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001947
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001948#ifdef AF_RDS
1949 case AF_RDS:
1950 /* RDS sockets use sockaddr_in: fall-through */
1951#endif
1952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001953 case AF_INET:
1954 {
1955 *len_ret = sizeof (struct sockaddr_in);
1956 return 1;
1957 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001958
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001959#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001960 case AF_INET6:
1961 {
1962 *len_ret = sizeof (struct sockaddr_in6);
1963 return 1;
1964 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001965#endif
1966
Hye-Shik Chang81268602004-02-02 06:05:24 +00001967#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 case AF_BLUETOOTH:
1969 {
1970 switch(s->sock_proto)
1971 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 case BTPROTO_L2CAP:
1974 *len_ret = sizeof (struct sockaddr_l2);
1975 return 1;
1976 case BTPROTO_RFCOMM:
1977 *len_ret = sizeof (struct sockaddr_rc);
1978 return 1;
1979 case BTPROTO_HCI:
1980 *len_ret = sizeof (struct sockaddr_hci);
1981 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001982#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001983 case BTPROTO_SCO:
1984 *len_ret = sizeof (struct sockaddr_sco);
1985 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001987 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001988 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001989 "unknown BT protocol");
1990 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 }
1993 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001994#endif
1995
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001996#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 case AF_PACKET:
1998 {
1999 *len_ret = sizeof (struct sockaddr_ll);
2000 return 1;
2001 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002002#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002003
Christian Heimes043d6f62008-01-07 17:19:16 +00002004#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 case AF_TIPC:
2006 {
2007 *len_ret = sizeof (struct sockaddr_tipc);
2008 return 1;
2009 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002010#endif
2011
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002012#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002013 case AF_CAN:
2014 {
2015 *len_ret = sizeof (struct sockaddr_can);
2016 return 1;
2017 }
2018#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002019
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002020#ifdef PF_SYSTEM
2021 case PF_SYSTEM:
2022 switch(s->sock_proto) {
2023#ifdef SYSPROTO_CONTROL
2024 case SYSPROTO_CONTROL:
2025 *len_ret = sizeof (struct sockaddr_ctl);
2026 return 1;
2027#endif
2028 default:
2029 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2030 "unknown PF_SYSTEM protocol");
2031 return 0;
2032 }
2033#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002034
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002035 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002037 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002038 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002039 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002041 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002042}
2043
2044
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002045/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2046 Currently, these methods are only compiled if the RFC 2292/3542
2047 CMSG_LEN() macro is available. Older systems seem to have used
2048 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2049 it may be possible to define CMSG_LEN() that way if it's not
2050 provided. Some architectures might need extra padding after the
2051 cmsghdr, however, and CMSG_LEN() would have to take account of
2052 this. */
2053#ifdef CMSG_LEN
2054/* If length is in range, set *result to CMSG_LEN(length) and return
2055 true; otherwise, return false. */
2056static int
2057get_CMSG_LEN(size_t length, size_t *result)
2058{
2059 size_t tmp;
2060
2061 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2062 return 0;
2063 tmp = CMSG_LEN(length);
2064 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2065 return 0;
2066 *result = tmp;
2067 return 1;
2068}
2069
2070#ifdef CMSG_SPACE
2071/* If length is in range, set *result to CMSG_SPACE(length) and return
2072 true; otherwise, return false. */
2073static int
2074get_CMSG_SPACE(size_t length, size_t *result)
2075{
2076 size_t tmp;
2077
2078 /* Use CMSG_SPACE(1) here in order to take account of the padding
2079 necessary before *and* after the data. */
2080 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2081 return 0;
2082 tmp = CMSG_SPACE(length);
2083 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2084 return 0;
2085 *result = tmp;
2086 return 1;
2087}
2088#endif
2089
2090/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2091 pointer in msg->msg_control with at least "space" bytes after it,
2092 and its cmsg_len member inside the buffer. */
2093static int
2094cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2095{
2096 size_t cmsg_offset;
2097 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2098 sizeof(cmsgh->cmsg_len));
2099
Charles-François Natali466517d2011-08-28 18:23:43 +02002100 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002101 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002102 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002103 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2104 annoying under OS X as it's unsigned there and so it triggers a
2105 tautological comparison warning under Clang when compared against 0.
2106 Since the check is valid on other platforms, silence the warning under
2107 Clang. */
2108 #ifdef __clang__
2109 #pragma clang diagnostic push
2110 #pragma clang diagnostic ignored "-Wtautological-compare"
2111 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002112 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002113 #pragma GCC diagnostic push
2114 #pragma GCC diagnostic ignored "-Wtype-limits"
2115 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002116 if (msg->msg_controllen < 0)
2117 return 0;
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 pop
2120 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002121 #ifdef __clang__
2122 #pragma clang diagnostic pop
2123 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002124 if (space < cmsg_len_end)
2125 space = cmsg_len_end;
2126 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2127 return (cmsg_offset <= (size_t)-1 - space &&
2128 cmsg_offset + space <= msg->msg_controllen);
2129}
2130
2131/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2132 *space to number of bytes following it in the buffer and return
2133 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2134 msg->msg_controllen are valid. */
2135static int
2136get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2137{
2138 size_t data_offset;
2139 char *data_ptr;
2140
2141 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2142 return 0;
2143 data_offset = data_ptr - (char *)msg->msg_control;
2144 if (data_offset > msg->msg_controllen)
2145 return 0;
2146 *space = msg->msg_controllen - data_offset;
2147 return 1;
2148}
2149
2150/* If cmsgh is invalid or not contained in the buffer pointed to by
2151 msg->msg_control, return -1. If cmsgh is valid and its associated
2152 data is entirely contained in the buffer, set *data_len to the
2153 length of the associated data and return 0. If only part of the
2154 associated data is contained in the buffer but cmsgh is otherwise
2155 valid, set *data_len to the length contained in the buffer and
2156 return 1. */
2157static int
2158get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2159{
2160 size_t space, cmsg_data_len;
2161
2162 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2163 cmsgh->cmsg_len < CMSG_LEN(0))
2164 return -1;
2165 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2166 if (!get_cmsg_data_space(msg, cmsgh, &space))
2167 return -1;
2168 if (space >= cmsg_data_len) {
2169 *data_len = cmsg_data_len;
2170 return 0;
2171 }
2172 *data_len = space;
2173 return 1;
2174}
2175#endif /* CMSG_LEN */
2176
2177
Victor Stinner31bf2d52015-04-01 21:57:09 +02002178struct sock_accept {
2179 socklen_t *addrlen;
2180 sock_addr_t *addrbuf;
2181 SOCKET_T result;
2182};
2183
2184#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2185/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2186static int accept4_works = -1;
2187#endif
2188
2189static int
2190sock_accept_impl(PySocketSockObject *s, void *data)
2191{
2192 struct sock_accept *ctx = data;
2193
2194#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2195 if (accept4_works != 0) {
2196 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2197 SOCK_CLOEXEC);
2198 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2199 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2200 accept4_works = (errno != ENOSYS);
2201 }
2202 }
2203 if (accept4_works == 0)
2204 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2205#else
2206 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2207#endif
2208 return (ctx->result >= 0);
2209}
2210
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002211/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002212
Guido van Rossum73624e91994-10-10 17:59:00 +00002213static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002214sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002216 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002217 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002218 socklen_t addrlen;
2219 PyObject *sock = NULL;
2220 PyObject *addr = NULL;
2221 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002222 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002224 if (!getsockaddrlen(s, &addrlen))
2225 return NULL;
2226 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002228 if (!IS_SELECTABLE(s))
2229 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002230
Victor Stinner31bf2d52015-04-01 21:57:09 +02002231 ctx.addrlen = &addrlen;
2232 ctx.addrbuf = &addrbuf;
2233 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002234 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002235 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002236
Victor Stinnerdaf45552013-08-28 00:53:59 +02002237#ifdef MS_WINDOWS
2238 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2239 PyErr_SetFromWindowsErr(0);
2240 SOCKETCLOSE(newfd);
2241 goto finally;
2242 }
2243#else
2244
2245#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2246 if (!accept4_works)
2247#endif
2248 {
2249 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2250 SOCKETCLOSE(newfd);
2251 goto finally;
2252 }
2253 }
2254#endif
2255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002256 sock = PyLong_FromSocket_t(newfd);
2257 if (sock == NULL) {
2258 SOCKETCLOSE(newfd);
2259 goto finally;
2260 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002262 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2263 addrlen, s->sock_proto);
2264 if (addr == NULL)
2265 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002268
Guido van Rossum67f7a382002-06-06 21:08:16 +00002269finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 Py_XDECREF(sock);
2271 Py_XDECREF(addr);
2272 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002273}
2274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002275PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002276"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002277\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002278Wait for an incoming connection. Return a new socket file descriptor\n\
2279representing the connection, and the address of the client.\n\
2280For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002281
Guido van Rossum11ba0942002-06-13 15:07:44 +00002282/* s.setblocking(flag) method. Argument:
2283 False -- non-blocking mode; same as settimeout(0)
2284 True -- blocking mode; same as settimeout(None)
2285*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002286
Guido van Rossum73624e91994-10-10 17:59:00 +00002287static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002288sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002289{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002290 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 block = PyLong_AsLong(arg);
2293 if (block == -1 && PyErr_Occurred())
2294 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002295
Victor Stinner9001d802015-04-06 23:06:01 +02002296 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002299 Py_INCREF(Py_None);
2300 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002301}
Guido van Rossume4485b01994-09-07 14:32:49 +00002302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002303PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002304"setblocking(flag)\n\
2305\n\
2306Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002307setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002308setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002309
Victor Stinner71694d52015-03-28 01:18:54 +01002310static int
2311socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2312{
2313#ifdef MS_WINDOWS
2314 struct timeval tv;
2315#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002316#ifndef HAVE_POLL
2317 _PyTime_t ms;
2318#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002319 int overflow = 0;
2320
2321 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002322 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002323 return 0;
2324 }
2325
Victor Stinner869e1772015-03-30 03:49:14 +02002326 if (_PyTime_FromSecondsObject(timeout,
2327 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002328 return -1;
2329
2330 if (*timeout < 0) {
2331 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2332 return -1;
2333 }
2334
2335#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002336 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002337#endif
2338#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002339 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2340 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002341#endif
2342 if (overflow) {
2343 PyErr_SetString(PyExc_OverflowError,
2344 "timeout doesn't fit into C timeval");
2345 return -1;
2346 }
2347
2348 return 0;
2349}
2350
Guido van Rossum11ba0942002-06-13 15:07:44 +00002351/* s.settimeout(timeout) method. Argument:
2352 None -- no timeout, blocking mode; same as setblocking(True)
2353 0.0 -- non-blocking mode; same as setblocking(False)
2354 > 0 -- timeout mode; operations time out after timeout seconds
2355 < 0 -- illegal; raises an exception
2356*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002357static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002358sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002359{
Victor Stinner71694d52015-03-28 01:18:54 +01002360 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002361
Victor Stinner71694d52015-03-28 01:18:54 +01002362 if (socket_parse_timeout(&timeout, arg) < 0)
2363 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002364
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002365 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002366 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002368 Py_INCREF(Py_None);
2369 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002370}
2371
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002372PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002373"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002374\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002375Set a timeout on socket operations. 'timeout' can be a float,\n\
2376giving in seconds, or None. Setting a timeout of None disables\n\
2377the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002378Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002379
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002380/* s.gettimeout() method.
2381 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002382static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002383sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002384{
Victor Stinner71694d52015-03-28 01:18:54 +01002385 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002386 Py_INCREF(Py_None);
2387 return Py_None;
2388 }
Victor Stinner71694d52015-03-28 01:18:54 +01002389 else {
2390 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2391 return PyFloat_FromDouble(seconds);
2392 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002393}
2394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002395PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002396"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002397\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002398Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002399operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002400operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002401
Guido van Rossumaee08791992-09-08 09:05:33 +00002402/* s.setsockopt() method.
2403 With an integer third argument, sets an integer option.
2404 With a string third argument, sets an option from a buffer;
2405 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002406
Guido van Rossum73624e91994-10-10 17:59:00 +00002407static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002408sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 int level;
2411 int optname;
2412 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002413 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002414 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 if (PyArg_ParseTuple(args, "iii:setsockopt",
2417 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002418 res = setsockopt(s->sock_fd, level, optname,
2419 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 }
2421 else {
2422 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002423 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2424 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002426 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2427 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 if (res < 0)
2430 return s->errorhandler();
2431 Py_INCREF(Py_None);
2432 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002433}
2434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002435PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002436"setsockopt(level, option, value)\n\
2437\n\
2438Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002439The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002440
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002441
Guido van Rossumaee08791992-09-08 09:05:33 +00002442/* s.getsockopt() method.
2443 With two arguments, retrieves an integer option.
2444 With a third integer argument, retrieves a string buffer of that size;
2445 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002446
Guido van Rossum73624e91994-10-10 17:59:00 +00002447static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002448sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 int level;
2451 int optname;
2452 int res;
2453 PyObject *buf;
2454 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002456 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2457 &level, &optname, &buflen))
2458 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002460 if (buflen == 0) {
2461 int flag = 0;
2462 socklen_t flagsize = sizeof flag;
2463 res = getsockopt(s->sock_fd, level, optname,
2464 (void *)&flag, &flagsize);
2465 if (res < 0)
2466 return s->errorhandler();
2467 return PyLong_FromLong(flag);
2468 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002470 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002471 "getsockopt buflen out of range");
2472 return NULL;
2473 }
2474 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2475 if (buf == NULL)
2476 return NULL;
2477 res = getsockopt(s->sock_fd, level, optname,
2478 (void *)PyBytes_AS_STRING(buf), &buflen);
2479 if (res < 0) {
2480 Py_DECREF(buf);
2481 return s->errorhandler();
2482 }
2483 _PyBytes_Resize(&buf, buflen);
2484 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002485}
2486
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002487PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002488"getsockopt(level, option[, buffersize]) -> value\n\
2489\n\
2490Get a socket option. See the Unix manual for level and option.\n\
2491If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002492string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002493
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002494
Fred Drake728819a2000-07-01 03:40:12 +00002495/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002496
Guido van Rossum73624e91994-10-10 17:59:00 +00002497static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002498sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002499{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002500 sock_addr_t addrbuf;
2501 int addrlen;
2502 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2505 return NULL;
2506 Py_BEGIN_ALLOW_THREADS
2507 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2508 Py_END_ALLOW_THREADS
2509 if (res < 0)
2510 return s->errorhandler();
2511 Py_INCREF(Py_None);
2512 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002513}
2514
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002515PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002516"bind(address)\n\
2517\n\
2518Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002519pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002520sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002521
Guido van Rossum30a685f1991-06-27 15:51:29 +00002522
2523/* s.close() method.
2524 Set the file descriptor to -1 so operations tried subsequently
2525 will surely fail. */
2526
Guido van Rossum73624e91994-10-10 17:59:00 +00002527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002528sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002530 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002531
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002532 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2533 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2534 * for more details.
2535 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002536 if ((fd = s->sock_fd) != -1) {
2537 s->sock_fd = -1;
2538 Py_BEGIN_ALLOW_THREADS
2539 (void) SOCKETCLOSE(fd);
2540 Py_END_ALLOW_THREADS
2541 }
2542 Py_INCREF(Py_None);
2543 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002544}
2545
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002546PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002547"close()\n\
2548\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002549Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002550
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002551static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002552sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002553{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002554 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002555 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002556 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002557}
2558
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002559PyDoc_STRVAR(detach_doc,
2560"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002561\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002562Close the socket object without closing the underlying file descriptor.\n\
2563The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002564can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002565
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002566static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002567sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002568{
Victor Stinner81c41db2015-04-02 11:50:57 +02002569 int err;
2570 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002571
Victor Stinner81c41db2015-04-02 11:50:57 +02002572 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2573 /* getsockopt() failed */
2574 return 0;
2575 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002576
Victor Stinner81c41db2015-04-02 11:50:57 +02002577 if (err == EISCONN)
2578 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002579 if (err != 0) {
2580 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2581 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002582 return 0;
2583 }
2584 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002585}
2586
2587static int
2588internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2589 int raise)
2590{
2591 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002592
2593 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002594 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002595 Py_END_ALLOW_THREADS
2596
Victor Stinner70a46f62015-03-31 22:03:59 +02002597 if (!res) {
2598 /* connect() succeeded, the socket is connected */
2599 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002601
Victor Stinner81c41db2015-04-02 11:50:57 +02002602 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002603
Victor Stinner81c41db2015-04-02 11:50:57 +02002604 /* save error, PyErr_CheckSignals() can replace it */
2605 err = GET_SOCK_ERROR;
2606 if (CHECK_ERRNO(EINTR)) {
2607 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002608 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002609
2610 /* Issue #23618: when connect() fails with EINTR, the connection is
2611 running asynchronously.
2612
2613 If the socket is blocking or has a timeout, wait until the
2614 connection completes, fails or timed out using select(), and then
2615 get the connection status using getsockopt(SO_ERROR).
2616
2617 If the socket is non-blocking, raise InterruptedError. The caller is
2618 responsible to wait until the connection completes, fails or timed
2619 out (it's the case in asyncio for example). */
2620 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2621 }
2622 else {
2623 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2624 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002625 }
2626
Victor Stinner81c41db2015-04-02 11:50:57 +02002627 if (!wait_connect) {
2628 if (raise) {
2629 /* restore error, maybe replaced by PyErr_CheckSignals() */
2630 SET_SOCK_ERROR(err);
2631 s->errorhandler();
2632 return -1;
2633 }
2634 else
2635 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002636 }
2637
Victor Stinner81c41db2015-04-02 11:50:57 +02002638 if (raise) {
2639 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002640 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2641 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002642 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002643 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002644 else {
2645 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002646 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2647 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002648 return err;
2649 }
2650 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002651}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002652
Fred Drake728819a2000-07-01 03:40:12 +00002653/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002654
Guido van Rossum73624e91994-10-10 17:59:00 +00002655static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002656sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002657{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002658 sock_addr_t addrbuf;
2659 int addrlen;
2660 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002662 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2663 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002664
Victor Stinner81c41db2015-04-02 11:50:57 +02002665 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002666 if (res < 0)
2667 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002668
Victor Stinneree699e92015-03-31 21:28:42 +02002669 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002670}
2671
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002672PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002673"connect(address)\n\
2674\n\
2675Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002677
Guido van Rossum30a685f1991-06-27 15:51:29 +00002678
Fred Drake728819a2000-07-01 03:40:12 +00002679/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002680
2681static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002682sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 sock_addr_t addrbuf;
2685 int addrlen;
2686 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2689 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002690
Victor Stinner81c41db2015-04-02 11:50:57 +02002691 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002692 if (res < 0)
2693 return NULL;
2694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002695 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002696}
2697
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002698PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002699"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002700\n\
2701This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002702instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002703
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002704
Guido van Rossumed233a51992-06-23 09:07:03 +00002705/* s.fileno() method */
2706
Guido van Rossum73624e91994-10-10 17:59:00 +00002707static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002708sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002709{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002710 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002711}
2712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002713PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002714"fileno() -> integer\n\
2715\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002716Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002717
Guido van Rossumed233a51992-06-23 09:07:03 +00002718
Guido van Rossumc89705d1992-11-26 08:54:07 +00002719/* s.getsockname() method */
2720
Guido van Rossum73624e91994-10-10 17:59:00 +00002721static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002722sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002724 sock_addr_t addrbuf;
2725 int res;
2726 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002728 if (!getsockaddrlen(s, &addrlen))
2729 return NULL;
2730 memset(&addrbuf, 0, addrlen);
2731 Py_BEGIN_ALLOW_THREADS
2732 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2733 Py_END_ALLOW_THREADS
2734 if (res < 0)
2735 return s->errorhandler();
2736 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2737 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002738}
2739
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002740PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002741"getsockname() -> address info\n\
2742\n\
2743Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002744info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002745
Guido van Rossumc89705d1992-11-26 08:54:07 +00002746
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002747#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002748/* s.getpeername() method */
2749
Guido van Rossum73624e91994-10-10 17:59:00 +00002750static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002751sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002752{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 sock_addr_t addrbuf;
2754 int res;
2755 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002757 if (!getsockaddrlen(s, &addrlen))
2758 return NULL;
2759 memset(&addrbuf, 0, addrlen);
2760 Py_BEGIN_ALLOW_THREADS
2761 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2762 Py_END_ALLOW_THREADS
2763 if (res < 0)
2764 return s->errorhandler();
2765 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2766 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002767}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002768
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002769PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002770"getpeername() -> address info\n\
2771\n\
2772Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002773info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002774
Guido van Rossumb6775db1994-08-01 11:34:53 +00002775#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002776
2777
Guido van Rossum30a685f1991-06-27 15:51:29 +00002778/* s.listen(n) method */
2779
Guido van Rossum73624e91994-10-10 17:59:00 +00002780static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002781sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002782{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002783 /* We try to choose a default backlog high enough to avoid connection drops
2784 * for common workloads, yet not too high to limit resource usage. */
2785 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002787
Charles-François Natali644b8f52014-05-22 19:45:39 +01002788 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002789 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002792 /* To avoid problems on systems that don't allow a negative backlog
2793 * (which doesn't make sense anyway) we force a minimum value of 0. */
2794 if (backlog < 0)
2795 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 res = listen(s->sock_fd, backlog);
2797 Py_END_ALLOW_THREADS
2798 if (res < 0)
2799 return s->errorhandler();
2800 Py_INCREF(Py_None);
2801 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002802}
2803
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002804PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002805"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002806\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002807Enable a server to accept connections. If backlog is specified, it must be\n\
2808at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002809unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002810connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002811
Victor Stinner31bf2d52015-04-01 21:57:09 +02002812struct sock_recv {
2813 char *cbuf;
2814 Py_ssize_t len;
2815 int flags;
2816 Py_ssize_t result;
2817};
2818
2819static int
2820sock_recv_impl(PySocketSockObject *s, void *data)
2821{
2822 struct sock_recv *ctx = data;
2823
2824#ifdef MS_WINDOWS
2825 if (ctx->len > INT_MAX)
2826 ctx->len = INT_MAX;
2827 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2828#else
2829 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2830#endif
2831 return (ctx->result >= 0);
2832}
2833
Guido van Rossum82a5c661998-07-07 20:45:43 +00002834
Thomas Wouters477c8d52006-05-27 19:21:47 +00002835/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002836 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002837 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002838 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002839 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002840 * also possible that we return a number of bytes smaller than the request
2841 * bytes.
2842 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002843
Antoine Pitrou19467d22010-08-17 19:33:30 +00002844static Py_ssize_t
2845sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002847 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (!IS_SELECTABLE(s)) {
2850 select_error();
2851 return -1;
2852 }
2853 if (len == 0) {
2854 /* If 0 bytes were requested, do nothing. */
2855 return 0;
2856 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002857
Victor Stinner31bf2d52015-04-01 21:57:09 +02002858 ctx.cbuf = cbuf;
2859 ctx.len = len;
2860 ctx.flags = flags;
2861 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002863
2864 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002865}
2866
Guido van Rossum48a680c2001-03-02 06:34:14 +00002867
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002868/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002869
Guido van Rossum73624e91994-10-10 17:59:00 +00002870static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002871sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002872{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002873 Py_ssize_t recvlen, outlen;
2874 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002876
Antoine Pitrou19467d22010-08-17 19:33:30 +00002877 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002878 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 if (recvlen < 0) {
2881 PyErr_SetString(PyExc_ValueError,
2882 "negative buffersize in recv");
2883 return NULL;
2884 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002885
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002886 /* Allocate a new string. */
2887 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2888 if (buf == NULL)
2889 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 /* Call the guts */
2892 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2893 if (outlen < 0) {
2894 /* An error occurred, release the string and return an
2895 error. */
2896 Py_DECREF(buf);
2897 return NULL;
2898 }
2899 if (outlen != recvlen) {
2900 /* We did not read as many bytes as we anticipated, resize the
2901 string if possible and be successful. */
2902 _PyBytes_Resize(&buf, outlen);
2903 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002906}
2907
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002908PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002909"recv(buffersize[, flags]) -> data\n\
2910\n\
2911Receive up to buffersize bytes from the socket. For the optional flags\n\
2912argument, see the Unix manual. When no data is available, block until\n\
2913at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002914the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002915
Guido van Rossum30a685f1991-06-27 15:51:29 +00002916
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002917/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002918
Thomas Wouters477c8d52006-05-27 19:21:47 +00002919static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002920sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002923
Antoine Pitrou19467d22010-08-17 19:33:30 +00002924 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002925 Py_buffer pbuf;
2926 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002927 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002929 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002930 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002931 &pbuf, &recvlen, &flags))
2932 return NULL;
2933 buf = pbuf.buf;
2934 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002935
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002936 if (recvlen < 0) {
2937 PyBuffer_Release(&pbuf);
2938 PyErr_SetString(PyExc_ValueError,
2939 "negative buffersize in recv_into");
2940 return NULL;
2941 }
2942 if (recvlen == 0) {
2943 /* If nbytes was not specified, use the buffer's length */
2944 recvlen = buflen;
2945 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002947 /* Check if the buffer is large enough */
2948 if (buflen < recvlen) {
2949 PyBuffer_Release(&pbuf);
2950 PyErr_SetString(PyExc_ValueError,
2951 "buffer too small for requested bytes");
2952 return NULL;
2953 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 /* Call the guts */
2956 readlen = sock_recv_guts(s, buf, recvlen, flags);
2957 if (readlen < 0) {
2958 /* Return an error. */
2959 PyBuffer_Release(&pbuf);
2960 return NULL;
2961 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 PyBuffer_Release(&pbuf);
2964 /* Return the number of bytes read. Note that we do not do anything
2965 special here in the case that readlen < recvlen. */
2966 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002967}
2968
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002969PyDoc_STRVAR(recv_into_doc,
2970"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002971\n\
2972A version of recv() that stores its data into a buffer rather than creating \n\
2973a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2974is not specified (or 0), receive up to the size available in the given buffer.\n\
2975\n\
2976See recv() for documentation about the flags.");
2977
Victor Stinner31bf2d52015-04-01 21:57:09 +02002978struct sock_recvfrom {
2979 char* cbuf;
2980 Py_ssize_t len;
2981 int flags;
2982 socklen_t *addrlen;
2983 sock_addr_t *addrbuf;
2984 Py_ssize_t result;
2985};
2986
2987static int
2988sock_recvfrom_impl(PySocketSockObject *s, void *data)
2989{
2990 struct sock_recvfrom *ctx = data;
2991
2992 memset(ctx->addrbuf, 0, *ctx->addrlen);
2993
2994#ifdef MS_WINDOWS
2995 if (ctx->len > INT_MAX)
2996 ctx->len = INT_MAX;
2997 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
2998 SAS2SA(ctx->addrbuf), ctx->addrlen);
2999#else
3000 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3001 SAS2SA(ctx->addrbuf), ctx->addrlen);
3002#endif
3003 return (ctx->result >= 0);
3004}
3005
Thomas Wouters477c8d52006-05-27 19:21:47 +00003006
3007/*
Christian Heimes99170a52007-12-19 02:07:34 +00003008 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3009 * into a char buffer. If you have any inc/def ref to do to the objects that
3010 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003011 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003012 * that it is also possible that we return a number of bytes smaller than the
3013 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003014 *
3015 * 'addr' is a return value for the address object. Note that you must decref
3016 * it yourself.
3017 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003018static Py_ssize_t
3019sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003024 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003026 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 if (!getsockaddrlen(s, &addrlen))
3029 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 if (!IS_SELECTABLE(s)) {
3032 select_error();
3033 return -1;
3034 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003035
Victor Stinner31bf2d52015-04-01 21:57:09 +02003036 ctx.cbuf = cbuf;
3037 ctx.len = len;
3038 ctx.flags = flags;
3039 ctx.addrbuf = &addrbuf;
3040 ctx.addrlen = &addrlen;
3041 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003042 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003043
Victor Stinner31bf2d52015-04-01 21:57:09 +02003044 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3045 s->sock_proto);
3046 if (*addr == NULL)
3047 return -1;
3048
3049 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003050}
3051
3052/* s.recvfrom(nbytes [,flags]) method */
3053
3054static PyObject *
3055sock_recvfrom(PySocketSockObject *s, PyObject *args)
3056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003057 PyObject *buf = NULL;
3058 PyObject *addr = NULL;
3059 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003060 int flags = 0;
3061 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003062
Antoine Pitrou19467d22010-08-17 19:33:30 +00003063 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003064 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003066 if (recvlen < 0) {
3067 PyErr_SetString(PyExc_ValueError,
3068 "negative buffersize in recvfrom");
3069 return NULL;
3070 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3073 if (buf == NULL)
3074 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3077 recvlen, flags, &addr);
3078 if (outlen < 0) {
3079 goto finally;
3080 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 if (outlen != recvlen) {
3083 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003084 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003086 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 goto finally;
3088 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003091
3092finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003093 Py_XDECREF(buf);
3094 Py_XDECREF(addr);
3095 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003096}
3097
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003098PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003099"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3100\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003101Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003102
Thomas Wouters477c8d52006-05-27 19:21:47 +00003103
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003104/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003105
3106static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003107sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003110
Antoine Pitrou19467d22010-08-17 19:33:30 +00003111 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003112 Py_buffer pbuf;
3113 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003114 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003117
Antoine Pitrou19467d22010-08-17 19:33:30 +00003118 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003119 kwlist, &pbuf,
3120 &recvlen, &flags))
3121 return NULL;
3122 buf = pbuf.buf;
3123 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 if (recvlen < 0) {
3126 PyBuffer_Release(&pbuf);
3127 PyErr_SetString(PyExc_ValueError,
3128 "negative buffersize in recvfrom_into");
3129 return NULL;
3130 }
3131 if (recvlen == 0) {
3132 /* If nbytes was not specified, use the buffer's length */
3133 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003134 } else if (recvlen > buflen) {
3135 PyBuffer_Release(&pbuf);
3136 PyErr_SetString(PyExc_ValueError,
3137 "nbytes is greater than the length of the buffer");
3138 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003139 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003140
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003141 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3142 if (readlen < 0) {
3143 PyBuffer_Release(&pbuf);
3144 /* Return an error */
3145 Py_XDECREF(addr);
3146 return NULL;
3147 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003149 PyBuffer_Release(&pbuf);
3150 /* Return the number of bytes read and the address. Note that we do
3151 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003152 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003153}
3154
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003155PyDoc_STRVAR(recvfrom_into_doc,
3156"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003157\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003158Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003159
Victor Stinner35bee932015-04-02 12:28:07 +02003160/* The sendmsg() and recvmsg[_into]() methods require a working
3161 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3162#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003163struct sock_recvmsg {
3164 struct msghdr *msg;
3165 int flags;
3166 ssize_t result;
3167};
3168
3169static int
3170sock_recvmsg_impl(PySocketSockObject *s, void *data)
3171{
3172 struct sock_recvmsg *ctx = data;
3173
3174 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3175 return (ctx->result >= 0);
3176}
3177
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003178/*
3179 * Call recvmsg() with the supplied iovec structures, flags, and
3180 * ancillary data buffer size (controllen). Returns the tuple return
3181 * value for recvmsg() or recvmsg_into(), with the first item provided
3182 * by the supplied makeval() function. makeval() will be called with
3183 * the length read and makeval_data as arguments, and must return a
3184 * new reference (which will be decrefed if there is a subsequent
3185 * error). On error, closes any file descriptors received via
3186 * SCM_RIGHTS.
3187 */
3188static PyObject *
3189sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3190 int flags, Py_ssize_t controllen,
3191 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3192{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003193 sock_addr_t addrbuf;
3194 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003195 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003196 PyObject *cmsg_list = NULL, *retval = NULL;
3197 void *controlbuf = NULL;
3198 struct cmsghdr *cmsgh;
3199 size_t cmsgdatalen = 0;
3200 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003201 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003202
3203 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3204 ignored" when the socket is connected (Linux fills them in
3205 anyway for AF_UNIX sockets at least). Normally msg_namelen
3206 seems to be set to 0 if there's no address, but try to
3207 initialize msg_name to something that won't be mistaken for a
3208 real address if that doesn't happen. */
3209 if (!getsockaddrlen(s, &addrbuflen))
3210 return NULL;
3211 memset(&addrbuf, 0, addrbuflen);
3212 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3213
3214 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3215 PyErr_SetString(PyExc_ValueError,
3216 "invalid ancillary data buffer length");
3217 return NULL;
3218 }
3219 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3220 return PyErr_NoMemory();
3221
3222 /* Make the system call. */
3223 if (!IS_SELECTABLE(s)) {
3224 select_error();
3225 goto finally;
3226 }
3227
Victor Stinner31bf2d52015-04-01 21:57:09 +02003228 msg.msg_name = SAS2SA(&addrbuf);
3229 msg.msg_namelen = addrbuflen;
3230 msg.msg_iov = iov;
3231 msg.msg_iovlen = iovlen;
3232 msg.msg_control = controlbuf;
3233 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003234
Victor Stinner31bf2d52015-04-01 21:57:09 +02003235 ctx.msg = &msg;
3236 ctx.flags = flags;
3237 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003238 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003239
3240 /* Make list of (level, type, data) tuples from control messages. */
3241 if ((cmsg_list = PyList_New(0)) == NULL)
3242 goto err_closefds;
3243 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3244 implementations didn't do so. */
3245 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3246 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3247 PyObject *bytes, *tuple;
3248 int tmp;
3249
3250 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3251 if (cmsg_status != 0) {
3252 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3253 "received malformed or improperly-truncated "
3254 "ancillary data", 1) == -1)
3255 goto err_closefds;
3256 }
3257 if (cmsg_status < 0)
3258 break;
3259 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003260 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003261 goto err_closefds;
3262 }
3263
3264 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3265 cmsgdatalen);
3266 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3267 (int)cmsgh->cmsg_type, bytes);
3268 if (tuple == NULL)
3269 goto err_closefds;
3270 tmp = PyList_Append(cmsg_list, tuple);
3271 Py_DECREF(tuple);
3272 if (tmp != 0)
3273 goto err_closefds;
3274
3275 if (cmsg_status != 0)
3276 break;
3277 }
3278
3279 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003280 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003281 cmsg_list,
3282 (int)msg.msg_flags,
3283 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3284 ((msg.msg_namelen > addrbuflen) ?
3285 addrbuflen : msg.msg_namelen),
3286 s->sock_proto));
3287 if (retval == NULL)
3288 goto err_closefds;
3289
3290finally:
3291 Py_XDECREF(cmsg_list);
3292 PyMem_Free(controlbuf);
3293 return retval;
3294
3295err_closefds:
3296#ifdef SCM_RIGHTS
3297 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3298 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3299 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3300 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3301 if (cmsg_status < 0)
3302 break;
3303 if (cmsgh->cmsg_level == SOL_SOCKET &&
3304 cmsgh->cmsg_type == SCM_RIGHTS) {
3305 size_t numfds;
3306 int *fdp;
3307
3308 numfds = cmsgdatalen / sizeof(int);
3309 fdp = (int *)CMSG_DATA(cmsgh);
3310 while (numfds-- > 0)
3311 close(*fdp++);
3312 }
3313 if (cmsg_status != 0)
3314 break;
3315 }
3316#endif /* SCM_RIGHTS */
3317 goto finally;
3318}
3319
3320
3321static PyObject *
3322makeval_recvmsg(ssize_t received, void *data)
3323{
3324 PyObject **buf = data;
3325
3326 if (received < PyBytes_GET_SIZE(*buf))
3327 _PyBytes_Resize(buf, received);
3328 Py_XINCREF(*buf);
3329 return *buf;
3330}
3331
3332/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3333
3334static PyObject *
3335sock_recvmsg(PySocketSockObject *s, PyObject *args)
3336{
3337 Py_ssize_t bufsize, ancbufsize = 0;
3338 int flags = 0;
3339 struct iovec iov;
3340 PyObject *buf = NULL, *retval = NULL;
3341
3342 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3343 return NULL;
3344
3345 if (bufsize < 0) {
3346 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3347 return NULL;
3348 }
3349 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3350 return NULL;
3351 iov.iov_base = PyBytes_AS_STRING(buf);
3352 iov.iov_len = bufsize;
3353
3354 /* Note that we're passing a pointer to *our pointer* to the bytes
3355 object here (&buf); makeval_recvmsg() may incref the object, or
3356 deallocate it and set our pointer to NULL. */
3357 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3358 &makeval_recvmsg, &buf);
3359 Py_XDECREF(buf);
3360 return retval;
3361}
3362
3363PyDoc_STRVAR(recvmsg_doc,
3364"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3365\n\
3366Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3367socket. The ancbufsize argument sets the size in bytes of the\n\
3368internal buffer used to receive the ancillary data; it defaults to 0,\n\
3369meaning that no ancillary data will be received. Appropriate buffer\n\
3370sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3371CMSG_LEN(), and items which do not fit into the buffer might be\n\
3372truncated or discarded. The flags argument defaults to 0 and has the\n\
3373same meaning as for recv().\n\
3374\n\
3375The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3376The data item is a bytes object holding the non-ancillary data\n\
3377received. The ancdata item is a list of zero or more tuples\n\
3378(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3379(control messages) received: cmsg_level and cmsg_type are integers\n\
3380specifying the protocol level and protocol-specific type respectively,\n\
3381and cmsg_data is a bytes object holding the associated data. The\n\
3382msg_flags item is the bitwise OR of various flags indicating\n\
3383conditions on the received message; see your system documentation for\n\
3384details. If the receiving socket is unconnected, address is the\n\
3385address of the sending socket, if available; otherwise, its value is\n\
3386unspecified.\n\
3387\n\
3388If recvmsg() raises an exception after the system call returns, it\n\
3389will first attempt to close any file descriptors received via the\n\
3390SCM_RIGHTS mechanism.");
3391
3392
3393static PyObject *
3394makeval_recvmsg_into(ssize_t received, void *data)
3395{
3396 return PyLong_FromSsize_t(received);
3397}
3398
3399/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3400
3401static PyObject *
3402sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3403{
3404 Py_ssize_t ancbufsize = 0;
3405 int flags = 0;
3406 struct iovec *iovs = NULL;
3407 Py_ssize_t i, nitems, nbufs = 0;
3408 Py_buffer *bufs = NULL;
3409 PyObject *buffers_arg, *fast, *retval = NULL;
3410
3411 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3412 &buffers_arg, &ancbufsize, &flags))
3413 return NULL;
3414
3415 if ((fast = PySequence_Fast(buffers_arg,
3416 "recvmsg_into() argument 1 must be an "
3417 "iterable")) == NULL)
3418 return NULL;
3419 nitems = PySequence_Fast_GET_SIZE(fast);
3420 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003421 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003422 goto finally;
3423 }
3424
3425 /* Fill in an iovec for each item, and save the Py_buffer
3426 structs to release afterwards. */
3427 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3428 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3429 PyErr_NoMemory();
3430 goto finally;
3431 }
3432 for (; nbufs < nitems; nbufs++) {
3433 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3434 "w*;recvmsg_into() argument 1 must be an iterable "
3435 "of single-segment read-write buffers",
3436 &bufs[nbufs]))
3437 goto finally;
3438 iovs[nbufs].iov_base = bufs[nbufs].buf;
3439 iovs[nbufs].iov_len = bufs[nbufs].len;
3440 }
3441
3442 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3443 &makeval_recvmsg_into, NULL);
3444finally:
3445 for (i = 0; i < nbufs; i++)
3446 PyBuffer_Release(&bufs[i]);
3447 PyMem_Free(bufs);
3448 PyMem_Free(iovs);
3449 Py_DECREF(fast);
3450 return retval;
3451}
3452
3453PyDoc_STRVAR(recvmsg_into_doc,
3454"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3455\n\
3456Receive normal data and ancillary data from the socket, scattering the\n\
3457non-ancillary data into a series of buffers. The buffers argument\n\
3458must be an iterable of objects that export writable buffers\n\
3459(e.g. bytearray objects); these will be filled with successive chunks\n\
3460of the non-ancillary data until it has all been written or there are\n\
3461no more buffers. The ancbufsize argument sets the size in bytes of\n\
3462the internal buffer used to receive the ancillary data; it defaults to\n\
34630, meaning that no ancillary data will be received. Appropriate\n\
3464buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3465or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3466truncated or discarded. The flags argument defaults to 0 and has the\n\
3467same meaning as for recv().\n\
3468\n\
3469The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3470The nbytes item is the total number of bytes of non-ancillary data\n\
3471written into the buffers. The ancdata item is a list of zero or more\n\
3472tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3473data (control messages) received: cmsg_level and cmsg_type are\n\
3474integers specifying the protocol level and protocol-specific type\n\
3475respectively, and cmsg_data is a bytes object holding the associated\n\
3476data. The msg_flags item is the bitwise OR of various flags\n\
3477indicating conditions on the received message; see your system\n\
3478documentation for details. If the receiving socket is unconnected,\n\
3479address is the address of the sending socket, if available; otherwise,\n\
3480its value is unspecified.\n\
3481\n\
3482If recvmsg_into() raises an exception after the system call returns,\n\
3483it will first attempt to close any file descriptors received via the\n\
3484SCM_RIGHTS mechanism.");
3485#endif /* CMSG_LEN */
3486
3487
Victor Stinner31bf2d52015-04-01 21:57:09 +02003488struct sock_send {
3489 char *buf;
3490 Py_ssize_t len;
3491 int flags;
3492 Py_ssize_t result;
3493};
3494
3495static int
3496sock_send_impl(PySocketSockObject *s, void *data)
3497{
3498 struct sock_send *ctx = data;
3499
3500#ifdef MS_WINDOWS
3501 if (ctx->len > INT_MAX)
3502 ctx->len = INT_MAX;
3503 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3504#else
3505 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3506#endif
3507 return (ctx->result >= 0);
3508}
3509
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003510/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003511
Guido van Rossum73624e91994-10-10 17:59:00 +00003512static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003513sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003514{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003515 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003517 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3520 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003522 if (!IS_SELECTABLE(s)) {
3523 PyBuffer_Release(&pbuf);
3524 return select_error();
3525 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003526 ctx.buf = pbuf.buf;
3527 ctx.len = pbuf.len;
3528 ctx.flags = flags;
3529 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003530 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 return NULL;
3532 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003533 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003534
3535 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003536}
3537
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003538PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003539"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003540\n\
3541Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003542argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003543sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003544
3545
3546/* s.sendall(data [,flags]) method */
3547
3548static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003549sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003552 Py_ssize_t len, n;
3553 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003555 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003556 int has_timeout = (s->sock_timeout > 0);
3557 _PyTime_t interval = s->sock_timeout;
3558 _PyTime_t deadline = 0;
3559 int deadline_initialized = 0;
3560 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3563 return NULL;
3564 buf = pbuf.buf;
3565 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 if (!IS_SELECTABLE(s)) {
3568 PyBuffer_Release(&pbuf);
3569 return select_error();
3570 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003573 if (has_timeout) {
3574 if (deadline_initialized) {
3575 /* recompute the timeout */
3576 interval = deadline - _PyTime_GetMonotonicClock();
3577 }
3578 else {
3579 deadline_initialized = 1;
3580 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3581 }
3582
3583 if (interval <= 0) {
3584 PyErr_SetString(socket_timeout, "timed out");
3585 goto done;
3586 }
3587 }
3588
Victor Stinner02f32ab2015-04-01 22:53:26 +02003589 ctx.buf = buf;
3590 ctx.len = len;
3591 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003592 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3593 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003594 n = ctx.result;
3595 assert(n >= 0);
3596
3597 buf += n;
3598 len -= n;
3599
3600 /* We must run our signal handlers before looping again.
3601 send() can return a successful partial write when it is
3602 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003603 if (PyErr_CheckSignals())
3604 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003605 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003606 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003607
Victor Stinner8912d142015-04-06 23:16:34 +02003608 Py_INCREF(Py_None);
3609 res = Py_None;
3610
3611done:
3612 PyBuffer_Release(&pbuf);
3613 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003614}
3615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003616PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003617"sendall(data[, flags])\n\
3618\n\
3619Send a data string to the socket. For the optional flags\n\
3620argument, see the Unix manual. This calls send() repeatedly\n\
3621until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003622to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003623
Guido van Rossum30a685f1991-06-27 15:51:29 +00003624
Victor Stinner31bf2d52015-04-01 21:57:09 +02003625struct sock_sendto {
3626 char *buf;
3627 Py_ssize_t len;
3628 int flags;
3629 int addrlen;
3630 sock_addr_t *addrbuf;
3631 Py_ssize_t result;
3632};
3633
3634static int
3635sock_sendto_impl(PySocketSockObject *s, void *data)
3636{
3637 struct sock_sendto *ctx = data;
3638
3639#ifdef MS_WINDOWS
3640 if (ctx->len > INT_MAX)
3641 ctx->len = INT_MAX;
3642 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3643 SAS2SA(ctx->addrbuf), ctx->addrlen);
3644#else
3645 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3646 SAS2SA(ctx->addrbuf), ctx->addrlen);
3647#endif
3648 return (ctx->result >= 0);
3649}
3650
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003651/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003652
Guido van Rossum73624e91994-10-10 17:59:00 +00003653static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003654sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003655{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 Py_buffer pbuf;
3657 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003658 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003659 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003660 int addrlen, flags;
3661 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003663 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003664 arglen = PyTuple_Size(args);
3665 switch (arglen) {
3666 case 2:
3667 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3668 break;
3669 case 3:
3670 PyArg_ParseTuple(args, "y*iO:sendto",
3671 &pbuf, &flags, &addro);
3672 break;
3673 default:
3674 PyErr_Format(PyExc_TypeError,
3675 "sendto() takes 2 or 3 arguments (%d given)",
3676 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003677 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003678 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003679 if (PyErr_Occurred())
3680 return NULL;
3681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003682 if (!IS_SELECTABLE(s)) {
3683 PyBuffer_Release(&pbuf);
3684 return select_error();
3685 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003687 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3688 PyBuffer_Release(&pbuf);
3689 return NULL;
3690 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003691
Victor Stinner31bf2d52015-04-01 21:57:09 +02003692 ctx.buf = pbuf.buf;
3693 ctx.len = pbuf.len;
3694 ctx.flags = flags;
3695 ctx.addrlen = addrlen;
3696 ctx.addrbuf = &addrbuf;
3697 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003698 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003699 return NULL;
3700 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003701 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003702
3703 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003704}
3705
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003706PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003707"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003708\n\
3709Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003710For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003711
Guido van Rossum30a685f1991-06-27 15:51:29 +00003712
Victor Stinner35bee932015-04-02 12:28:07 +02003713/* The sendmsg() and recvmsg[_into]() methods require a working
3714 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3715#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003716struct sock_sendmsg {
3717 struct msghdr *msg;
3718 int flags;
3719 ssize_t result;
3720};
3721
3722static int
3723sock_sendmsg_impl(PySocketSockObject *s, void *data)
3724{
3725 struct sock_sendmsg *ctx = data;
3726
3727 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3728 return (ctx->result >= 0);
3729}
3730
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3732
3733static PyObject *
3734sock_sendmsg(PySocketSockObject *s, PyObject *args)
3735{
3736 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3737 Py_buffer *databufs = NULL;
3738 struct iovec *iovs = NULL;
3739 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003740 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003741 struct cmsginfo {
3742 int level;
3743 int type;
3744 Py_buffer data;
3745 } *cmsgs = NULL;
3746 void *controlbuf = NULL;
3747 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003748 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003749 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3750 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003751 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003752
3753 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3754 &data_arg, &cmsg_arg, &flags, &addr_arg))
3755 return NULL;
3756
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003757 /* Parse destination address. */
3758 if (addr_arg != NULL && addr_arg != Py_None) {
3759 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3760 goto finally;
3761 msg.msg_name = &addrbuf;
3762 msg.msg_namelen = addrlen;
3763 }
3764
3765 /* Fill in an iovec for each message part, and save the Py_buffer
3766 structs to release afterwards. */
3767 if ((data_fast = PySequence_Fast(data_arg,
3768 "sendmsg() argument 1 must be an "
3769 "iterable")) == NULL)
3770 goto finally;
3771 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3772 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003773 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003774 goto finally;
3775 }
3776 msg.msg_iovlen = ndataparts;
3777 if (ndataparts > 0 &&
3778 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3779 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3780 PyErr_NoMemory();
3781 goto finally;
3782 }
3783 for (; ndatabufs < ndataparts; ndatabufs++) {
3784 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3785 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003786 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003787 &databufs[ndatabufs]))
3788 goto finally;
3789 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3790 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3791 }
3792
3793 if (cmsg_arg == NULL)
3794 ncmsgs = 0;
3795 else {
3796 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3797 "sendmsg() argument 2 must be an "
3798 "iterable")) == NULL)
3799 goto finally;
3800 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3801 }
3802
3803#ifndef CMSG_SPACE
3804 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003805 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003806 "sending multiple control messages is not supported "
3807 "on this system");
3808 goto finally;
3809 }
3810#endif
3811 /* Save level, type and Py_buffer for each control message,
3812 and calculate total size. */
3813 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3814 PyErr_NoMemory();
3815 goto finally;
3816 }
3817 controllen = controllen_last = 0;
3818 while (ncmsgbufs < ncmsgs) {
3819 size_t bufsize, space;
3820
3821 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3822 "(iiy*):[sendmsg() ancillary data items]",
3823 &cmsgs[ncmsgbufs].level,
3824 &cmsgs[ncmsgbufs].type,
3825 &cmsgs[ncmsgbufs].data))
3826 goto finally;
3827 bufsize = cmsgs[ncmsgbufs++].data.len;
3828
3829#ifdef CMSG_SPACE
3830 if (!get_CMSG_SPACE(bufsize, &space)) {
3831#else
3832 if (!get_CMSG_LEN(bufsize, &space)) {
3833#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003834 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003835 goto finally;
3836 }
3837 controllen += space;
3838 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003839 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003840 goto finally;
3841 }
3842 controllen_last = controllen;
3843 }
3844
3845 /* Construct ancillary data block from control message info. */
3846 if (ncmsgbufs > 0) {
3847 struct cmsghdr *cmsgh = NULL;
3848
3849 if ((msg.msg_control = controlbuf =
3850 PyMem_Malloc(controllen)) == NULL) {
3851 PyErr_NoMemory();
3852 goto finally;
3853 }
3854 msg.msg_controllen = controllen;
3855
3856 /* Need to zero out the buffer as a workaround for glibc's
3857 CMSG_NXTHDR() implementation. After getting the pointer to
3858 the next header, it checks its (uninitialized) cmsg_len
3859 member to see if the "message" fits in the buffer, and
3860 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003861 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003862 memset(controlbuf, 0, controllen);
3863
3864 for (i = 0; i < ncmsgbufs; i++) {
3865 size_t msg_len, data_len = cmsgs[i].data.len;
3866 int enough_space = 0;
3867
3868 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3869 if (cmsgh == NULL) {
3870 PyErr_Format(PyExc_RuntimeError,
3871 "unexpected NULL result from %s()",
3872 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3873 goto finally;
3874 }
3875 if (!get_CMSG_LEN(data_len, &msg_len)) {
3876 PyErr_SetString(PyExc_RuntimeError,
3877 "item size out of range for CMSG_LEN()");
3878 goto finally;
3879 }
3880 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3881 size_t space;
3882
3883 cmsgh->cmsg_len = msg_len;
3884 if (get_cmsg_data_space(&msg, cmsgh, &space))
3885 enough_space = (space >= data_len);
3886 }
3887 if (!enough_space) {
3888 PyErr_SetString(PyExc_RuntimeError,
3889 "ancillary data does not fit in calculated "
3890 "space");
3891 goto finally;
3892 }
3893 cmsgh->cmsg_level = cmsgs[i].level;
3894 cmsgh->cmsg_type = cmsgs[i].type;
3895 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3896 }
3897 }
3898
3899 /* Make the system call. */
3900 if (!IS_SELECTABLE(s)) {
3901 select_error();
3902 goto finally;
3903 }
3904
Victor Stinner31bf2d52015-04-01 21:57:09 +02003905 ctx.msg = &msg;
3906 ctx.flags = flags;
3907 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003908 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003909
3910 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003911
3912finally:
3913 PyMem_Free(controlbuf);
3914 for (i = 0; i < ncmsgbufs; i++)
3915 PyBuffer_Release(&cmsgs[i].data);
3916 PyMem_Free(cmsgs);
3917 Py_XDECREF(cmsg_fast);
3918 for (i = 0; i < ndatabufs; i++)
3919 PyBuffer_Release(&databufs[i]);
3920 PyMem_Free(databufs);
3921 PyMem_Free(iovs);
3922 Py_XDECREF(data_fast);
3923 return retval;
3924}
3925
3926PyDoc_STRVAR(sendmsg_doc,
3927"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3928\n\
3929Send normal and ancillary data to the socket, gathering the\n\
3930non-ancillary data from a series of buffers and concatenating it into\n\
3931a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003932data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003933The ancdata argument specifies the ancillary data (control messages)\n\
3934as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3935cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3936protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003937is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003938argument defaults to 0 and has the same meaning as for send(). If\n\
3939address is supplied and not None, it sets a destination address for\n\
3940the message. The return value is the number of bytes of non-ancillary\n\
3941data sent.");
3942#endif /* CMSG_LEN */
3943
3944
Guido van Rossum30a685f1991-06-27 15:51:29 +00003945/* s.shutdown(how) method */
3946
Guido van Rossum73624e91994-10-10 17:59:00 +00003947static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003948sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 int how;
3951 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003952
Serhiy Storchaka78980432013-01-15 01:12:17 +02003953 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 if (how == -1 && PyErr_Occurred())
3955 return NULL;
3956 Py_BEGIN_ALLOW_THREADS
3957 res = shutdown(s->sock_fd, how);
3958 Py_END_ALLOW_THREADS
3959 if (res < 0)
3960 return s->errorhandler();
3961 Py_INCREF(Py_None);
3962 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003963}
3964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003965PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003966"shutdown(flag)\n\
3967\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003968Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3969of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003970
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003971#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003972static PyObject*
3973sock_ioctl(PySocketSockObject *s, PyObject *arg)
3974{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003975 unsigned long cmd = SIO_RCVALL;
3976 PyObject *argO;
3977 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003979 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3980 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003982 switch (cmd) {
3983 case SIO_RCVALL: {
3984 unsigned int option = RCVALL_ON;
3985 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3986 return NULL;
3987 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3988 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3989 return set_error();
3990 }
3991 return PyLong_FromUnsignedLong(recv); }
3992 case SIO_KEEPALIVE_VALS: {
3993 struct tcp_keepalive ka;
3994 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3995 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3996 return NULL;
3997 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3998 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3999 return set_error();
4000 }
4001 return PyLong_FromUnsignedLong(recv); }
4002 default:
4003 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4004 return NULL;
4005 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004006}
4007PyDoc_STRVAR(sock_ioctl_doc,
4008"ioctl(cmd, option) -> long\n\
4009\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004010Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4011SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4012SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004013#endif
4014
4015#if defined(MS_WINDOWS)
4016static PyObject*
4017sock_share(PySocketSockObject *s, PyObject *arg)
4018{
4019 WSAPROTOCOL_INFO info;
4020 DWORD processId;
4021 int result;
4022
4023 if (!PyArg_ParseTuple(arg, "I", &processId))
4024 return NULL;
4025
4026 Py_BEGIN_ALLOW_THREADS
4027 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4028 Py_END_ALLOW_THREADS
4029 if (result == SOCKET_ERROR)
4030 return set_error();
4031 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4032}
4033PyDoc_STRVAR(sock_share_doc,
4034"share(process_id) -> bytes\n\
4035\n\
4036Share the socket with another process. The target process id\n\
4037must be provided and the resulting bytes object passed to the target\n\
4038process. There the shared socket can be instantiated by calling\n\
4039socket.fromshare().");
4040
Christian Heimesfaf2f632008-01-06 16:59:19 +00004041
4042#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004043
4044/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004045
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004046static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4048 accept_doc},
4049 {"bind", (PyCFunction)sock_bind, METH_O,
4050 bind_doc},
4051 {"close", (PyCFunction)sock_close, METH_NOARGS,
4052 close_doc},
4053 {"connect", (PyCFunction)sock_connect, METH_O,
4054 connect_doc},
4055 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4056 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004057 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4058 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4060 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004061#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 {"getpeername", (PyCFunction)sock_getpeername,
4063 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004064#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 {"getsockname", (PyCFunction)sock_getsockname,
4066 METH_NOARGS, getsockname_doc},
4067 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4068 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004069#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004070 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4071 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004072#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004073#if defined(MS_WINDOWS)
4074 {"share", (PyCFunction)sock_share, METH_VARARGS,
4075 sock_share_doc},
4076#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004077 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 listen_doc},
4079 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4080 recv_doc},
4081 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4082 recv_into_doc},
4083 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4084 recvfrom_doc},
4085 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4086 recvfrom_into_doc},
4087 {"send", (PyCFunction)sock_send, METH_VARARGS,
4088 send_doc},
4089 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4090 sendall_doc},
4091 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4092 sendto_doc},
4093 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4094 setblocking_doc},
4095 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4096 settimeout_doc},
4097 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4098 gettimeout_doc},
4099 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4100 setsockopt_doc},
4101 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4102 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004103#ifdef CMSG_LEN
4104 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4105 recvmsg_doc},
4106 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4107 recvmsg_into_doc,},
4108 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4109 sendmsg_doc},
4110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004111 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004112};
4113
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004114/* SockObject members */
4115static PyMemberDef sock_memberlist[] = {
4116 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4117 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4118 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004119 {0},
4120};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004121
Victor Stinner71694d52015-03-28 01:18:54 +01004122static PyGetSetDef sock_getsetlist[] = {
4123 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4124 {NULL} /* sentinel */
4125};
4126
Guido van Rossum73624e91994-10-10 17:59:00 +00004127/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004128 First close the file description. */
4129
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004130static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004131sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004132{
Antoine Pitroue033e062010-10-29 10:38:18 +00004133 if (s->sock_fd != -1) {
4134 PyObject *exc, *val, *tb;
4135 Py_ssize_t old_refcount = Py_REFCNT(s);
4136 ++Py_REFCNT(s);
4137 PyErr_Fetch(&exc, &val, &tb);
4138 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4139 "unclosed %R", s))
4140 /* Spurious errors can appear at shutdown */
4141 if (PyErr_ExceptionMatches(PyExc_Warning))
4142 PyErr_WriteUnraisable((PyObject *) s);
4143 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004144 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004145 Py_REFCNT(s) = old_refcount;
4146 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004148}
4149
Guido van Rossum30a685f1991-06-27 15:51:29 +00004150
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004151static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004152sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004153{
Victor Stinnere254e532014-07-26 14:36:55 +02004154 long sock_fd;
4155 /* On Windows, this test is needed because SOCKET_T is unsigned */
4156 if (s->sock_fd == INVALID_SOCKET) {
4157 sock_fd = -1;
4158 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004159#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004160 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004161 /* this can occur on Win64, and actually there is a special
4162 ugly printf formatter for decimal pointer length integer
4163 printing, only bother if necessary*/
4164 PyErr_SetString(PyExc_OverflowError,
4165 "no printf formatter to display "
4166 "the socket descriptor in decimal");
4167 return NULL;
4168 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004169#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004170 else
4171 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004172 return PyUnicode_FromFormat(
4173 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004174 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 s->sock_type,
4176 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004177}
4178
4179
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004180/* Create a new, uninitialized socket object. */
4181
4182static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004183sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004184{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 new = type->tp_alloc(type, 0);
4188 if (new != NULL) {
4189 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner9001d802015-04-06 23:06:01 +02004190 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004191 ((PySocketSockObject *)new)->errorhandler = &set_error;
4192 }
4193 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004194}
4195
4196
4197/* Initialize a new socket object. */
4198
Victor Stinnerdaf45552013-08-28 00:53:59 +02004199#ifdef SOCK_CLOEXEC
4200/* socket() and socketpair() fail with EINVAL on Linux kernel older
4201 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4202static int sock_cloexec_works = -1;
4203#endif
4204
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004205/*ARGSUSED*/
4206static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004207sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004208{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004209 PySocketSockObject *s = (PySocketSockObject *)self;
4210 PyObject *fdobj = NULL;
4211 SOCKET_T fd = INVALID_SOCKET;
4212 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4213 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004214#ifndef MS_WINDOWS
4215#ifdef SOCK_CLOEXEC
4216 int *atomic_flag_works = &sock_cloexec_works;
4217#else
4218 int *atomic_flag_works = NULL;
4219#endif
4220#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4223 "|iiiO:socket", keywords,
4224 &family, &type, &proto, &fdobj))
4225 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004227 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004228#ifdef MS_WINDOWS
4229 /* recreate a socket that was duplicated */
4230 if (PyBytes_Check(fdobj)) {
4231 WSAPROTOCOL_INFO info;
4232 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4233 PyErr_Format(PyExc_ValueError,
4234 "socket descriptor string has wrong size, "
4235 "should be %zu bytes.", sizeof(info));
4236 return -1;
4237 }
4238 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4239 Py_BEGIN_ALLOW_THREADS
4240 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4241 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4242 Py_END_ALLOW_THREADS
4243 if (fd == INVALID_SOCKET) {
4244 set_error();
4245 return -1;
4246 }
4247 family = info.iAddressFamily;
4248 type = info.iSocketType;
4249 proto = info.iProtocol;
4250 }
4251 else
4252#endif
4253 {
4254 fd = PyLong_AsSocket_t(fdobj);
4255 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4256 return -1;
4257 if (fd == INVALID_SOCKET) {
4258 PyErr_SetString(PyExc_ValueError,
4259 "can't use invalid socket value");
4260 return -1;
4261 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 }
4263 }
4264 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004265#ifdef MS_WINDOWS
4266 /* Windows implementation */
4267#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4268#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4269#endif
4270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004272 if (support_wsa_no_inherit) {
4273 fd = WSASocket(family, type, proto,
4274 NULL, 0,
4275 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4276 if (fd == INVALID_SOCKET) {
4277 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4278 support_wsa_no_inherit = 0;
4279 fd = socket(family, type, proto);
4280 }
4281 }
4282 else {
4283 fd = socket(family, type, proto);
4284 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004287 if (fd == INVALID_SOCKET) {
4288 set_error();
4289 return -1;
4290 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004291
4292 if (!support_wsa_no_inherit) {
4293 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4294 closesocket(fd);
4295 PyErr_SetFromWindowsErr(0);
4296 return -1;
4297 }
4298 }
4299#else
4300 /* UNIX */
4301 Py_BEGIN_ALLOW_THREADS
4302#ifdef SOCK_CLOEXEC
4303 if (sock_cloexec_works != 0) {
4304 fd = socket(family, type | SOCK_CLOEXEC, proto);
4305 if (sock_cloexec_works == -1) {
4306 if (fd >= 0) {
4307 sock_cloexec_works = 1;
4308 }
4309 else if (errno == EINVAL) {
4310 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4311 sock_cloexec_works = 0;
4312 fd = socket(family, type, proto);
4313 }
4314 }
4315 }
4316 else
4317#endif
4318 {
4319 fd = socket(family, type, proto);
4320 }
4321 Py_END_ALLOW_THREADS
4322
4323 if (fd == INVALID_SOCKET) {
4324 set_error();
4325 return -1;
4326 }
4327
4328 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4329 SOCKETCLOSE(fd);
4330 return -1;
4331 }
4332#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004333 }
4334 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004337
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004338}
4339
4340
Guido van Rossumb6775db1994-08-01 11:34:53 +00004341/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004342
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004343static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004344 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4345 "_socket.socket", /* tp_name */
4346 sizeof(PySocketSockObject), /* tp_basicsize */
4347 0, /* tp_itemsize */
4348 (destructor)sock_dealloc, /* tp_dealloc */
4349 0, /* tp_print */
4350 0, /* tp_getattr */
4351 0, /* tp_setattr */
4352 0, /* tp_reserved */
4353 (reprfunc)sock_repr, /* tp_repr */
4354 0, /* tp_as_number */
4355 0, /* tp_as_sequence */
4356 0, /* tp_as_mapping */
4357 0, /* tp_hash */
4358 0, /* tp_call */
4359 0, /* tp_str */
4360 PyObject_GenericGetAttr, /* tp_getattro */
4361 0, /* tp_setattro */
4362 0, /* tp_as_buffer */
4363 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4364 sock_doc, /* tp_doc */
4365 0, /* tp_traverse */
4366 0, /* tp_clear */
4367 0, /* tp_richcompare */
4368 0, /* tp_weaklistoffset */
4369 0, /* tp_iter */
4370 0, /* tp_iternext */
4371 sock_methods, /* tp_methods */
4372 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004373 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004374 0, /* tp_base */
4375 0, /* tp_dict */
4376 0, /* tp_descr_get */
4377 0, /* tp_descr_set */
4378 0, /* tp_dictoffset */
4379 sock_initobj, /* tp_init */
4380 PyType_GenericAlloc, /* tp_alloc */
4381 sock_new, /* tp_new */
4382 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004383};
4384
Guido van Rossum30a685f1991-06-27 15:51:29 +00004385
Guido van Rossum81194471991-07-27 21:42:02 +00004386/* Python interface to gethostname(). */
4387
4388/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004389static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004390socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004391{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004392#ifdef MS_WINDOWS
4393 /* Don't use winsock's gethostname, as this returns the ANSI
4394 version of the hostname, whereas we need a Unicode string.
4395 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004396 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004397 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004398 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004399 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004400
4401 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004402 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004403
4404 if (GetLastError() != ERROR_MORE_DATA)
4405 return PyErr_SetFromWindowsErr(0);
4406
4407 if (size == 0)
4408 return PyUnicode_New(0, 0);
4409
4410 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4411 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004412 name = PyMem_New(wchar_t, size);
4413 if (!name) {
4414 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004415 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004416 }
Victor Stinner74168972011-11-17 01:11:36 +01004417 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4418 name,
4419 &size))
4420 {
4421 PyMem_Free(name);
4422 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004423 }
Victor Stinner74168972011-11-17 01:11:36 +01004424
4425 result = PyUnicode_FromWideChar(name, size);
4426 PyMem_Free(name);
4427 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004428#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004429 char buf[1024];
4430 int res;
4431 Py_BEGIN_ALLOW_THREADS
4432 res = gethostname(buf, (int) sizeof buf - 1);
4433 Py_END_ALLOW_THREADS
4434 if (res < 0)
4435 return set_error();
4436 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004437 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004438#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004439}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004440
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004441PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004442"gethostname() -> string\n\
4443\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004444Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004445
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004446#ifdef HAVE_SETHOSTNAME
4447PyDoc_STRVAR(sethostname_doc,
4448"sethostname(name)\n\n\
4449Sets the hostname to name.");
4450
4451static PyObject *
4452socket_sethostname(PyObject *self, PyObject *args)
4453{
4454 PyObject *hnobj;
4455 Py_buffer buf;
4456 int res, flag = 0;
4457
Christian Heimesd2774c72013-06-19 02:06:29 +02004458#ifdef _AIX
4459/* issue #18259, not declared in any useful header file */
4460extern int sethostname(const char *, size_t);
4461#endif
4462
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004463 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4464 PyErr_Clear();
4465 if (!PyArg_ParseTuple(args, "O&:sethostname",
4466 PyUnicode_FSConverter, &hnobj))
4467 return NULL;
4468 flag = 1;
4469 }
4470 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4471 if (!res) {
4472 res = sethostname(buf.buf, buf.len);
4473 PyBuffer_Release(&buf);
4474 }
4475 if (flag)
4476 Py_DECREF(hnobj);
4477 if (res)
4478 return set_error();
4479 Py_RETURN_NONE;
4480}
4481#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004482
Guido van Rossum30a685f1991-06-27 15:51:29 +00004483/* Python interface to gethostbyname(name). */
4484
4485/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004486static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004487socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 char *name;
4490 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004491 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004492
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004493 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 return NULL;
4495 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004496 goto finally;
4497 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4498finally:
4499 PyMem_Free(name);
4500 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004501}
4502
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004503PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004504"gethostbyname(host) -> address\n\
4505\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004506Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004507
4508
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004509/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4510
4511static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004512gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 char **pch;
4515 PyObject *rtn_tuple = (PyObject *)NULL;
4516 PyObject *name_list = (PyObject *)NULL;
4517 PyObject *addr_list = (PyObject *)NULL;
4518 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 if (h == NULL) {
4521 /* Let's get real error message to return */
4522 set_herror(h_errno);
4523 return NULL;
4524 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004526 if (h->h_addrtype != af) {
4527 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004528 errno = EAFNOSUPPORT;
4529 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 return NULL;
4531 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004535 case AF_INET:
4536 if (alen < sizeof(struct sockaddr_in))
4537 return NULL;
4538 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004539
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004540#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 case AF_INET6:
4542 if (alen < sizeof(struct sockaddr_in6))
4543 return NULL;
4544 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004545#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 if ((name_list = PyList_New(0)) == NULL)
4550 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004551
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 if ((addr_list = PyList_New(0)) == NULL)
4553 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004555 /* SF #1511317: h_aliases can be NULL */
4556 if (h->h_aliases) {
4557 for (pch = h->h_aliases; *pch != NULL; pch++) {
4558 int status;
4559 tmp = PyUnicode_FromString(*pch);
4560 if (tmp == NULL)
4561 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004563 status = PyList_Append(name_list, tmp);
4564 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 if (status)
4567 goto err;
4568 }
4569 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4572 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 case AF_INET:
4577 {
4578 struct sockaddr_in sin;
4579 memset(&sin, 0, sizeof(sin));
4580 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004581#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004583#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004584 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4585 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 if (pch == h->h_addr_list && alen >= sizeof(sin))
4588 memcpy((char *) addr, &sin, sizeof(sin));
4589 break;
4590 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004591
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004592#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 case AF_INET6:
4594 {
4595 struct sockaddr_in6 sin6;
4596 memset(&sin6, 0, sizeof(sin6));
4597 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004598#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004600#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4602 tmp = makeipaddr((struct sockaddr *)&sin6,
4603 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4606 memcpy((char *) addr, &sin6, sizeof(sin6));
4607 break;
4608 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004609#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004612 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 "unsupported address family");
4614 return NULL;
4615 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 if (tmp == NULL)
4618 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 status = PyList_Append(addr_list, tmp);
4621 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 if (status)
4624 goto err;
4625 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004628
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004629 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004630 Py_XDECREF(name_list);
4631 Py_XDECREF(addr_list);
4632 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004633}
4634
4635
4636/* Python interface to gethostbyname_ex(name). */
4637
4638/*ARGSUSED*/
4639static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004640socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004641{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 char *name;
4643 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004644 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004645 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004646 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004647#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004649#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004651#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 char buf[16384];
4653 int buf_len = (sizeof buf) - 1;
4654 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004655#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004656#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004658#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004659#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004660
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004661 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004663 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004664 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004666#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004667#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004668 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004670#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004672#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 memset((void *) &data, '\0', sizeof(data));
4674 result = gethostbyname_r(name, &hp_allocated, &data);
4675 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004676#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004677#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004678#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004682#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 Py_END_ALLOW_THREADS
4684 /* Some C libraries would require addr.__ss_family instead of
4685 addr.ss_family.
4686 Therefore, we cast the sockaddr_storage into sockaddr to
4687 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004688 sa = SAS2SA(&addr);
4689 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004690 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004691#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004693#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004694finally:
4695 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004696 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004697}
4698
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004699PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004700"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4701\n\
4702Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004703for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004704
4705
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004706/* Python interface to gethostbyaddr(IP). */
4707
4708/*ARGSUSED*/
4709static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004710socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004711{
Charles-François Natali8b759652011-12-23 16:44:51 +01004712 sock_addr_t addr;
4713 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 char *ip_num;
4715 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004716 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004717#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004719#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004721#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 /* glibcs up to 2.10 assume that the buf argument to
4723 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4724 does not ensure. The attribute below instructs the compiler
4725 to maintain this alignment. */
4726 char buf[16384] Py_ALIGNED(8);
4727 int buf_len = (sizeof buf) - 1;
4728 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004729#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004730#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004732#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004733#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004734 char *ap;
4735 int al;
4736 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004737
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004738 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004739 return NULL;
4740 af = AF_UNSPEC;
4741 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004742 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 af = sa->sa_family;
4744 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004745 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 switch (af) {
4747 case AF_INET:
4748 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4749 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4750 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004751#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 case AF_INET6:
4753 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4754 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4755 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004757 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004758 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004759 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004760 }
4761 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004762#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004763#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004764 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004765 &hp_allocated, buf, buf_len,
4766 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004767#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004768 h = gethostbyaddr_r(ap, al, af,
4769 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004770#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 memset((void *) &data, '\0', sizeof(data));
4772 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4773 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004774#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004775#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004776#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004777 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004778#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004780#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004782 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004783#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004785#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004786finally:
4787 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004788 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004789}
4790
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004791PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004792"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4793\n\
4794Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004795for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004796
Guido van Rossum30a685f1991-06-27 15:51:29 +00004797
4798/* Python interface to getservbyname(name).
4799 This only returns the port number, since the other info is already
4800 known or not useful (like the list of aliases). */
4801
4802/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004803static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004804socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004805{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004806 char *name, *proto=NULL;
4807 struct servent *sp;
4808 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4809 return NULL;
4810 Py_BEGIN_ALLOW_THREADS
4811 sp = getservbyname(name, proto);
4812 Py_END_ALLOW_THREADS
4813 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004814 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 return NULL;
4816 }
4817 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004818}
4819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004820PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004821"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004822\n\
4823Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004824The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4825otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004826
Guido van Rossum30a685f1991-06-27 15:51:29 +00004827
Barry Warsaw11b91a02004-06-28 00:50:43 +00004828/* Python interface to getservbyport(port).
4829 This only returns the service name, since the other info is already
4830 known or not useful (like the list of aliases). */
4831
4832/*ARGSUSED*/
4833static PyObject *
4834socket_getservbyport(PyObject *self, PyObject *args)
4835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 int port;
4837 char *proto=NULL;
4838 struct servent *sp;
4839 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4840 return NULL;
4841 if (port < 0 || port > 0xffff) {
4842 PyErr_SetString(
4843 PyExc_OverflowError,
4844 "getservbyport: port must be 0-65535.");
4845 return NULL;
4846 }
4847 Py_BEGIN_ALLOW_THREADS
4848 sp = getservbyport(htons((short)port), proto);
4849 Py_END_ALLOW_THREADS
4850 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004851 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004852 return NULL;
4853 }
4854 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004855}
4856
4857PyDoc_STRVAR(getservbyport_doc,
4858"getservbyport(port[, protocolname]) -> string\n\
4859\n\
4860Return the service name from a port number and protocol name.\n\
4861The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4862otherwise any protocol will match.");
4863
Guido van Rossum3901d851996-12-19 16:35:04 +00004864/* Python interface to getprotobyname(name).
4865 This only returns the protocol number, since the other info is
4866 already known or not useful (like the list of aliases). */
4867
4868/*ARGSUSED*/
4869static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004870socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004872 char *name;
4873 struct protoent *sp;
4874 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4875 return NULL;
4876 Py_BEGIN_ALLOW_THREADS
4877 sp = getprotobyname(name);
4878 Py_END_ALLOW_THREADS
4879 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004880 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004881 return NULL;
4882 }
4883 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004884}
4885
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004886PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004887"getprotobyname(name) -> integer\n\
4888\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004889Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004890
Guido van Rossum3901d851996-12-19 16:35:04 +00004891
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004892#ifndef NO_DUP
4893/* dup() function for socket fds */
4894
4895static PyObject *
4896socket_dup(PyObject *self, PyObject *fdobj)
4897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004898 SOCKET_T fd, newfd;
4899 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004900#ifdef MS_WINDOWS
4901 WSAPROTOCOL_INFO info;
4902#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 fd = PyLong_AsSocket_t(fdobj);
4905 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4906 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004907
Victor Stinnerdaf45552013-08-28 00:53:59 +02004908#ifdef MS_WINDOWS
4909 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4910 return set_error();
4911
4912 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4913 FROM_PROTOCOL_INFO,
4914 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 if (newfd == INVALID_SOCKET)
4916 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004917
Victor Stinnerdaf45552013-08-28 00:53:59 +02004918 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4919 closesocket(newfd);
4920 PyErr_SetFromWindowsErr(0);
4921 return NULL;
4922 }
4923#else
4924 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4925 newfd = _Py_dup(fd);
4926 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004927 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004928#endif
4929
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004930 newfdobj = PyLong_FromSocket_t(newfd);
4931 if (newfdobj == NULL)
4932 SOCKETCLOSE(newfd);
4933 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004934}
4935
4936PyDoc_STRVAR(dup_doc,
4937"dup(integer) -> integer\n\
4938\n\
4939Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4940sockets; on some platforms os.dup() won't work for socket file descriptors.");
4941#endif
4942
4943
Dave Cole331708b2004-08-09 04:51:41 +00004944#ifdef HAVE_SOCKETPAIR
4945/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004946 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004947 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004948
4949/*ARGSUSED*/
4950static PyObject *
4951socket_socketpair(PyObject *self, PyObject *args)
4952{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004953 PySocketSockObject *s0 = NULL, *s1 = NULL;
4954 SOCKET_T sv[2];
4955 int family, type = SOCK_STREAM, proto = 0;
4956 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004957#ifdef SOCK_CLOEXEC
4958 int *atomic_flag_works = &sock_cloexec_works;
4959#else
4960 int *atomic_flag_works = NULL;
4961#endif
4962 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004963
4964#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004966#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004967 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004969 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4970 &family, &type, &proto))
4971 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004973 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004974 Py_BEGIN_ALLOW_THREADS
4975#ifdef SOCK_CLOEXEC
4976 if (sock_cloexec_works != 0) {
4977 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4978 if (sock_cloexec_works == -1) {
4979 if (ret >= 0) {
4980 sock_cloexec_works = 1;
4981 }
4982 else if (errno == EINVAL) {
4983 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4984 sock_cloexec_works = 0;
4985 ret = socketpair(family, type, proto, sv);
4986 }
4987 }
4988 }
4989 else
4990#endif
4991 {
4992 ret = socketpair(family, type, proto, sv);
4993 }
4994 Py_END_ALLOW_THREADS
4995
4996 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004998
4999 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5000 goto finally;
5001 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5002 goto finally;
5003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 s0 = new_sockobject(sv[0], family, type, proto);
5005 if (s0 == NULL)
5006 goto finally;
5007 s1 = new_sockobject(sv[1], family, type, proto);
5008 if (s1 == NULL)
5009 goto finally;
5010 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005011
5012finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 if (res == NULL) {
5014 if (s0 == NULL)
5015 SOCKETCLOSE(sv[0]);
5016 if (s1 == NULL)
5017 SOCKETCLOSE(sv[1]);
5018 }
5019 Py_XDECREF(s0);
5020 Py_XDECREF(s1);
5021 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005022}
5023
5024PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005025"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005026\n\
5027Create a pair of socket objects from the sockets returned by the platform\n\
5028socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005029The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005030AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005031
5032#endif /* HAVE_SOCKETPAIR */
5033
5034
Guido van Rossum006bf911996-06-12 04:04:55 +00005035static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005036socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005037{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005040 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5041 return NULL;
5042 }
5043 if (x1 < 0) {
5044 PyErr_SetString(PyExc_OverflowError,
5045 "can't convert negative number to unsigned long");
5046 return NULL;
5047 }
5048 x2 = (unsigned int)ntohs((unsigned short)x1);
5049 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005050}
5051
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005052PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005053"ntohs(integer) -> integer\n\
5054\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005055Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005056
5057
Guido van Rossum006bf911996-06-12 04:04:55 +00005058static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005059socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005061 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005063 if (PyLong_Check(arg)) {
5064 x = PyLong_AsUnsignedLong(arg);
5065 if (x == (unsigned long) -1 && PyErr_Occurred())
5066 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005067#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 {
5069 unsigned long y;
5070 /* only want the trailing 32 bits */
5071 y = x & 0xFFFFFFFFUL;
5072 if (y ^ x)
5073 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005074 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005075 x = y;
5076 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 }
5079 else
5080 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005081 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005082 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005084}
5085
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005086PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005087"ntohl(integer) -> integer\n\
5088\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005089Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005090
5091
Guido van Rossum006bf911996-06-12 04:04:55 +00005092static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005093socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5098 return NULL;
5099 }
5100 if (x1 < 0) {
5101 PyErr_SetString(PyExc_OverflowError,
5102 "can't convert negative number to unsigned long");
5103 return NULL;
5104 }
5105 x2 = (unsigned int)htons((unsigned short)x1);
5106 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005107}
5108
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005109PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005110"htons(integer) -> integer\n\
5111\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005112Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005113
5114
Guido van Rossum006bf911996-06-12 04:04:55 +00005115static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005116socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005120 if (PyLong_Check(arg)) {
5121 x = PyLong_AsUnsignedLong(arg);
5122 if (x == (unsigned long) -1 && PyErr_Occurred())
5123 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005124#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 {
5126 unsigned long y;
5127 /* only want the trailing 32 bits */
5128 y = x & 0xFFFFFFFFUL;
5129 if (y ^ x)
5130 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005131 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005132 x = y;
5133 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 }
5136 else
5137 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005138 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005139 Py_TYPE(arg)->tp_name);
5140 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005141}
5142
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005143PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005144"htonl(integer) -> integer\n\
5145\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005146Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005147
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005148/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005149
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005150PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005151"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005152\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005153Convert 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 +00005154binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005155
5156static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005157socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005158{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005159#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005161#endif
5162
5163#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005164#if (SIZEOF_INT != 4)
5165#error "Not sure if in_addr_t exists and int is not 32-bits."
5166#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 /* Have to use inet_addr() instead */
5168 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5173 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005174
Tim Peters1df9fdd2003-02-13 03:13:40 +00005175
5176#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005177
5178#ifdef USE_INET_ATON_WEAKLINK
5179 if (inet_aton != NULL) {
5180#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 if (inet_aton(ip_addr, &buf))
5182 return PyBytes_FromStringAndSize((char *)(&buf),
5183 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005184
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005185 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005186 "illegal IP address string passed to inet_aton");
5187 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005188
Thomas Wouters477c8d52006-05-27 19:21:47 +00005189#ifdef USE_INET_ATON_WEAKLINK
5190 } else {
5191#endif
5192
5193#endif
5194
5195#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 /* special-case this address as inet_addr might return INADDR_NONE
5198 * for this */
5199 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005200 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005201 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005203 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005206 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 "illegal IP address string passed to inet_aton");
5208 return NULL;
5209 }
5210 }
5211 return PyBytes_FromStringAndSize((char *) &packed_addr,
5212 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005213
5214#ifdef USE_INET_ATON_WEAKLINK
5215 }
5216#endif
5217
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005218#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005219}
5220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005221PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005222"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005223\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005224Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005225
5226static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005227socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005228{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005229 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005231
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005232 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 return NULL;
5234 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005235
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005236 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005237 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005239 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 return NULL;
5241 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005242
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005243 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5244 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005246 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005247}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005248
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005249#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005250
5251PyDoc_STRVAR(inet_pton_doc,
5252"inet_pton(af, ip) -> packed IP address string\n\
5253\n\
5254Convert an IP address from string format to a packed string suitable\n\
5255for use with low-level network functions.");
5256
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005257#endif
5258
5259#ifdef HAVE_INET_PTON
5260
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005261static PyObject *
5262socket_inet_pton(PyObject *self, PyObject *args)
5263{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 int af;
5265 char* ip;
5266 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005267#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005268 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005269#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005271#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5273 return NULL;
5274 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005275
Martin v. Löwis04697e82004-06-02 12:35:29 +00005276#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005278 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 "can't use AF_INET6, IPv6 is disabled");
5280 return NULL;
5281 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005282#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005284 retval = inet_pton(af, ip, packed);
5285 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005286 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 return NULL;
5288 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005289 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 "illegal IP address string passed to inet_pton");
5291 return NULL;
5292 } else if (af == AF_INET) {
5293 return PyBytes_FromStringAndSize(packed,
5294 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005295#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 } else if (af == AF_INET6) {
5297 return PyBytes_FromStringAndSize(packed,
5298 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005301 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 return NULL;
5303 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005304}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005305#elif defined(MS_WINDOWS)
5306
5307static PyObject *
5308socket_inet_pton(PyObject *self, PyObject *args)
5309{
5310 int af;
5311 char* ip;
5312 struct sockaddr_in6 addr;
5313 INT ret, size;
5314
5315 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5316 return NULL;
5317 }
5318
Victor Stinnere990c6e2013-11-16 00:18:58 +01005319 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005320 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5321
5322 if (ret) {
5323 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5324 return NULL;
5325 } else if(af == AF_INET) {
5326 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005327 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005328 sizeof(addr4->sin_addr));
5329 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005330 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005331 sizeof(addr.sin6_addr));
5332 } else {
5333 PyErr_SetString(PyExc_OSError, "unknown address family");
5334 return NULL;
5335 }
5336}
5337
5338#endif
5339
5340#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005341
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005342PyDoc_STRVAR(inet_ntop_doc,
5343"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5344\n\
5345Convert a packed IP address of the given family to string format.");
5346
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005347#endif
5348
5349
5350#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005351static PyObject *
5352socket_inet_ntop(PyObject *self, PyObject *args)
5353{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005355 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005356 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005357#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005358 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005359#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005361#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005362
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5364 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005365
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005366 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 return NULL;
5368 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005371 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 PyErr_SetString(PyExc_ValueError,
5373 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005374 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005375 return NULL;
5376 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005377#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005378 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005379 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 PyErr_SetString(PyExc_ValueError,
5381 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005382 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005383 return NULL;
5384 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005385#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 } else {
5387 PyErr_Format(PyExc_ValueError,
5388 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005389 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 return NULL;
5391 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005392
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005393 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5394 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005395 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005396 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 return NULL;
5398 } else {
5399 return PyUnicode_FromString(retval);
5400 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 /* NOTREACHED */
5403 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5404 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005405}
5406
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005407#elif defined(MS_WINDOWS)
5408
5409static PyObject *
5410socket_inet_ntop(PyObject *self, PyObject *args)
5411{
5412 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005413 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005414 struct sockaddr_in6 addr;
5415 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005416#ifdef ENABLE_IPV6
5417 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5418#else
5419 char ip[INET_ADDRSTRLEN + 1];
5420#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005421
5422 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5423 memset((void *) &ip[0], '\0', sizeof(ip));
5424
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005425 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005426 return NULL;
5427 }
5428
5429 if (af == AF_INET) {
5430 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5431
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005432 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005433 PyErr_SetString(PyExc_ValueError,
5434 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005435 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005436 return NULL;
5437 }
5438 memset(addr4, 0, sizeof(struct sockaddr_in));
5439 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005440 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005441 addrlen = sizeof(struct sockaddr_in);
5442 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005443 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005444 PyErr_SetString(PyExc_ValueError,
5445 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005446 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005447 return NULL;
5448 }
5449
5450 memset(&addr, 0, sizeof(addr));
5451 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005452 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005453 addrlen = sizeof(addr);
5454 } else {
5455 PyErr_Format(PyExc_ValueError,
5456 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005457 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005458 return NULL;
5459 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005460 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005461
5462 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005463 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005464 ip, &retlen);
5465
5466 if (ret) {
5467 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5468 return NULL;
5469 } else {
5470 return PyUnicode_FromString(ip);
5471 }
5472}
5473
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005474#endif /* HAVE_INET_PTON */
5475
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005476/* Python interface to getaddrinfo(host, port). */
5477
5478/*ARGSUSED*/
5479static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005480socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005481{
Victor Stinner77af1722011-05-26 14:05:59 +02005482 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005483 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 struct addrinfo hints, *res;
5485 struct addrinfo *res0 = NULL;
5486 PyObject *hobj = NULL;
5487 PyObject *pobj = (PyObject *)NULL;
5488 char pbuf[30];
5489 char *hptr, *pptr;
5490 int family, socktype, protocol, flags;
5491 int error;
5492 PyObject *all = (PyObject *)NULL;
5493 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005494
Georg Brandl6083a4b2013-10-14 06:51:46 +02005495 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005496 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005497 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005498 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005499 &protocol, &flags)) {
5500 return NULL;
5501 }
5502 if (hobj == Py_None) {
5503 hptr = NULL;
5504 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005505 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005506
5507 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005508 if (!idna)
5509 return NULL;
5510 assert(PyBytes_Check(idna));
5511 hptr = PyBytes_AS_STRING(idna);
5512 } else if (PyBytes_Check(hobj)) {
5513 hptr = PyBytes_AsString(hobj);
5514 } else {
5515 PyErr_SetString(PyExc_TypeError,
5516 "getaddrinfo() argument 1 must be string or None");
5517 return NULL;
5518 }
5519 if (PyLong_CheckExact(pobj)) {
5520 long value = PyLong_AsLong(pobj);
5521 if (value == -1 && PyErr_Occurred())
5522 goto err;
5523 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5524 pptr = pbuf;
5525 } else if (PyUnicode_Check(pobj)) {
5526 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005527 if (pptr == NULL)
5528 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005530 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 } else if (pobj == Py_None) {
5532 pptr = (char *)NULL;
5533 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005534 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 goto err;
5536 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005537#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005538 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5539 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005540 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5541 * This workaround avoids a segfault in libsystem.
5542 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005543 pptr = "00";
5544 }
5545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005546 memset(&hints, 0, sizeof(hints));
5547 hints.ai_family = family;
5548 hints.ai_socktype = socktype;
5549 hints.ai_protocol = protocol;
5550 hints.ai_flags = flags;
5551 Py_BEGIN_ALLOW_THREADS
5552 ACQUIRE_GETADDRINFO_LOCK
5553 error = getaddrinfo(hptr, pptr, &hints, &res0);
5554 Py_END_ALLOW_THREADS
5555 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5556 if (error) {
5557 set_gaierror(error);
5558 goto err;
5559 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005560
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005561 all = PyList_New(0);
5562 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 goto err;
5564 for (res = res0; res; res = res->ai_next) {
5565 PyObject *single;
5566 PyObject *addr =
5567 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5568 if (addr == NULL)
5569 goto err;
5570 single = Py_BuildValue("iiisO", res->ai_family,
5571 res->ai_socktype, res->ai_protocol,
5572 res->ai_canonname ? res->ai_canonname : "",
5573 addr);
5574 Py_DECREF(addr);
5575 if (single == NULL)
5576 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 if (PyList_Append(all, single))
5579 goto err;
5580 Py_XDECREF(single);
5581 }
5582 Py_XDECREF(idna);
5583 if (res0)
5584 freeaddrinfo(res0);
5585 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005586 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 Py_XDECREF(all);
5588 Py_XDECREF(idna);
5589 if (res0)
5590 freeaddrinfo(res0);
5591 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005592}
5593
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005594PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005595"getaddrinfo(host, port [, family, type, proto, flags])\n\
5596 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005597\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005598Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005599
5600/* Python interface to getnameinfo(sa, flags). */
5601
5602/*ARGSUSED*/
5603static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005604socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005605{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 PyObject *sa = (PyObject *)NULL;
5607 int flags;
5608 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005609 int port;
5610 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005611 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5612 struct addrinfo hints, *res = NULL;
5613 int error;
5614 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005615
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005616 flags = flowinfo = scope_id = 0;
5617 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5618 return NULL;
5619 if (!PyTuple_Check(sa)) {
5620 PyErr_SetString(PyExc_TypeError,
5621 "getnameinfo() argument 1 must be a tuple");
5622 return NULL;
5623 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005624 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 &hostp, &port, &flowinfo, &scope_id))
5626 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005627 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005628 PyErr_SetString(PyExc_OverflowError,
5629 "getsockaddrarg: flowinfo must be 0-1048575.");
5630 return NULL;
5631 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005632 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5633 memset(&hints, 0, sizeof(hints));
5634 hints.ai_family = AF_UNSPEC;
5635 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005636 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 Py_BEGIN_ALLOW_THREADS
5638 ACQUIRE_GETADDRINFO_LOCK
5639 error = getaddrinfo(hostp, pbuf, &hints, &res);
5640 Py_END_ALLOW_THREADS
5641 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5642 if (error) {
5643 set_gaierror(error);
5644 goto fail;
5645 }
5646 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005647 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 "sockaddr resolved to multiple addresses");
5649 goto fail;
5650 }
5651 switch (res->ai_family) {
5652 case AF_INET:
5653 {
5654 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005655 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 "IPv4 sockaddr must be 2 tuple");
5657 goto fail;
5658 }
5659 break;
5660 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005661#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005662 case AF_INET6:
5663 {
5664 struct sockaddr_in6 *sin6;
5665 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005666 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005667 sin6->sin6_scope_id = scope_id;
5668 break;
5669 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005672 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5674 if (error) {
5675 set_gaierror(error);
5676 goto fail;
5677 }
5678 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005679
5680fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005681 if (res)
5682 freeaddrinfo(res);
5683 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005684}
5685
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005686PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005687"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005688\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005689Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005690
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005691
5692/* Python API to getting and setting the default timeout value. */
5693
5694static PyObject *
5695socket_getdefaulttimeout(PyObject *self)
5696{
Victor Stinner71694d52015-03-28 01:18:54 +01005697 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 Py_INCREF(Py_None);
5699 return Py_None;
5700 }
Victor Stinner71694d52015-03-28 01:18:54 +01005701 else {
5702 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5703 return PyFloat_FromDouble(seconds);
5704 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005705}
5706
5707PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005708"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005709\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005710Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005711A value of None indicates that new socket objects have no timeout.\n\
5712When the socket module is first imported, the default is None.");
5713
5714static PyObject *
5715socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5716{
Victor Stinner71694d52015-03-28 01:18:54 +01005717 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005718
Victor Stinner71694d52015-03-28 01:18:54 +01005719 if (socket_parse_timeout(&timeout, arg) < 0)
5720 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005722 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005724 Py_INCREF(Py_None);
5725 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005726}
5727
5728PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005729"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005730\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005731Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005732A value of None indicates that new socket objects have no timeout.\n\
5733When the socket module is first imported, the default is None.");
5734
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005735#ifdef HAVE_IF_NAMEINDEX
5736/* Python API for getting interface indices and names */
5737
5738static PyObject *
5739socket_if_nameindex(PyObject *self, PyObject *arg)
5740{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005741 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005742 int i;
5743 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005744
Charles-François Natali60713592011-05-20 16:55:06 +02005745 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005746 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005747 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005748 return NULL;
5749 }
5750
5751 list = PyList_New(0);
5752 if (list == NULL) {
5753 if_freenameindex(ni);
5754 return NULL;
5755 }
5756
Charles-François Natali60713592011-05-20 16:55:06 +02005757 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5758 PyObject *ni_tuple = Py_BuildValue("IO&",
5759 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005760
5761 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5762 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005763 Py_DECREF(list);
5764 if_freenameindex(ni);
5765 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005766 }
5767 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005768 }
5769
5770 if_freenameindex(ni);
5771 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005772}
5773
5774PyDoc_STRVAR(if_nameindex_doc,
5775"if_nameindex()\n\
5776\n\
5777Returns a list of network interface information (index, name) tuples.");
5778
Charles-François Natali60713592011-05-20 16:55:06 +02005779static PyObject *
5780socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005781{
Charles-François Natali60713592011-05-20 16:55:06 +02005782 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005783 unsigned long index;
5784
Charles-François Natali60713592011-05-20 16:55:06 +02005785 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5786 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005787 return NULL;
5788
Charles-François Natali60713592011-05-20 16:55:06 +02005789 index = if_nametoindex(PyBytes_AS_STRING(oname));
5790 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005791 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005792 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005793 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005794 return NULL;
5795 }
5796
5797 return PyLong_FromUnsignedLong(index);
5798}
5799
5800PyDoc_STRVAR(if_nametoindex_doc,
5801"if_nametoindex(if_name)\n\
5802\n\
5803Returns the interface index corresponding to the interface name if_name.");
5804
Charles-François Natali60713592011-05-20 16:55:06 +02005805static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005806socket_if_indextoname(PyObject *self, PyObject *arg)
5807{
Charles-François Natali60713592011-05-20 16:55:06 +02005808 unsigned long index;
5809 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005810
Charles-François Natali60713592011-05-20 16:55:06 +02005811 index = PyLong_AsUnsignedLong(arg);
5812 if (index == (unsigned long) -1)
5813 return NULL;
5814
5815 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005816 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005817 return NULL;
5818 }
5819
Charles-François Natali60713592011-05-20 16:55:06 +02005820 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005821}
5822
5823PyDoc_STRVAR(if_indextoname_doc,
5824"if_indextoname(if_index)\n\
5825\n\
5826Returns the interface name corresponding to the interface index if_index.");
5827
5828#endif /* HAVE_IF_NAMEINDEX */
5829
5830
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005831#ifdef CMSG_LEN
5832/* Python interface to CMSG_LEN(length). */
5833
5834static PyObject *
5835socket_CMSG_LEN(PyObject *self, PyObject *args)
5836{
5837 Py_ssize_t length;
5838 size_t result;
5839
5840 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5841 return NULL;
5842 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5843 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5844 return NULL;
5845 }
5846 return PyLong_FromSize_t(result);
5847}
5848
5849PyDoc_STRVAR(CMSG_LEN_doc,
5850"CMSG_LEN(length) -> control message length\n\
5851\n\
5852Return the total length, without trailing padding, of an ancillary\n\
5853data item with associated data of the given length. This value can\n\
5854often be used as the buffer size for recvmsg() to receive a single\n\
5855item of ancillary data, but RFC 3542 requires portable applications to\n\
5856use CMSG_SPACE() and thus include space for padding, even when the\n\
5857item will be the last in the buffer. Raises OverflowError if length\n\
5858is outside the permissible range of values.");
5859
5860
5861#ifdef CMSG_SPACE
5862/* Python interface to CMSG_SPACE(length). */
5863
5864static PyObject *
5865socket_CMSG_SPACE(PyObject *self, PyObject *args)
5866{
5867 Py_ssize_t length;
5868 size_t result;
5869
5870 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5871 return NULL;
5872 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5873 PyErr_SetString(PyExc_OverflowError,
5874 "CMSG_SPACE() argument out of range");
5875 return NULL;
5876 }
5877 return PyLong_FromSize_t(result);
5878}
5879
5880PyDoc_STRVAR(CMSG_SPACE_doc,
5881"CMSG_SPACE(length) -> buffer size\n\
5882\n\
5883Return the buffer size needed for recvmsg() to receive an ancillary\n\
5884data item with associated data of the given length, along with any\n\
5885trailing padding. The buffer space needed to receive multiple items\n\
5886is the sum of the CMSG_SPACE() values for their associated data\n\
5887lengths. Raises OverflowError if length is outside the permissible\n\
5888range of values.");
5889#endif /* CMSG_SPACE */
5890#endif /* CMSG_LEN */
5891
5892
Guido van Rossum30a685f1991-06-27 15:51:29 +00005893/* List of functions exported by this module. */
5894
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005895static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 {"gethostbyname", socket_gethostbyname,
5897 METH_VARARGS, gethostbyname_doc},
5898 {"gethostbyname_ex", socket_gethostbyname_ex,
5899 METH_VARARGS, ghbn_ex_doc},
5900 {"gethostbyaddr", socket_gethostbyaddr,
5901 METH_VARARGS, gethostbyaddr_doc},
5902 {"gethostname", socket_gethostname,
5903 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005904#ifdef HAVE_SETHOSTNAME
5905 {"sethostname", socket_sethostname,
5906 METH_VARARGS, sethostname_doc},
5907#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 {"getservbyname", socket_getservbyname,
5909 METH_VARARGS, getservbyname_doc},
5910 {"getservbyport", socket_getservbyport,
5911 METH_VARARGS, getservbyport_doc},
5912 {"getprotobyname", socket_getprotobyname,
5913 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005914#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005915 {"dup", socket_dup,
5916 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005917#endif
Dave Cole331708b2004-08-09 04:51:41 +00005918#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005919 {"socketpair", socket_socketpair,
5920 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005921#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 {"ntohs", socket_ntohs,
5923 METH_VARARGS, ntohs_doc},
5924 {"ntohl", socket_ntohl,
5925 METH_O, ntohl_doc},
5926 {"htons", socket_htons,
5927 METH_VARARGS, htons_doc},
5928 {"htonl", socket_htonl,
5929 METH_O, htonl_doc},
5930 {"inet_aton", socket_inet_aton,
5931 METH_VARARGS, inet_aton_doc},
5932 {"inet_ntoa", socket_inet_ntoa,
5933 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005934#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005935 {"inet_pton", socket_inet_pton,
5936 METH_VARARGS, inet_pton_doc},
5937 {"inet_ntop", socket_inet_ntop,
5938 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005939#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005940 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5941 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 {"getnameinfo", socket_getnameinfo,
5943 METH_VARARGS, getnameinfo_doc},
5944 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5945 METH_NOARGS, getdefaulttimeout_doc},
5946 {"setdefaulttimeout", socket_setdefaulttimeout,
5947 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005948#ifdef HAVE_IF_NAMEINDEX
5949 {"if_nameindex", socket_if_nameindex,
5950 METH_NOARGS, if_nameindex_doc},
5951 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005952 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005953 {"if_indextoname", socket_if_indextoname,
5954 METH_O, if_indextoname_doc},
5955#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005956#ifdef CMSG_LEN
5957 {"CMSG_LEN", socket_CMSG_LEN,
5958 METH_VARARGS, CMSG_LEN_doc},
5959#ifdef CMSG_SPACE
5960 {"CMSG_SPACE", socket_CMSG_SPACE,
5961 METH_VARARGS, CMSG_SPACE_doc},
5962#endif
5963#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005964 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005965};
5966
Guido van Rossum30a685f1991-06-27 15:51:29 +00005967
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005968#ifdef MS_WINDOWS
5969#define OS_INIT_DEFINED
5970
5971/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005972
5973static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005974os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005975{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005977}
5978
5979static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005980os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005981{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005982 WSADATA WSAData;
5983 int ret;
5984 ret = WSAStartup(0x0101, &WSAData);
5985 switch (ret) {
5986 case 0: /* No error */
5987 Py_AtExit(os_cleanup);
5988 return 1; /* Success */
5989 case WSASYSNOTREADY:
5990 PyErr_SetString(PyExc_ImportError,
5991 "WSAStartup failed: network not ready");
5992 break;
5993 case WSAVERNOTSUPPORTED:
5994 case WSAEINVAL:
5995 PyErr_SetString(
5996 PyExc_ImportError,
5997 "WSAStartup failed: requested version not supported");
5998 break;
5999 default:
6000 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6001 break;
6002 }
6003 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006004}
6005
Guido van Rossum8d665e61996-06-26 18:22:49 +00006006#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006007
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006008
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006009
6010#ifndef OS_INIT_DEFINED
6011static int
6012os_init(void)
6013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006015}
6016#endif
6017
6018
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006019/* C API table - always add new things to the end for binary
6020 compatibility. */
6021static
6022PySocketModule_APIObject PySocketModuleAPI =
6023{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006024 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006025 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006027};
6028
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006029
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006030/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006031
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006032 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006033 "socket.py" which implements some additional functionality.
6034 The import of "_socket" may fail with an ImportError exception if
6035 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006036 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006037 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006038*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006040PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006041"Implementation module for socket operations.\n\
6042\n\
6043See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006044
Martin v. Löwis1a214512008-06-11 05:26:20 +00006045static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 PyModuleDef_HEAD_INIT,
6047 PySocket_MODULE_NAME,
6048 socket_doc,
6049 -1,
6050 socket_methods,
6051 NULL,
6052 NULL,
6053 NULL,
6054 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006055};
6056
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006057PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006058PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006061
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006062 if (!os_init())
6063 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006064
Victor Stinnerdaf45552013-08-28 00:53:59 +02006065#ifdef MS_WINDOWS
6066 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006067#if defined(_MSC_VER) && _MSC_VER >= 1800
6068 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6069#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006070 DWORD version = GetVersion();
6071 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6072 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6073 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006074 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6075#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006076 }
6077#endif
6078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 Py_TYPE(&sock_type) = &PyType_Type;
6080 m = PyModule_Create(&socketmodule);
6081 if (m == NULL)
6082 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006083
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006084 Py_INCREF(PyExc_OSError);
6085 PySocketModuleAPI.error = PyExc_OSError;
6086 Py_INCREF(PyExc_OSError);
6087 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006089 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006090 if (socket_herror == NULL)
6091 return NULL;
6092 Py_INCREF(socket_herror);
6093 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006094 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 NULL);
6096 if (socket_gaierror == NULL)
6097 return NULL;
6098 Py_INCREF(socket_gaierror);
6099 PyModule_AddObject(m, "gaierror", socket_gaierror);
6100 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006101 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006102 if (socket_timeout == NULL)
6103 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006104 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 Py_INCREF(socket_timeout);
6106 PyModule_AddObject(m, "timeout", socket_timeout);
6107 Py_INCREF((PyObject *)&sock_type);
6108 if (PyModule_AddObject(m, "SocketType",
6109 (PyObject *)&sock_type) != 0)
6110 return NULL;
6111 Py_INCREF((PyObject *)&sock_type);
6112 if (PyModule_AddObject(m, "socket",
6113 (PyObject *)&sock_type) != 0)
6114 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006115
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006116#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006118#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006119 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006120#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 Py_INCREF(has_ipv6);
6122 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 /* Export C API */
6125 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6126 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6127 ) != 0)
6128 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006131#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006132 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006133#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006134 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006135#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006136 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006137#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006138#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006139 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006140#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006141#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006144#endif
6145#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006146 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006147#endif
6148#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006150 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006151#endif
6152#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006154 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006155#endif
6156#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006159#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006160#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006163#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006164#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006166 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006167#endif
6168#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006169 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006171#endif
6172#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006173 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006174#endif
6175#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006176 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006177 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006178#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006179#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006180 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006182#endif
6183#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006184 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006185 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006186#endif
6187#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006188 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006190#endif
6191#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006192 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006193 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006194#endif
6195#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006196 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, AF_NETLINK);
6198 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006199#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006200 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006201#endif
6202#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006204#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006205 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6206 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006207#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006208 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006209#endif
6210#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006212#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006213#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006215#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006216#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006218#endif
6219#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006220 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006221#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006223#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006224 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006225#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006226#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006227 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006228#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006229#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006230#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006231 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006232 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006233#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006234#ifdef AF_LINK
6235 PyModule_AddIntMacro(m, AF_LINK);
6236#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006237#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006239 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006240#endif
6241#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006243 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006244#endif
6245#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006248#endif
6249#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006251 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006252#endif
6253#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006255 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006256#endif
6257#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006258 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006259 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006260#endif
6261#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006262 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006263 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006264#endif
6265#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006267 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006268#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006269
Hye-Shik Chang81268602004-02-02 06:05:24 +00006270#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6272 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6273 PyModule_AddIntMacro(m, BTPROTO_HCI);
6274 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006275#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006277#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006278#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006279#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006281#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6283 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006284#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006286 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6287 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006288#endif
6289
Charles-François Natali47413c12011-10-06 19:47:44 +02006290#ifdef AF_CAN
6291 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006293#endif
6294#ifdef PF_CAN
6295 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006297#endif
6298
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006299/* Reliable Datagram Sockets */
6300#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006302#endif
6303#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006305#endif
6306
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006307/* Kernel event messages */
6308#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006310#endif
6311#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006312 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006313#endif
6314
Antoine Pitroub156a462010-10-27 20:13:57 +00006315#ifdef AF_PACKET
6316 PyModule_AddIntMacro(m, AF_PACKET);
6317#endif
6318#ifdef PF_PACKET
6319 PyModule_AddIntMacro(m, PF_PACKET);
6320#endif
6321#ifdef PACKET_HOST
6322 PyModule_AddIntMacro(m, PACKET_HOST);
6323#endif
6324#ifdef PACKET_BROADCAST
6325 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6326#endif
6327#ifdef PACKET_MULTICAST
6328 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6329#endif
6330#ifdef PACKET_OTHERHOST
6331 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6332#endif
6333#ifdef PACKET_OUTGOING
6334 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6335#endif
6336#ifdef PACKET_LOOPBACK
6337 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6338#endif
6339#ifdef PACKET_FASTROUTE
6340 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006341#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006342
Christian Heimes043d6f62008-01-07 17:19:16 +00006343#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6348 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6349 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006350
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006351 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6352 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6353 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, SOL_TIPC);
6357 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6358 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6359 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6360 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006361
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6363 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6364 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6365 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6369 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006370#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006371 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006372 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006373#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006374 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6375 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6376 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6377 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6378 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6379 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006380#endif
6381
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006382 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, SOCK_STREAM);
6384 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006385/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, SOCK_RAW);
6387 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006388#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006390#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006391#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006393#endif
6394#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006396#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006399 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006402 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006406#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006407#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006409#endif
6410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006425#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006426#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006428#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006429#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006430 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006431#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006432#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006434#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006435#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006437#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006438#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006440#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006441#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006443#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006458#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006459#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006461#endif
6462#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006464#endif
6465#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006467#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006468#ifdef SO_BINDTODEVICE
6469 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6470#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006471#ifdef SO_PRIORITY
6472 PyModule_AddIntMacro(m, SO_PRIORITY);
6473#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006474#ifdef SO_MARK
6475 PyModule_AddIntMacro(m, SO_MARK);
6476#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478 /* Maximum number of connections for "listen" */
6479#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006481#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006482 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006483#endif
6484
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006485 /* Ancilliary message types */
6486#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006488#endif
6489#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006491#endif
6492#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006494#endif
6495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496 /* Flags for send, recv */
6497#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006498 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006499#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006500#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006501 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006502#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006503#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006504 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006508#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006510 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006511#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006512#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006514#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006516 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006518#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006519 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006521#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006522 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006523#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006524#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006525 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006526#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006527#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006529#endif
6530#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006532#endif
6533#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006535#endif
6536#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006537 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006538#endif
6539#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006541#endif
6542#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006544#endif
6545#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006547#endif
6548#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006550#endif
6551#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006553#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006554#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006556#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558 /* Protocol level and numbers, usable for [gs]etsockopt */
6559#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006564#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006584#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006586#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006587#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006589#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006591#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006592#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006594#endif
6595#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6597 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006598#endif
6599#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6601 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6602 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006603
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6605 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6606 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006607#endif
6608#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6610 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6611 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6612 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006613#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006614#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006616 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6617 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6618 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6619 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6620 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6621 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6622 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6623 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6624 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6625 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6626 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6627 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6628#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006629#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006631#endif
6632#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006634#endif
6635#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006637#endif
6638#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006640#endif
6641#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006643#endif
6644#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006646#endif
6647#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006652#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006654#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006655#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006658#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006660#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006662#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006664 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006665#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006666#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006680#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006682#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006683#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006688#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006690 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006691#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006692 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006694#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006696#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006698 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006700#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006701 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006703#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006704 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006707 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006709#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006714#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006716 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006717#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006718#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006720#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006721#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006753#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006754#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006759#endif
6760/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006762 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006763#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006768#endif
6769
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006770#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006772#endif
6773
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006774 /* Some port configuration */
6775#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006777#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006782#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006784#endif
6785
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 /* Some reserved IP v.4 addresses */
6787#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006789#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006794#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006797#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006799#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006800 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006802#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006804#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006805 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006807#ifdef INADDR_ALLHOSTS_GROUP
6808 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6809 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006810#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006812#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006813#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006815#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006820#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006821 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006822#endif
6823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006824 /* IPv4 [gs]etsockopt options */
6825#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006830#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006831#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006833#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006834#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006836#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006837#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006839#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006840#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006843#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006845#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006846#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006849#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006851#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006853 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006854#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006855#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006856 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006857#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006858#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006859 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006860#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006872#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006873#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006875#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6878#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006879 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006880#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006881#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006882 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006883#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006884#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006885 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006886#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006887#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006891 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006892#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006893#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006894 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006895#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006896 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006897#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006901#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006902 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006903#endif
6904#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006905 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006906#endif
6907#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006908 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006909#endif
6910#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006911 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006912#endif
6913#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006914 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006915#endif
6916#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006917 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006918#endif
6919#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006920 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006921#endif
6922#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006923 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006924#endif
6925#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006926 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006927#endif
6928#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006929 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006930#endif
6931#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006932 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006933#endif
6934#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006935 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006936#endif
6937#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006939#endif
6940#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006942#endif
6943#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006945#endif
6946#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006948#endif
6949#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006951#endif
6952#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006954#endif
6955#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006957#endif
6958#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006960#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962 /* TCP options */
6963#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006964 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006966#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006967 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006968#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006969#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006970 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006971#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006972#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006973 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006975#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006976 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006979 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006980#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006981#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006982 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006983#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006984#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006986#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006987#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006989#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006990#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006992#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006995#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006996#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006998#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006999#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007001#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007003 /* IPX options */
7004#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007005 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007006#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007007
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007008/* Reliable Datagram Sockets */
7009#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007011#endif
7012#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007014#endif
7015#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007017#endif
7018#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007020#endif
7021#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007023#endif
7024#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007026#endif
7027#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007029#endif
7030#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007032#endif
7033#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007035#endif
7036#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007038#endif
7039#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007041#endif
7042#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007043 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007044#endif
7045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007047#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007048 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007049#endif
7050#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007051 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007052#endif
7053#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007054 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007055#endif
7056#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007057 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007058#endif
7059#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007060 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007061#endif
7062#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007063 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007064#endif
7065#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007066 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007067#endif
7068#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007069 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007070#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007071#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007072 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007073#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007074#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007075 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007076#endif
7077#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007078 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007079#endif
7080#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007081 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007082#endif
7083#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007085#endif
7086#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007088#endif
7089#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007091#endif
7092#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007094#endif
7095#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007097#endif
7098#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007100#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007101#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007103#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007104#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007106#endif
7107#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007109#endif
7110#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007112#endif
7113#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007115#endif
7116#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007118#endif
7119#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007121#endif
7122#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007124#endif
7125#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007127#endif
7128#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007130#endif
7131#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007133#endif
7134#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007136#endif
7137#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007139#endif
7140#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007142#endif
7143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007144 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007145#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007146 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007147#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007149#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007150 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007151#endif
7152#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007154#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007155 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007156#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007157 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007158#endif
7159#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007160 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007161#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007162 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007163#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007164 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007165#endif
7166
Christian Heimesfaf2f632008-01-06 16:59:19 +00007167#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 {
7169 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7170 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7171 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007172 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007173 PyObject *tmp;
7174 tmp = PyLong_FromUnsignedLong(codes[i]);
7175 if (tmp == NULL)
7176 return NULL;
7177 PyModule_AddObject(m, names[i], tmp);
7178 }
7179 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007180 PyModule_AddIntMacro(m, RCVALL_OFF);
7181 PyModule_AddIntMacro(m, RCVALL_ON);
7182 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007183#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007184 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007185#endif
7186#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007187 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007188#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007189#endif /* _MSTCPIP_ */
7190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007192#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007194#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007195 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007196}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007197
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007198
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007199#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007200#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007201
7202/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007203/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007204
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007205int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007206inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007208 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007209#if (SIZEOF_INT != 4)
7210#error "Not sure if in_addr_t exists and int is not 32-bits."
7211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007212 unsigned int packed_addr;
7213 packed_addr = inet_addr(src);
7214 if (packed_addr == INADDR_NONE)
7215 return 0;
7216 memcpy(dst, &packed_addr, 4);
7217 return 1;
7218 }
7219 /* Should set errno to EAFNOSUPPORT */
7220 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007221}
7222
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007223const char *
7224inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007226 if (af == AF_INET) {
7227 struct in_addr packed_addr;
7228 if (size < 16)
7229 /* Should set errno to ENOSPC. */
7230 return NULL;
7231 memcpy(&packed_addr, src, sizeof(packed_addr));
7232 return strncpy(dst, inet_ntoa(packed_addr), size);
7233 }
7234 /* Should set errno to EAFNOSUPPORT */
7235 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007236}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007237
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007238#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007239#endif