blob: 81e9cc908fc46117aee135cbcd2692554077c06b [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
Victor Stinner81c41db2015-04-02 11:50:57 +0200632 /* for connect(), we want to poll even if the socket is blocking */
633 if (!connect) {
634 /* Nothing to do unless we're in timeout mode (not non-blocking) */
635 if (s->sock_timeout <= 0)
636 return 0;
637
638 /* Handling this condition here simplifies the select loops */
639 if (interval < 0)
640 return 1;
641 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 /* Prefer poll, if available, since you can poll() any fd
644 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000645#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100646 pollfd.fd = s->sock_fd;
647 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200648 if (connect) {
649 /* On Windows, the socket becomes writable on connection success,
650 but a connection failure is notified as an error. On POSIX, the
651 socket becomes writable on connection success or on connection
652 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200653 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200654 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000655
Victor Stinner71694d52015-03-28 01:18:54 +0100656 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner81c41db2015-04-02 11:50:57 +0200657 if (interval >= 0)
658 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
659 else
660 ms = -1;
Victor Stinnere6951c62015-03-31 13:50:44 +0200661 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000662
Victor Stinner71694d52015-03-28 01:18:54 +0100663 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200664 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100665 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000666#else
Victor Stinner81c41db2015-04-02 11:50:57 +0200667 if (interval >= 0)
668 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
669 else {
670 tv.tv_sec = -1;
671 tv.tv_sec = 0;
672 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000673
Victor Stinner71694d52015-03-28 01:18:54 +0100674 FD_ZERO(&fds);
675 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200676 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200677 if (connect) {
678 /* On Windows, the socket becomes writable on connection success,
679 but a connection failure is notified as an error. On POSIX, the
680 socket becomes writable on connection success or on connection
681 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200682 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200683 }
Victor Stinner71694d52015-03-28 01:18:54 +0100684
685 /* See if the socket is ready */
686 Py_BEGIN_ALLOW_THREADS;
687 if (writing)
688 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200689 NULL, &fds, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100690 else
691 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200692 &fds, NULL, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100693 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000694#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000696 if (n < 0)
697 return -1;
698 if (n == 0)
699 return 1;
700 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000701}
702
Victor Stinner31bf2d52015-04-01 21:57:09 +0200703/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000704
Victor Stinner81c41db2015-04-02 11:50:57 +0200705 On error, raise an exception and return -1 if err is set, or fill err and
706 return -1 otherwise. If a signal was received and the signal handler raised
707 an exception, return -1, and set err to -1 if err is set.
708
709 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100710
Victor Stinner31bf2d52015-04-01 21:57:09 +0200711 If the socket has a timeout, wait until the socket is ready before calling
712 the function: wait until the socket is writable if writing is nonzero, wait
713 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100714
Victor Stinner81c41db2015-04-02 11:50:57 +0200715 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200716 the function, except if the signal handler raised an exception (PEP 475).
717
718 When the function is retried, recompute the timeout using a monotonic clock.
719
Victor Stinner81c41db2015-04-02 11:50:57 +0200720 sock_call_ex() must be called with the GIL held. The socket function is
721 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200722static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200723sock_call_ex(PySocketSockObject *s,
724 int writing,
725 int (*sock_func) (PySocketSockObject *s, void *data),
726 void *data,
727 int connect,
728 int *err)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200729{
730 int has_timeout = (s->sock_timeout > 0);
731 _PyTime_t deadline = 0;
732 int deadline_initialized = 0;
733 int res;
734
735 /* sock_call() must be called with the GIL held. */
736 assert(PyGILState_Check());
737
738 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200739 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200740 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200741 /* For connect(), poll even for blocking socket. The connection
742 runs asynchronously. */
743 if (has_timeout || connect) {
Victor Stinner31bf2d52015-04-01 21:57:09 +0200744 _PyTime_t interval;
745
Victor Stinner81c41db2015-04-02 11:50:57 +0200746 if (has_timeout) {
747 if (deadline_initialized) {
748 /* recompute the timeout */
749 interval = deadline - _PyTime_GetMonotonicClock();
750 }
751 else {
752 deadline_initialized = 1;
753 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
754 interval = s->sock_timeout;
755 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200756 }
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 else
758 interval = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200759
Victor Stinner81c41db2015-04-02 11:50:57 +0200760 res = internal_select(s, writing, interval, connect);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200761 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200762 if (err)
763 *err = GET_SOCK_ERROR;
764
Victor Stinner31bf2d52015-04-01 21:57:09 +0200765 if (CHECK_ERRNO(EINTR)) {
766 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200767 if (PyErr_CheckSignals()) {
768 if (err)
769 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200770 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200771 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200772
773 /* retry select() */
774 continue;
775 }
776
777 /* select() failed */
778 s->errorhandler();
779 return -1;
780 }
781
782 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200783 if (err)
784 *err = SOCK_TIMEOUT_ERR;
785 else
786 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200787 return -1;
788 }
789
790 /* the socket is ready */
791 }
792
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 /* inner loop to retry sock_func() when sock_func() is interrupted
794 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200795 while (1) {
796 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200797 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200798 Py_END_ALLOW_THREADS
799
800 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 /* sock_func() succeeded */
802 if (err)
803 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200804 return 0;
805 }
806
Victor Stinner81c41db2015-04-02 11:50:57 +0200807 if (err)
808 *err = GET_SOCK_ERROR;
809
Victor Stinner31bf2d52015-04-01 21:57:09 +0200810 if (!CHECK_ERRNO(EINTR))
811 break;
812
Victor Stinner81c41db2015-04-02 11:50:57 +0200813 /* sock_func() was interrupted by a signal */
814 if (PyErr_CheckSignals()) {
815 if (err)
816 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200817 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200818 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200819
Victor Stinner81c41db2015-04-02 11:50:57 +0200820 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200821 }
822
823 if (s->sock_timeout > 0
824 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200825 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200826
827 For example, select() could indicate a socket is ready for
828 reading, but the data then discarded by the OS because of a
829 wrong checksum.
830
831 Loop on select() to recheck for socket readyness. */
832 continue;
833 }
834
Victor Stinner81c41db2015-04-02 11:50:57 +0200835 /* sock_func() failed */
836 if (!err)
837 s->errorhandler();
838 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000839 return -1;
840 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200841}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000842
Victor Stinner81c41db2015-04-02 11:50:57 +0200843static int
844sock_call(PySocketSockObject *s,
845 int writing,
846 int (*func) (PySocketSockObject *s, void *data),
847 void *data)
848{
849 return sock_call_ex(s, writing, func, data, 0, NULL);
850}
851
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000852
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000853/* Initialize a new socket object. */
854
Victor Stinner71694d52015-03-28 01:18:54 +0100855static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000856
Martin v. Löwis1a214512008-06-11 05:26:20 +0000857static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000858init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000860{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 s->sock_fd = fd;
862 s->sock_family = family;
863 s->sock_type = type;
864 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000867#ifdef SOCK_NONBLOCK
868 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100869 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000870 else
871#endif
872 {
873 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100874 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000875 internal_setblocking(s, 0);
876 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000877
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000878}
879
880
Guido van Rossum30a685f1991-06-27 15:51:29 +0000881/* Create a new socket object.
882 This just creates the object and initializes it.
883 If the creation fails, return NULL and set an exception (implicit
884 in NEWOBJ()). */
885
Guido van Rossum73624e91994-10-10 17:59:00 +0000886static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000887new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000888{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 PySocketSockObject *s;
890 s = (PySocketSockObject *)
891 PyType_GenericNew(&sock_type, NULL, NULL);
892 if (s != NULL)
893 init_sockobject(s, fd, family, type, proto);
894 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000895}
896
Guido van Rossum30a685f1991-06-27 15:51:29 +0000897
Guido van Rossum48a680c2001-03-02 06:34:14 +0000898/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000899 thread to be in gethostbyname or getaddrinfo */
900#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200901static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000902#endif
903
904
Guido van Rossum30a685f1991-06-27 15:51:29 +0000905/* Convert a string specifying a host name or one of a few symbolic
906 names to a numeric IP address. This usually calls gethostbyname()
907 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000908 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000909 an error occurred; then an exception is raised. */
910
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000912setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000913{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 struct addrinfo hints, *res;
915 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
918 if (name[0] == '\0') {
919 int siz;
920 memset(&hints, 0, sizeof(hints));
921 hints.ai_family = af;
922 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
923 hints.ai_flags = AI_PASSIVE;
924 Py_BEGIN_ALLOW_THREADS
925 ACQUIRE_GETADDRINFO_LOCK
926 error = getaddrinfo(NULL, "0", &hints, &res);
927 Py_END_ALLOW_THREADS
928 /* We assume that those thread-unsafe getaddrinfo() versions
929 *are* safe regarding their return value, ie. that a
930 subsequent call to getaddrinfo() does not destroy the
931 outcome of the first call. */
932 RELEASE_GETADDRINFO_LOCK
933 if (error) {
934 set_gaierror(error);
935 return -1;
936 }
937 switch (res->ai_family) {
938 case AF_INET:
939 siz = 4;
940 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000941#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 case AF_INET6:
943 siz = 16;
944 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000945#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 default:
947 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200948 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 "unsupported address family");
950 return -1;
951 }
952 if (res->ai_next) {
953 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200954 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 "wildcard resolved to multiple address");
956 return -1;
957 }
958 if (res->ai_addrlen < addr_ret_size)
959 addr_ret_size = res->ai_addrlen;
960 memcpy(addr_ret, res->ai_addr, addr_ret_size);
961 freeaddrinfo(res);
962 return siz;
963 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200964 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100965 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200966 if (strcmp(name, "255.255.255.255") == 0 ||
967 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 struct sockaddr_in *sin;
969 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200970 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 "address family mismatched");
972 return -1;
973 }
974 sin = (struct sockaddr_in *)addr_ret;
975 memset((void *) sin, '\0', sizeof(*sin));
976 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000977#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000978 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000980 sin->sin_addr.s_addr = INADDR_BROADCAST;
981 return sizeof(sin->sin_addr);
982 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200983
984 /* avoid a name resolution in case of numeric address */
985#ifdef HAVE_INET_PTON
986 /* check for an IPv4 address */
987 if (af == AF_UNSPEC || af == AF_INET) {
988 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
989 memset(sin, 0, sizeof(*sin));
990 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
991 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000992#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200993 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000994#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200995 return 4;
996 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200998#ifdef ENABLE_IPV6
999 /* check for an IPv6 address - if the address contains a scope ID, we
1000 * fallback to getaddrinfo(), which can handle translation from interface
1001 * name to interface index */
1002 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
1003 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
1004 memset(sin, 0, sizeof(*sin));
1005 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1006 sin->sin6_family = AF_INET6;
1007#ifdef HAVE_SOCKADDR_SA_LEN
1008 sin->sin6_len = sizeof(*sin);
1009#endif
1010 return 16;
1011 }
1012 }
1013#endif /* ENABLE_IPV6 */
1014#else /* HAVE_INET_PTON */
1015 /* check for an IPv4 address */
1016 if (af == AF_INET || af == AF_UNSPEC) {
1017 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1018 memset(sin, 0, sizeof(*sin));
1019 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1020 sin->sin_family = AF_INET;
1021#ifdef HAVE_SOCKADDR_SA_LEN
1022 sin->sin_len = sizeof(*sin);
1023#endif
1024 return 4;
1025 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001026 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001027#endif /* HAVE_INET_PTON */
1028
1029 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 memset(&hints, 0, sizeof(hints));
1031 hints.ai_family = af;
1032 Py_BEGIN_ALLOW_THREADS
1033 ACQUIRE_GETADDRINFO_LOCK
1034 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001035#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 if (error == EAI_NONAME && af == AF_UNSPEC) {
1037 /* On Tru64 V5.1, numeric-to-addr conversion fails
1038 if no address family is given. Assume IPv4 for now.*/
1039 hints.ai_family = AF_INET;
1040 error = getaddrinfo(name, NULL, &hints, &res);
1041 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001042#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 Py_END_ALLOW_THREADS
1044 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1045 if (error) {
1046 set_gaierror(error);
1047 return -1;
1048 }
1049 if (res->ai_addrlen < addr_ret_size)
1050 addr_ret_size = res->ai_addrlen;
1051 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1052 freeaddrinfo(res);
1053 switch (addr_ret->sa_family) {
1054 case AF_INET:
1055 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001056#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 case AF_INET6:
1058 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001059#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001061 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 return -1;
1063 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001064}
1065
Guido van Rossum30a685f1991-06-27 15:51:29 +00001066
Guido van Rossum30a685f1991-06-27 15:51:29 +00001067/* Create a string object representing an IP address.
1068 This is always a string of the form 'dd.dd.dd.dd' (with variable
1069 size numbers). */
1070
Guido van Rossum73624e91994-10-10 17:59:00 +00001071static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001072makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001073{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 char buf[NI_MAXHOST];
1075 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001077 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1078 NI_NUMERICHOST);
1079 if (error) {
1080 set_gaierror(error);
1081 return NULL;
1082 }
1083 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001084}
1085
1086
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001087#ifdef USE_BLUETOOTH
1088/* Convert a string representation of a Bluetooth address into a numeric
1089 address. Returns the length (6), or raises an exception and returns -1 if
1090 an error occurred. */
1091
1092static int
1093setbdaddr(char *name, bdaddr_t *bdaddr)
1094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001095 unsigned int b0, b1, b2, b3, b4, b5;
1096 char ch;
1097 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1100 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1101 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1102 bdaddr->b[0] = b0;
1103 bdaddr->b[1] = b1;
1104 bdaddr->b[2] = b2;
1105 bdaddr->b[3] = b3;
1106 bdaddr->b[4] = b4;
1107 bdaddr->b[5] = b5;
1108 return 6;
1109 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001110 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001111 return -1;
1112 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001113}
1114
1115/* Create a string representation of the Bluetooth address. This is always a
1116 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1117 value (zero padded if necessary). */
1118
1119static PyObject *
1120makebdaddr(bdaddr_t *bdaddr)
1121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001124 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1125 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1126 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1127 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001128}
1129#endif
1130
1131
Guido van Rossum30a685f1991-06-27 15:51:29 +00001132/* Create an object representing the given socket address,
1133 suitable for passing it back to bind(), connect() etc.
1134 The family field of the sockaddr structure is inspected
1135 to determine what kind of address it really is. */
1136
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001137/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001138static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001139makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001141 if (addrlen == 0) {
1142 /* No address -- may be recvfrom() from known socket */
1143 Py_INCREF(Py_None);
1144 return Py_None;
1145 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001147 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 case AF_INET:
1150 {
1151 struct sockaddr_in *a;
1152 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1153 PyObject *ret = NULL;
1154 if (addrobj) {
1155 a = (struct sockaddr_in *)addr;
1156 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1157 Py_DECREF(addrobj);
1158 }
1159 return ret;
1160 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001161
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001162#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001163 case AF_UNIX:
1164 {
1165 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001166#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001167 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1168 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001169 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 }
1171 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001172#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001173 {
1174 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001175 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001176 }
1177 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001178#endif /* AF_UNIX */
1179
Martin v. Löwis11017b12006-01-14 18:12:57 +00001180#if defined(AF_NETLINK)
1181 case AF_NETLINK:
1182 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1184 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001185 }
1186#endif /* AF_NETLINK */
1187
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001188#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001189 case AF_INET6:
1190 {
1191 struct sockaddr_in6 *a;
1192 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1193 PyObject *ret = NULL;
1194 if (addrobj) {
1195 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001196 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 addrobj,
1198 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001199 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001200 a->sin6_scope_id);
1201 Py_DECREF(addrobj);
1202 }
1203 return ret;
1204 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001205#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001206
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001207#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 case AF_BLUETOOTH:
1209 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 case BTPROTO_L2CAP:
1212 {
1213 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1214 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1215 PyObject *ret = NULL;
1216 if (addrobj) {
1217 ret = Py_BuildValue("Oi",
1218 addrobj,
1219 _BT_L2_MEMB(a, psm));
1220 Py_DECREF(addrobj);
1221 }
1222 return ret;
1223 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 case BTPROTO_RFCOMM:
1226 {
1227 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1228 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1229 PyObject *ret = NULL;
1230 if (addrobj) {
1231 ret = Py_BuildValue("Oi",
1232 addrobj,
1233 _BT_RC_MEMB(a, channel));
1234 Py_DECREF(addrobj);
1235 }
1236 return ret;
1237 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001239 case BTPROTO_HCI:
1240 {
1241 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001242#if defined(__NetBSD__) || defined(__DragonFly__)
1243 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1244#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 PyObject *ret = NULL;
1246 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1247 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001248#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001249 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001250
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001251#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001252 case BTPROTO_SCO:
1253 {
1254 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1255 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1256 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001257#endif
1258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001259 default:
1260 PyErr_SetString(PyExc_ValueError,
1261 "Unknown Bluetooth protocol");
1262 return NULL;
1263 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001264#endif
1265
Antoine Pitroub156a462010-10-27 20:13:57 +00001266#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001267 case AF_PACKET:
1268 {
1269 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1270 char *ifname = "";
1271 struct ifreq ifr;
1272 /* need to look up interface name give index */
1273 if (a->sll_ifindex) {
1274 ifr.ifr_ifindex = a->sll_ifindex;
1275 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1276 ifname = ifr.ifr_name;
1277 }
1278 return Py_BuildValue("shbhy#",
1279 ifname,
1280 ntohs(a->sll_protocol),
1281 a->sll_pkttype,
1282 a->sll_hatype,
1283 a->sll_addr,
1284 a->sll_halen);
1285 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001286#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001287
Christian Heimes043d6f62008-01-07 17:19:16 +00001288#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001289 case AF_TIPC:
1290 {
1291 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1292 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1293 return Py_BuildValue("IIIII",
1294 a->addrtype,
1295 a->addr.nameseq.type,
1296 a->addr.nameseq.lower,
1297 a->addr.nameseq.upper,
1298 a->scope);
1299 } else if (a->addrtype == TIPC_ADDR_NAME) {
1300 return Py_BuildValue("IIIII",
1301 a->addrtype,
1302 a->addr.name.name.type,
1303 a->addr.name.name.instance,
1304 a->addr.name.name.instance,
1305 a->scope);
1306 } else if (a->addrtype == TIPC_ADDR_ID) {
1307 return Py_BuildValue("IIIII",
1308 a->addrtype,
1309 a->addr.id.node,
1310 a->addr.id.ref,
1311 0,
1312 a->scope);
1313 } else {
1314 PyErr_SetString(PyExc_ValueError,
1315 "Invalid address type");
1316 return NULL;
1317 }
1318 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001319#endif
1320
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001321#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001322 case AF_CAN:
1323 {
1324 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1325 char *ifname = "";
1326 struct ifreq ifr;
1327 /* need to look up interface name given index */
1328 if (a->can_ifindex) {
1329 ifr.ifr_ifindex = a->can_ifindex;
1330 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1331 ifname = ifr.ifr_name;
1332 }
1333
1334 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1335 ifname,
1336 a->can_family);
1337 }
1338#endif
1339
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001340#ifdef PF_SYSTEM
1341 case PF_SYSTEM:
1342 switch(proto) {
1343#ifdef SYSPROTO_CONTROL
1344 case SYSPROTO_CONTROL:
1345 {
1346 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1347 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1348 }
1349#endif
1350 default:
1351 PyErr_SetString(PyExc_ValueError,
1352 "Invalid address type");
1353 return 0;
1354 }
1355#endif
1356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 default:
1360 /* If we don't know the address family, don't raise an
1361 exception -- return it as an (int, bytes) tuple. */
1362 return Py_BuildValue("iy#",
1363 addr->sa_family,
1364 addr->sa_data,
1365 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001367 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001368}
1369
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001370/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1371 (in particular, numeric IP addresses). */
1372struct maybe_idna {
1373 PyObject *obj;
1374 char *buf;
1375};
1376
1377static void
1378idna_cleanup(struct maybe_idna *data)
1379{
1380 Py_CLEAR(data->obj);
1381}
1382
1383static int
1384idna_converter(PyObject *obj, struct maybe_idna *data)
1385{
1386 size_t len;
1387 PyObject *obj2, *obj3;
1388 if (obj == NULL) {
1389 idna_cleanup(data);
1390 return 1;
1391 }
1392 data->obj = NULL;
1393 len = -1;
1394 if (PyBytes_Check(obj)) {
1395 data->buf = PyBytes_AsString(obj);
1396 len = PyBytes_Size(obj);
1397 }
1398 else if (PyByteArray_Check(obj)) {
1399 data->buf = PyByteArray_AsString(obj);
1400 len = PyByteArray_Size(obj);
1401 }
1402 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1403 data->buf = PyUnicode_DATA(obj);
1404 len = PyUnicode_GET_LENGTH(obj);
1405 }
1406 else {
1407 obj2 = PyUnicode_FromObject(obj);
1408 if (!obj2) {
1409 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1410 obj->ob_type->tp_name);
1411 return 0;
1412 }
1413 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1414 Py_DECREF(obj2);
1415 if (!obj3) {
1416 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1417 return 0;
1418 }
1419 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001420 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001421 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1422 return 0;
1423 }
1424 data->obj = obj3;
1425 data->buf = PyBytes_AS_STRING(obj3);
1426 len = PyBytes_GET_SIZE(obj3);
1427 }
1428 if (strlen(data->buf) != len) {
1429 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001430 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001431 return 0;
1432 }
1433 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001434}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001435
1436/* Parse a socket address argument according to the socket object's
1437 address family. Return 1 if the address was in the proper format,
1438 0 of not. The address is returned through addr_ret, its length
1439 through len_ret. */
1440
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001441static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001442getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001444{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001446
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001447#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 case AF_UNIX:
1449 {
1450 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001451 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001452 int retval = 0;
1453
1454 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1455 allow embedded nulls on Linux. */
1456 if (PyUnicode_Check(args)) {
1457 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1458 return 0;
1459 }
1460 else
1461 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001462 if (!PyArg_Parse(args, "y*", &path)) {
1463 Py_DECREF(args);
1464 return retval;
1465 }
1466 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001469#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001470 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001472 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001473 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001475 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001476 }
1477 }
1478 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001479#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001480 {
1481 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001482 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001483 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001484 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001485 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001486 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001487 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001488 }
1489 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001490 memcpy(addr->sun_path, path.buf, path.len);
1491 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001492 retval = 1;
1493 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001494 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001495 Py_DECREF(args);
1496 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001498#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001499
Martin v. Löwis11017b12006-01-14 18:12:57 +00001500#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001501 case AF_NETLINK:
1502 {
1503 struct sockaddr_nl* addr;
1504 int pid, groups;
1505 addr = (struct sockaddr_nl *)addr_ret;
1506 if (!PyTuple_Check(args)) {
1507 PyErr_Format(
1508 PyExc_TypeError,
1509 "getsockaddrarg: "
1510 "AF_NETLINK address must be tuple, not %.500s",
1511 Py_TYPE(args)->tp_name);
1512 return 0;
1513 }
1514 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1515 return 0;
1516 addr->nl_family = AF_NETLINK;
1517 addr->nl_pid = pid;
1518 addr->nl_groups = groups;
1519 *len_ret = sizeof(*addr);
1520 return 1;
1521 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001522#endif
1523
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001524#ifdef AF_RDS
1525 case AF_RDS:
1526 /* RDS sockets use sockaddr_in: fall-through */
1527#endif
1528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001529 case AF_INET:
1530 {
1531 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001532 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 int port, result;
1534 if (!PyTuple_Check(args)) {
1535 PyErr_Format(
1536 PyExc_TypeError,
1537 "getsockaddrarg: "
1538 "AF_INET address must be tuple, not %.500s",
1539 Py_TYPE(args)->tp_name);
1540 return 0;
1541 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001542 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1543 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 return 0;
1545 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001546 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001547 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001548 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 if (result < 0)
1550 return 0;
1551 if (port < 0 || port > 0xffff) {
1552 PyErr_SetString(
1553 PyExc_OverflowError,
1554 "getsockaddrarg: port must be 0-65535.");
1555 return 0;
1556 }
1557 addr->sin_family = AF_INET;
1558 addr->sin_port = htons((short)port);
1559 *len_ret = sizeof *addr;
1560 return 1;
1561 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001562
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001563#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001564 case AF_INET6:
1565 {
1566 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001567 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001568 int port, result;
1569 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 flowinfo = scope_id = 0;
1571 if (!PyTuple_Check(args)) {
1572 PyErr_Format(
1573 PyExc_TypeError,
1574 "getsockaddrarg: "
1575 "AF_INET6 address must be tuple, not %.500s",
1576 Py_TYPE(args)->tp_name);
1577 return 0;
1578 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001579 if (!PyArg_ParseTuple(args, "O&i|II",
1580 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 &scope_id)) {
1582 return 0;
1583 }
1584 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001585 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001587 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 if (result < 0)
1589 return 0;
1590 if (port < 0 || port > 0xffff) {
1591 PyErr_SetString(
1592 PyExc_OverflowError,
1593 "getsockaddrarg: port must be 0-65535.");
1594 return 0;
1595 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001596 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001597 PyErr_SetString(
1598 PyExc_OverflowError,
1599 "getsockaddrarg: flowinfo must be 0-1048575.");
1600 return 0;
1601 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 addr->sin6_family = s->sock_family;
1603 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001604 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001605 addr->sin6_scope_id = scope_id;
1606 *len_ret = sizeof *addr;
1607 return 1;
1608 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001609#endif
1610
Hye-Shik Chang81268602004-02-02 06:05:24 +00001611#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 case AF_BLUETOOTH:
1613 {
1614 switch (s->sock_proto) {
1615 case BTPROTO_L2CAP:
1616 {
1617 struct sockaddr_l2 *addr;
1618 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001620 addr = (struct sockaddr_l2 *)addr_ret;
1621 memset(addr, 0, sizeof(struct sockaddr_l2));
1622 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1623 if (!PyArg_ParseTuple(args, "si", &straddr,
1624 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001625 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 "wrong format");
1627 return 0;
1628 }
1629 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1630 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 *len_ret = sizeof *addr;
1633 return 1;
1634 }
1635 case BTPROTO_RFCOMM:
1636 {
1637 struct sockaddr_rc *addr;
1638 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 addr = (struct sockaddr_rc *)addr_ret;
1641 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1642 if (!PyArg_ParseTuple(args, "si", &straddr,
1643 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001644 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001645 "wrong format");
1646 return 0;
1647 }
1648 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1649 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001650
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001651 *len_ret = sizeof *addr;
1652 return 1;
1653 }
1654 case BTPROTO_HCI:
1655 {
1656 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001657#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001658 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001659
Alexander Belopolskye239d232010-12-08 23:31:48 +00001660 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001661 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001662 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001663 "wrong format");
1664 return 0;
1665 }
1666 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1667 return 0;
1668#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1670 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001671 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001672 "wrong format");
1673 return 0;
1674 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001676 *len_ret = sizeof *addr;
1677 return 1;
1678 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001679#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 case BTPROTO_SCO:
1681 {
1682 struct sockaddr_sco *addr;
1683 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 addr = (struct sockaddr_sco *)addr_ret;
1686 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1687 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001688 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001689 "wrong format");
1690 return 0;
1691 }
1692 straddr = PyBytes_AS_STRING(args);
1693 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1694 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001695
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001696 *len_ret = sizeof *addr;
1697 return 1;
1698 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001700 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001701 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001702 return 0;
1703 }
1704 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001705#endif
1706
Antoine Pitroub156a462010-10-27 20:13:57 +00001707#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001708 case AF_PACKET:
1709 {
1710 struct sockaddr_ll* addr;
1711 struct ifreq ifr;
1712 char *interfaceName;
1713 int protoNumber;
1714 int hatype = 0;
1715 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001716 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001717
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 if (!PyTuple_Check(args)) {
1719 PyErr_Format(
1720 PyExc_TypeError,
1721 "getsockaddrarg: "
1722 "AF_PACKET address must be tuple, not %.500s",
1723 Py_TYPE(args)->tp_name);
1724 return 0;
1725 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001726 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001727 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001728 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001729 return 0;
1730 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1731 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1732 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1733 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001734 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001735 return 0;
1736 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001737 if (haddr.buf && haddr.len > 8) {
1738 PyErr_SetString(PyExc_ValueError,
1739 "Hardware address must be 8 bytes or less");
1740 PyBuffer_Release(&haddr);
1741 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001742 }
1743 if (protoNumber < 0 || protoNumber > 0xffff) {
1744 PyErr_SetString(
1745 PyExc_OverflowError,
1746 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001747 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 return 0;
1749 }
1750 addr = (struct sockaddr_ll*)addr_ret;
1751 addr->sll_family = AF_PACKET;
1752 addr->sll_protocol = htons((short)protoNumber);
1753 addr->sll_ifindex = ifr.ifr_ifindex;
1754 addr->sll_pkttype = pkttype;
1755 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001756 if (haddr.buf) {
1757 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1758 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001760 else
1761 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001762 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001763 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 return 1;
1765 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001766#endif
1767
Christian Heimes043d6f62008-01-07 17:19:16 +00001768#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001769 case AF_TIPC:
1770 {
1771 unsigned int atype, v1, v2, v3;
1772 unsigned int scope = TIPC_CLUSTER_SCOPE;
1773 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 if (!PyTuple_Check(args)) {
1776 PyErr_Format(
1777 PyExc_TypeError,
1778 "getsockaddrarg: "
1779 "AF_TIPC address must be tuple, not %.500s",
1780 Py_TYPE(args)->tp_name);
1781 return 0;
1782 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 if (!PyArg_ParseTuple(args,
1785 "IIII|I;Invalid TIPC address format",
1786 &atype, &v1, &v2, &v3, &scope))
1787 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001789 addr = (struct sockaddr_tipc *) addr_ret;
1790 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 addr->family = AF_TIPC;
1793 addr->scope = scope;
1794 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001796 if (atype == TIPC_ADDR_NAMESEQ) {
1797 addr->addr.nameseq.type = v1;
1798 addr->addr.nameseq.lower = v2;
1799 addr->addr.nameseq.upper = v3;
1800 } else if (atype == TIPC_ADDR_NAME) {
1801 addr->addr.name.name.type = v1;
1802 addr->addr.name.name.instance = v2;
1803 } else if (atype == TIPC_ADDR_ID) {
1804 addr->addr.id.node = v1;
1805 addr->addr.id.ref = v2;
1806 } else {
1807 /* Shouldn't happen */
1808 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1809 return 0;
1810 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001811
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001812 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001814 return 1;
1815 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001816#endif
1817
Vinay Sajiped6783f2014-03-21 11:44:32 +00001818#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001819 case AF_CAN:
1820 switch (s->sock_proto) {
1821 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001822 /* fall-through */
1823 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001824 {
1825 struct sockaddr_can *addr;
1826 PyObject *interfaceName;
1827 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001828 Py_ssize_t len;
1829
Benjamin Peterson18b71912013-05-16 15:29:44 -05001830 addr = (struct sockaddr_can *)addr_ret;
1831
Charles-François Natali47413c12011-10-06 19:47:44 +02001832 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1833 &interfaceName))
1834 return 0;
1835
1836 len = PyBytes_GET_SIZE(interfaceName);
1837
1838 if (len == 0) {
1839 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001840 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001841 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1842 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001843 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1844 s->errorhandler();
1845 Py_DECREF(interfaceName);
1846 return 0;
1847 }
1848 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001849 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001850 "AF_CAN interface name too long");
1851 Py_DECREF(interfaceName);
1852 return 0;
1853 }
1854
1855 addr->can_family = AF_CAN;
1856 addr->can_ifindex = ifr.ifr_ifindex;
1857
1858 *len_ret = sizeof(*addr);
1859 Py_DECREF(interfaceName);
1860 return 1;
1861 }
1862 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001863 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001864 "getsockaddrarg: unsupported CAN protocol");
1865 return 0;
1866 }
1867#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001868
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001869#ifdef PF_SYSTEM
1870 case PF_SYSTEM:
1871 switch (s->sock_proto) {
1872#ifdef SYSPROTO_CONTROL
1873 case SYSPROTO_CONTROL:
1874 {
1875 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001876
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001877 addr = (struct sockaddr_ctl *)addr_ret;
1878 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001879 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001880
1881 if (PyUnicode_Check(args)) {
1882 struct ctl_info info;
1883 PyObject *ctl_name;
1884
1885 if (!PyArg_Parse(args, "O&",
1886 PyUnicode_FSConverter, &ctl_name)) {
1887 return 0;
1888 }
1889
Victor Stinnerf50e1872015-03-20 11:32:24 +01001890 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001891 PyErr_SetString(PyExc_ValueError,
1892 "provided string is too long");
1893 Py_DECREF(ctl_name);
1894 return 0;
1895 }
1896 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1897 sizeof(info.ctl_name));
1898 Py_DECREF(ctl_name);
1899
1900 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1901 PyErr_SetString(PyExc_OSError,
1902 "cannot find kernel control with provided name");
1903 return 0;
1904 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001905
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001906 addr->sc_id = info.ctl_id;
1907 addr->sc_unit = 0;
1908 } else if (!PyArg_ParseTuple(args, "II",
1909 &(addr->sc_id), &(addr->sc_unit))) {
1910 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1911 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001912
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001913 return 0;
1914 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001915
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001916 *len_ret = sizeof(*addr);
1917 return 1;
1918 }
1919#endif
1920 default:
1921 PyErr_SetString(PyExc_OSError,
1922 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1923 return 0;
1924 }
1925#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001928
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001929 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001930 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001934}
1935
Guido van Rossum30a685f1991-06-27 15:51:29 +00001936
Guido van Rossum48a680c2001-03-02 06:34:14 +00001937/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001938 Return 1 if the family is known, 0 otherwise. The length is returned
1939 through len_ret. */
1940
1941static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001942getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001944 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001945
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001946#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001947 case AF_UNIX:
1948 {
1949 *len_ret = sizeof (struct sockaddr_un);
1950 return 1;
1951 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001952#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001953#if defined(AF_NETLINK)
1954 case AF_NETLINK:
1955 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001956 *len_ret = sizeof (struct sockaddr_nl);
1957 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001958 }
1959#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001960
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001961#ifdef AF_RDS
1962 case AF_RDS:
1963 /* RDS sockets use sockaddr_in: fall-through */
1964#endif
1965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 case AF_INET:
1967 {
1968 *len_ret = sizeof (struct sockaddr_in);
1969 return 1;
1970 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001971
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001972#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001973 case AF_INET6:
1974 {
1975 *len_ret = sizeof (struct sockaddr_in6);
1976 return 1;
1977 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001978#endif
1979
Hye-Shik Chang81268602004-02-02 06:05:24 +00001980#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 case AF_BLUETOOTH:
1982 {
1983 switch(s->sock_proto)
1984 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001985
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 case BTPROTO_L2CAP:
1987 *len_ret = sizeof (struct sockaddr_l2);
1988 return 1;
1989 case BTPROTO_RFCOMM:
1990 *len_ret = sizeof (struct sockaddr_rc);
1991 return 1;
1992 case BTPROTO_HCI:
1993 *len_ret = sizeof (struct sockaddr_hci);
1994 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001995#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 case BTPROTO_SCO:
1997 *len_ret = sizeof (struct sockaddr_sco);
1998 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001999#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002001 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 "unknown BT protocol");
2003 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00002004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 }
2006 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002007#endif
2008
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002009#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 case AF_PACKET:
2011 {
2012 *len_ret = sizeof (struct sockaddr_ll);
2013 return 1;
2014 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002015#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002016
Christian Heimes043d6f62008-01-07 17:19:16 +00002017#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002018 case AF_TIPC:
2019 {
2020 *len_ret = sizeof (struct sockaddr_tipc);
2021 return 1;
2022 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002023#endif
2024
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002025#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002026 case AF_CAN:
2027 {
2028 *len_ret = sizeof (struct sockaddr_can);
2029 return 1;
2030 }
2031#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002032
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002033#ifdef PF_SYSTEM
2034 case PF_SYSTEM:
2035 switch(s->sock_proto) {
2036#ifdef SYSPROTO_CONTROL
2037 case SYSPROTO_CONTROL:
2038 *len_ret = sizeof (struct sockaddr_ctl);
2039 return 1;
2040#endif
2041 default:
2042 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2043 "unknown PF_SYSTEM protocol");
2044 return 0;
2045 }
2046#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002048 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002050 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002051 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002052 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002054 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002055}
2056
2057
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002058/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2059 Currently, these methods are only compiled if the RFC 2292/3542
2060 CMSG_LEN() macro is available. Older systems seem to have used
2061 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2062 it may be possible to define CMSG_LEN() that way if it's not
2063 provided. Some architectures might need extra padding after the
2064 cmsghdr, however, and CMSG_LEN() would have to take account of
2065 this. */
2066#ifdef CMSG_LEN
2067/* If length is in range, set *result to CMSG_LEN(length) and return
2068 true; otherwise, return false. */
2069static int
2070get_CMSG_LEN(size_t length, size_t *result)
2071{
2072 size_t tmp;
2073
2074 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2075 return 0;
2076 tmp = CMSG_LEN(length);
2077 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2078 return 0;
2079 *result = tmp;
2080 return 1;
2081}
2082
2083#ifdef CMSG_SPACE
2084/* If length is in range, set *result to CMSG_SPACE(length) and return
2085 true; otherwise, return false. */
2086static int
2087get_CMSG_SPACE(size_t length, size_t *result)
2088{
2089 size_t tmp;
2090
2091 /* Use CMSG_SPACE(1) here in order to take account of the padding
2092 necessary before *and* after the data. */
2093 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2094 return 0;
2095 tmp = CMSG_SPACE(length);
2096 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2097 return 0;
2098 *result = tmp;
2099 return 1;
2100}
2101#endif
2102
2103/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2104 pointer in msg->msg_control with at least "space" bytes after it,
2105 and its cmsg_len member inside the buffer. */
2106static int
2107cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2108{
2109 size_t cmsg_offset;
2110 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2111 sizeof(cmsgh->cmsg_len));
2112
Charles-François Natali466517d2011-08-28 18:23:43 +02002113 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002114 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002115 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002116 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2117 annoying under OS X as it's unsigned there and so it triggers a
2118 tautological comparison warning under Clang when compared against 0.
2119 Since the check is valid on other platforms, silence the warning under
2120 Clang. */
2121 #ifdef __clang__
2122 #pragma clang diagnostic push
2123 #pragma clang diagnostic ignored "-Wtautological-compare"
2124 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002125 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002126 #pragma GCC diagnostic push
2127 #pragma GCC diagnostic ignored "-Wtype-limits"
2128 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002129 if (msg->msg_controllen < 0)
2130 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002131 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002132 #pragma GCC diagnostic pop
2133 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002134 #ifdef __clang__
2135 #pragma clang diagnostic pop
2136 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002137 if (space < cmsg_len_end)
2138 space = cmsg_len_end;
2139 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2140 return (cmsg_offset <= (size_t)-1 - space &&
2141 cmsg_offset + space <= msg->msg_controllen);
2142}
2143
2144/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2145 *space to number of bytes following it in the buffer and return
2146 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2147 msg->msg_controllen are valid. */
2148static int
2149get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2150{
2151 size_t data_offset;
2152 char *data_ptr;
2153
2154 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2155 return 0;
2156 data_offset = data_ptr - (char *)msg->msg_control;
2157 if (data_offset > msg->msg_controllen)
2158 return 0;
2159 *space = msg->msg_controllen - data_offset;
2160 return 1;
2161}
2162
2163/* If cmsgh is invalid or not contained in the buffer pointed to by
2164 msg->msg_control, return -1. If cmsgh is valid and its associated
2165 data is entirely contained in the buffer, set *data_len to the
2166 length of the associated data and return 0. If only part of the
2167 associated data is contained in the buffer but cmsgh is otherwise
2168 valid, set *data_len to the length contained in the buffer and
2169 return 1. */
2170static int
2171get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2172{
2173 size_t space, cmsg_data_len;
2174
2175 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2176 cmsgh->cmsg_len < CMSG_LEN(0))
2177 return -1;
2178 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2179 if (!get_cmsg_data_space(msg, cmsgh, &space))
2180 return -1;
2181 if (space >= cmsg_data_len) {
2182 *data_len = cmsg_data_len;
2183 return 0;
2184 }
2185 *data_len = space;
2186 return 1;
2187}
2188#endif /* CMSG_LEN */
2189
2190
Victor Stinner31bf2d52015-04-01 21:57:09 +02002191struct sock_accept {
2192 socklen_t *addrlen;
2193 sock_addr_t *addrbuf;
2194 SOCKET_T result;
2195};
2196
2197#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2198/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2199static int accept4_works = -1;
2200#endif
2201
2202static int
2203sock_accept_impl(PySocketSockObject *s, void *data)
2204{
2205 struct sock_accept *ctx = data;
2206
2207#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2208 if (accept4_works != 0) {
2209 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2210 SOCK_CLOEXEC);
2211 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2212 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2213 accept4_works = (errno != ENOSYS);
2214 }
2215 }
2216 if (accept4_works == 0)
2217 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2218#else
2219 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2220#endif
2221 return (ctx->result >= 0);
2222}
2223
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002224/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002225
Guido van Rossum73624e91994-10-10 17:59:00 +00002226static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002227sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002230 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 socklen_t addrlen;
2232 PyObject *sock = NULL;
2233 PyObject *addr = NULL;
2234 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002235 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 if (!getsockaddrlen(s, &addrlen))
2238 return NULL;
2239 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (!IS_SELECTABLE(s))
2242 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002243
Victor Stinner31bf2d52015-04-01 21:57:09 +02002244 ctx.addrlen = &addrlen;
2245 ctx.addrbuf = &addrbuf;
2246 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002248 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002249
Victor Stinnerdaf45552013-08-28 00:53:59 +02002250#ifdef MS_WINDOWS
2251 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2252 PyErr_SetFromWindowsErr(0);
2253 SOCKETCLOSE(newfd);
2254 goto finally;
2255 }
2256#else
2257
2258#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2259 if (!accept4_works)
2260#endif
2261 {
2262 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2263 SOCKETCLOSE(newfd);
2264 goto finally;
2265 }
2266 }
2267#endif
2268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 sock = PyLong_FromSocket_t(newfd);
2270 if (sock == NULL) {
2271 SOCKETCLOSE(newfd);
2272 goto finally;
2273 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2276 addrlen, s->sock_proto);
2277 if (addr == NULL)
2278 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002281
Guido van Rossum67f7a382002-06-06 21:08:16 +00002282finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 Py_XDECREF(sock);
2284 Py_XDECREF(addr);
2285 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002286}
2287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002288PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002289"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002290\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002291Wait for an incoming connection. Return a new socket file descriptor\n\
2292representing the connection, and the address of the client.\n\
2293For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002294
Guido van Rossum11ba0942002-06-13 15:07:44 +00002295/* s.setblocking(flag) method. Argument:
2296 False -- non-blocking mode; same as settimeout(0)
2297 True -- blocking mode; same as settimeout(None)
2298*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002299
Guido van Rossum73624e91994-10-10 17:59:00 +00002300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002301sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002302{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002303 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 block = PyLong_AsLong(arg);
2306 if (block == -1 && PyErr_Occurred())
2307 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Victor Stinner71694d52015-03-28 01:18:54 +01002309 s->sock_timeout = block ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 Py_INCREF(Py_None);
2313 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002314}
Guido van Rossume4485b01994-09-07 14:32:49 +00002315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002316PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002317"setblocking(flag)\n\
2318\n\
2319Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002320setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002321setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002322
Victor Stinner71694d52015-03-28 01:18:54 +01002323static int
2324socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2325{
2326#ifdef MS_WINDOWS
2327 struct timeval tv;
2328#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002329#ifndef HAVE_POLL
2330 _PyTime_t ms;
2331#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002332 int overflow = 0;
2333
2334 if (timeout_obj == Py_None) {
2335 *timeout = -1;
2336 return 0;
2337 }
2338
Victor Stinner869e1772015-03-30 03:49:14 +02002339 if (_PyTime_FromSecondsObject(timeout,
2340 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002341 return -1;
2342
2343 if (*timeout < 0) {
2344 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2345 return -1;
2346 }
2347
2348#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002349 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002350#endif
2351#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002352 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2353 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002354#endif
2355 if (overflow) {
2356 PyErr_SetString(PyExc_OverflowError,
2357 "timeout doesn't fit into C timeval");
2358 return -1;
2359 }
2360
2361 return 0;
2362}
2363
Guido van Rossum11ba0942002-06-13 15:07:44 +00002364/* s.settimeout(timeout) method. Argument:
2365 None -- no timeout, blocking mode; same as setblocking(True)
2366 0.0 -- non-blocking mode; same as setblocking(False)
2367 > 0 -- timeout mode; operations time out after timeout seconds
2368 < 0 -- illegal; raises an exception
2369*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002370static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002372{
Victor Stinner71694d52015-03-28 01:18:54 +01002373 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002374
Victor Stinner71694d52015-03-28 01:18:54 +01002375 if (socket_parse_timeout(&timeout, arg) < 0)
2376 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002379 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 Py_INCREF(Py_None);
2382 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002383}
2384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002385PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002386"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002387\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002388Set a timeout on socket operations. 'timeout' can be a float,\n\
2389giving in seconds, or None. Setting a timeout of None disables\n\
2390the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002392
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002393/* s.gettimeout() method.
2394 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002397{
Victor Stinner71694d52015-03-28 01:18:54 +01002398 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 Py_INCREF(Py_None);
2400 return Py_None;
2401 }
Victor Stinner71694d52015-03-28 01:18:54 +01002402 else {
2403 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2404 return PyFloat_FromDouble(seconds);
2405 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002406}
2407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002408PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002409"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002410\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002411Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002412operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002414
Guido van Rossumaee08791992-09-08 09:05:33 +00002415/* s.setsockopt() method.
2416 With an integer third argument, sets an integer option.
2417 With a string third argument, sets an option from a buffer;
2418 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002419
Guido van Rossum73624e91994-10-10 17:59:00 +00002420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 int level;
2424 int optname;
2425 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002426 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 if (PyArg_ParseTuple(args, "iii:setsockopt",
2430 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002431 res = setsockopt(s->sock_fd, level, optname,
2432 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 }
2434 else {
2435 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002436 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2437 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002439 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2440 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 if (res < 0)
2443 return s->errorhandler();
2444 Py_INCREF(Py_None);
2445 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002446}
2447
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002448PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002449"setsockopt(level, option, value)\n\
2450\n\
2451Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002452The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002453
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002454
Guido van Rossumaee08791992-09-08 09:05:33 +00002455/* s.getsockopt() method.
2456 With two arguments, retrieves an integer option.
2457 With a third integer argument, retrieves a string buffer of that size;
2458 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002459
Guido van Rossum73624e91994-10-10 17:59:00 +00002460static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002461sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 int level;
2464 int optname;
2465 int res;
2466 PyObject *buf;
2467 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2470 &level, &optname, &buflen))
2471 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (buflen == 0) {
2474 int flag = 0;
2475 socklen_t flagsize = sizeof flag;
2476 res = getsockopt(s->sock_fd, level, optname,
2477 (void *)&flag, &flagsize);
2478 if (res < 0)
2479 return s->errorhandler();
2480 return PyLong_FromLong(flag);
2481 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002483 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 "getsockopt buflen out of range");
2485 return NULL;
2486 }
2487 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2488 if (buf == NULL)
2489 return NULL;
2490 res = getsockopt(s->sock_fd, level, optname,
2491 (void *)PyBytes_AS_STRING(buf), &buflen);
2492 if (res < 0) {
2493 Py_DECREF(buf);
2494 return s->errorhandler();
2495 }
2496 _PyBytes_Resize(&buf, buflen);
2497 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002498}
2499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002501"getsockopt(level, option[, buffersize]) -> value\n\
2502\n\
2503Get a socket option. See the Unix manual for level and option.\n\
2504If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002505string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002506
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002507
Fred Drake728819a2000-07-01 03:40:12 +00002508/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002509
Guido van Rossum73624e91994-10-10 17:59:00 +00002510static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002511sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 sock_addr_t addrbuf;
2514 int addrlen;
2515 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2518 return NULL;
2519 Py_BEGIN_ALLOW_THREADS
2520 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2521 Py_END_ALLOW_THREADS
2522 if (res < 0)
2523 return s->errorhandler();
2524 Py_INCREF(Py_None);
2525 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002526}
2527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002528PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002529"bind(address)\n\
2530\n\
2531Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002532pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002533sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002534
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535
2536/* s.close() method.
2537 Set the file descriptor to -1 so operations tried subsequently
2538 will surely fail. */
2539
Guido van Rossum73624e91994-10-10 17:59:00 +00002540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002541sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002544
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002545 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2546 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2547 * for more details.
2548 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if ((fd = s->sock_fd) != -1) {
2550 s->sock_fd = -1;
2551 Py_BEGIN_ALLOW_THREADS
2552 (void) SOCKETCLOSE(fd);
2553 Py_END_ALLOW_THREADS
2554 }
2555 Py_INCREF(Py_None);
2556 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002557}
2558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002559PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002560"close()\n\
2561\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002562Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002563
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002564static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002565sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002566{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002567 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002568 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002569 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002570}
2571
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002572PyDoc_STRVAR(detach_doc,
2573"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002574\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002575Close the socket object without closing the underlying file descriptor.\n\
2576The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002577can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002578
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002579static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002580sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002581{
Victor Stinner81c41db2015-04-02 11:50:57 +02002582 int err;
2583 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002584
Victor Stinner81c41db2015-04-02 11:50:57 +02002585 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2586 /* getsockopt() failed */
2587 return 0;
2588 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002589
Victor Stinner81c41db2015-04-02 11:50:57 +02002590 if (err == EISCONN)
2591 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002592 if (err != 0) {
2593 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2594 SET_SOCK_ERROR(err);
2595 abort();
2596 return 0;
2597 }
2598 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002599}
2600
2601static int
2602internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2603 int raise)
2604{
2605 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002606
2607 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002608 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002609 Py_END_ALLOW_THREADS
2610
Victor Stinner70a46f62015-03-31 22:03:59 +02002611 if (!res) {
2612 /* connect() succeeded, the socket is connected */
2613 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002614 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002615
Victor Stinner81c41db2015-04-02 11:50:57 +02002616 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002617
Victor Stinner81c41db2015-04-02 11:50:57 +02002618 /* save error, PyErr_CheckSignals() can replace it */
2619 err = GET_SOCK_ERROR;
2620 if (CHECK_ERRNO(EINTR)) {
2621 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002622 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002623
2624 /* Issue #23618: when connect() fails with EINTR, the connection is
2625 running asynchronously.
2626
2627 If the socket is blocking or has a timeout, wait until the
2628 connection completes, fails or timed out using select(), and then
2629 get the connection status using getsockopt(SO_ERROR).
2630
2631 If the socket is non-blocking, raise InterruptedError. The caller is
2632 responsible to wait until the connection completes, fails or timed
2633 out (it's the case in asyncio for example). */
2634 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2635 }
2636 else {
2637 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2638 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002639 }
2640
Victor Stinner81c41db2015-04-02 11:50:57 +02002641 if (!wait_connect) {
2642 if (raise) {
2643 /* restore error, maybe replaced by PyErr_CheckSignals() */
2644 SET_SOCK_ERROR(err);
2645 s->errorhandler();
2646 return -1;
2647 }
2648 else
2649 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002650 }
2651
Victor Stinner81c41db2015-04-02 11:50:57 +02002652 if (raise) {
2653 /* socket.connect() raises an exception on error */
2654 if (sock_call_ex(s, 1, sock_connect_impl, NULL, 1, NULL) < 0)
2655 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002656 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002657 else {
2658 /* socket.connect_ex() returns the error code on error */
2659 if (sock_call_ex(s, 1, sock_connect_impl, NULL, 1, &err) < 0)
2660 return err;
2661 }
2662 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002663}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002664
Fred Drake728819a2000-07-01 03:40:12 +00002665/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002666
Guido van Rossum73624e91994-10-10 17:59:00 +00002667static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002668sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002669{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002670 sock_addr_t addrbuf;
2671 int addrlen;
2672 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002673
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2675 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002676
Victor Stinner81c41db2015-04-02 11:50:57 +02002677 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002678 if (res < 0)
2679 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002680
Victor Stinneree699e92015-03-31 21:28:42 +02002681 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002682}
2683
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002684PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002685"connect(address)\n\
2686\n\
2687Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002688is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002689
Guido van Rossum30a685f1991-06-27 15:51:29 +00002690
Fred Drake728819a2000-07-01 03:40:12 +00002691/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002692
2693static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002694sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002695{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 sock_addr_t addrbuf;
2697 int addrlen;
2698 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002700 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2701 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002702
Victor Stinner81c41db2015-04-02 11:50:57 +02002703 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002704 if (res < 0)
2705 return NULL;
2706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002708}
2709
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002711"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002712\n\
2713This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002714instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002715
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002716
Guido van Rossumed233a51992-06-23 09:07:03 +00002717/* s.fileno() method */
2718
Guido van Rossum73624e91994-10-10 17:59:00 +00002719static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002720sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002721{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002722 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002723}
2724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002725PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002726"fileno() -> integer\n\
2727\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002728Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002729
Guido van Rossumed233a51992-06-23 09:07:03 +00002730
Guido van Rossumc89705d1992-11-26 08:54:07 +00002731/* s.getsockname() method */
2732
Guido van Rossum73624e91994-10-10 17:59:00 +00002733static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002734sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 sock_addr_t addrbuf;
2737 int res;
2738 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002740 if (!getsockaddrlen(s, &addrlen))
2741 return NULL;
2742 memset(&addrbuf, 0, addrlen);
2743 Py_BEGIN_ALLOW_THREADS
2744 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2745 Py_END_ALLOW_THREADS
2746 if (res < 0)
2747 return s->errorhandler();
2748 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2749 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002750}
2751
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002752PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002753"getsockname() -> address info\n\
2754\n\
2755Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002756info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002757
Guido van Rossumc89705d1992-11-26 08:54:07 +00002758
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002759#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002760/* s.getpeername() method */
2761
Guido van Rossum73624e91994-10-10 17:59:00 +00002762static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002763sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002764{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 sock_addr_t addrbuf;
2766 int res;
2767 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 if (!getsockaddrlen(s, &addrlen))
2770 return NULL;
2771 memset(&addrbuf, 0, addrlen);
2772 Py_BEGIN_ALLOW_THREADS
2773 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2774 Py_END_ALLOW_THREADS
2775 if (res < 0)
2776 return s->errorhandler();
2777 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2778 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002779}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002781PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002782"getpeername() -> address info\n\
2783\n\
2784Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002785info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002786
Guido van Rossumb6775db1994-08-01 11:34:53 +00002787#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002788
2789
Guido van Rossum30a685f1991-06-27 15:51:29 +00002790/* s.listen(n) method */
2791
Guido van Rossum73624e91994-10-10 17:59:00 +00002792static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002793sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002794{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002795 /* We try to choose a default backlog high enough to avoid connection drops
2796 * for common workloads, yet not too high to limit resource usage. */
2797 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002798 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002799
Charles-François Natali644b8f52014-05-22 19:45:39 +01002800 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002802
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002803 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002804 /* To avoid problems on systems that don't allow a negative backlog
2805 * (which doesn't make sense anyway) we force a minimum value of 0. */
2806 if (backlog < 0)
2807 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002808 res = listen(s->sock_fd, backlog);
2809 Py_END_ALLOW_THREADS
2810 if (res < 0)
2811 return s->errorhandler();
2812 Py_INCREF(Py_None);
2813 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002814}
2815
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002816PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002817"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002818\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002819Enable a server to accept connections. If backlog is specified, it must be\n\
2820at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002821unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002822connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002823
Victor Stinner31bf2d52015-04-01 21:57:09 +02002824struct sock_recv {
2825 char *cbuf;
2826 Py_ssize_t len;
2827 int flags;
2828 Py_ssize_t result;
2829};
2830
2831static int
2832sock_recv_impl(PySocketSockObject *s, void *data)
2833{
2834 struct sock_recv *ctx = data;
2835
2836#ifdef MS_WINDOWS
2837 if (ctx->len > INT_MAX)
2838 ctx->len = INT_MAX;
2839 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2840#else
2841 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2842#endif
2843 return (ctx->result >= 0);
2844}
2845
Guido van Rossum82a5c661998-07-07 20:45:43 +00002846
Thomas Wouters477c8d52006-05-27 19:21:47 +00002847/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002848 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002849 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002850 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002851 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002852 * also possible that we return a number of bytes smaller than the request
2853 * bytes.
2854 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002855
Antoine Pitrou19467d22010-08-17 19:33:30 +00002856static Py_ssize_t
2857sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002858{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002859 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 if (!IS_SELECTABLE(s)) {
2862 select_error();
2863 return -1;
2864 }
2865 if (len == 0) {
2866 /* If 0 bytes were requested, do nothing. */
2867 return 0;
2868 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002869
Victor Stinner31bf2d52015-04-01 21:57:09 +02002870 ctx.cbuf = cbuf;
2871 ctx.len = len;
2872 ctx.flags = flags;
2873 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002874 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002875
2876 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877}
2878
Guido van Rossum48a680c2001-03-02 06:34:14 +00002879
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002880/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002881
Guido van Rossum73624e91994-10-10 17:59:00 +00002882static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002883sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002884{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002885 Py_ssize_t recvlen, outlen;
2886 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002887 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002888
Antoine Pitrou19467d22010-08-17 19:33:30 +00002889 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002890 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 if (recvlen < 0) {
2893 PyErr_SetString(PyExc_ValueError,
2894 "negative buffersize in recv");
2895 return NULL;
2896 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 /* Allocate a new string. */
2899 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2900 if (buf == NULL)
2901 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002903 /* Call the guts */
2904 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2905 if (outlen < 0) {
2906 /* An error occurred, release the string and return an
2907 error. */
2908 Py_DECREF(buf);
2909 return NULL;
2910 }
2911 if (outlen != recvlen) {
2912 /* We did not read as many bytes as we anticipated, resize the
2913 string if possible and be successful. */
2914 _PyBytes_Resize(&buf, outlen);
2915 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002916
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002917 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002918}
2919
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002920PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002921"recv(buffersize[, flags]) -> data\n\
2922\n\
2923Receive up to buffersize bytes from the socket. For the optional flags\n\
2924argument, see the Unix manual. When no data is available, block until\n\
2925at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002926the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002927
Guido van Rossum30a685f1991-06-27 15:51:29 +00002928
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002929/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002930
Thomas Wouters477c8d52006-05-27 19:21:47 +00002931static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002932sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002933{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002934 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002935
Antoine Pitrou19467d22010-08-17 19:33:30 +00002936 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002937 Py_buffer pbuf;
2938 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002939 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002940
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002941 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002942 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 &pbuf, &recvlen, &flags))
2944 return NULL;
2945 buf = pbuf.buf;
2946 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 if (recvlen < 0) {
2949 PyBuffer_Release(&pbuf);
2950 PyErr_SetString(PyExc_ValueError,
2951 "negative buffersize in recv_into");
2952 return NULL;
2953 }
2954 if (recvlen == 0) {
2955 /* If nbytes was not specified, use the buffer's length */
2956 recvlen = buflen;
2957 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 /* Check if the buffer is large enough */
2960 if (buflen < recvlen) {
2961 PyBuffer_Release(&pbuf);
2962 PyErr_SetString(PyExc_ValueError,
2963 "buffer too small for requested bytes");
2964 return NULL;
2965 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002966
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002967 /* Call the guts */
2968 readlen = sock_recv_guts(s, buf, recvlen, flags);
2969 if (readlen < 0) {
2970 /* Return an error. */
2971 PyBuffer_Release(&pbuf);
2972 return NULL;
2973 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 PyBuffer_Release(&pbuf);
2976 /* Return the number of bytes read. Note that we do not do anything
2977 special here in the case that readlen < recvlen. */
2978 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002979}
2980
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002981PyDoc_STRVAR(recv_into_doc,
2982"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002983\n\
2984A version of recv() that stores its data into a buffer rather than creating \n\
2985a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2986is not specified (or 0), receive up to the size available in the given buffer.\n\
2987\n\
2988See recv() for documentation about the flags.");
2989
Victor Stinner31bf2d52015-04-01 21:57:09 +02002990struct sock_recvfrom {
2991 char* cbuf;
2992 Py_ssize_t len;
2993 int flags;
2994 socklen_t *addrlen;
2995 sock_addr_t *addrbuf;
2996 Py_ssize_t result;
2997};
2998
2999static int
3000sock_recvfrom_impl(PySocketSockObject *s, void *data)
3001{
3002 struct sock_recvfrom *ctx = data;
3003
3004 memset(ctx->addrbuf, 0, *ctx->addrlen);
3005
3006#ifdef MS_WINDOWS
3007 if (ctx->len > INT_MAX)
3008 ctx->len = INT_MAX;
3009 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3010 SAS2SA(ctx->addrbuf), ctx->addrlen);
3011#else
3012 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3013 SAS2SA(ctx->addrbuf), ctx->addrlen);
3014#endif
3015 return (ctx->result >= 0);
3016}
3017
Thomas Wouters477c8d52006-05-27 19:21:47 +00003018
3019/*
Christian Heimes99170a52007-12-19 02:07:34 +00003020 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3021 * into a char buffer. If you have any inc/def ref to do to the objects that
3022 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003023 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003024 * that it is also possible that we return a number of bytes smaller than the
3025 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003026 *
3027 * 'addr' is a return value for the address object. Note that you must decref
3028 * it yourself.
3029 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003030static Py_ssize_t
3031sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003036 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003038 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003040 if (!getsockaddrlen(s, &addrlen))
3041 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 if (!IS_SELECTABLE(s)) {
3044 select_error();
3045 return -1;
3046 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003047
Victor Stinner31bf2d52015-04-01 21:57:09 +02003048 ctx.cbuf = cbuf;
3049 ctx.len = len;
3050 ctx.flags = flags;
3051 ctx.addrbuf = &addrbuf;
3052 ctx.addrlen = &addrlen;
3053 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003055
Victor Stinner31bf2d52015-04-01 21:57:09 +02003056 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3057 s->sock_proto);
3058 if (*addr == NULL)
3059 return -1;
3060
3061 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003062}
3063
3064/* s.recvfrom(nbytes [,flags]) method */
3065
3066static PyObject *
3067sock_recvfrom(PySocketSockObject *s, PyObject *args)
3068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 PyObject *buf = NULL;
3070 PyObject *addr = NULL;
3071 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003072 int flags = 0;
3073 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003074
Antoine Pitrou19467d22010-08-17 19:33:30 +00003075 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003076 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003078 if (recvlen < 0) {
3079 PyErr_SetString(PyExc_ValueError,
3080 "negative buffersize in recvfrom");
3081 return NULL;
3082 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3085 if (buf == NULL)
3086 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003088 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3089 recvlen, flags, &addr);
3090 if (outlen < 0) {
3091 goto finally;
3092 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003094 if (outlen != recvlen) {
3095 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003096 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003097 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003098 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003099 goto finally;
3100 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003102 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003103
3104finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003105 Py_XDECREF(buf);
3106 Py_XDECREF(addr);
3107 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003108}
3109
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003110PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003111"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3112\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003113Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003114
Thomas Wouters477c8d52006-05-27 19:21:47 +00003115
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003116/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003117
3118static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003119sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003120{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003121 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003122
Antoine Pitrou19467d22010-08-17 19:33:30 +00003123 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003124 Py_buffer pbuf;
3125 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003126 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003128 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003129
Antoine Pitrou19467d22010-08-17 19:33:30 +00003130 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003131 kwlist, &pbuf,
3132 &recvlen, &flags))
3133 return NULL;
3134 buf = pbuf.buf;
3135 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003137 if (recvlen < 0) {
3138 PyBuffer_Release(&pbuf);
3139 PyErr_SetString(PyExc_ValueError,
3140 "negative buffersize in recvfrom_into");
3141 return NULL;
3142 }
3143 if (recvlen == 0) {
3144 /* If nbytes was not specified, use the buffer's length */
3145 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003146 } else if (recvlen > buflen) {
3147 PyBuffer_Release(&pbuf);
3148 PyErr_SetString(PyExc_ValueError,
3149 "nbytes is greater than the length of the buffer");
3150 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003151 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003153 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3154 if (readlen < 0) {
3155 PyBuffer_Release(&pbuf);
3156 /* Return an error */
3157 Py_XDECREF(addr);
3158 return NULL;
3159 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003161 PyBuffer_Release(&pbuf);
3162 /* Return the number of bytes read and the address. Note that we do
3163 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003164 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003165}
3166
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003167PyDoc_STRVAR(recvfrom_into_doc,
3168"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003169\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003170Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003171
Victor Stinner35bee932015-04-02 12:28:07 +02003172/* The sendmsg() and recvmsg[_into]() methods require a working
3173 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3174#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003175struct sock_recvmsg {
3176 struct msghdr *msg;
3177 int flags;
3178 ssize_t result;
3179};
3180
3181static int
3182sock_recvmsg_impl(PySocketSockObject *s, void *data)
3183{
3184 struct sock_recvmsg *ctx = data;
3185
3186 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3187 return (ctx->result >= 0);
3188}
3189
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003190/*
3191 * Call recvmsg() with the supplied iovec structures, flags, and
3192 * ancillary data buffer size (controllen). Returns the tuple return
3193 * value for recvmsg() or recvmsg_into(), with the first item provided
3194 * by the supplied makeval() function. makeval() will be called with
3195 * the length read and makeval_data as arguments, and must return a
3196 * new reference (which will be decrefed if there is a subsequent
3197 * error). On error, closes any file descriptors received via
3198 * SCM_RIGHTS.
3199 */
3200static PyObject *
3201sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3202 int flags, Py_ssize_t controllen,
3203 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3204{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003205 sock_addr_t addrbuf;
3206 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003207 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003208 PyObject *cmsg_list = NULL, *retval = NULL;
3209 void *controlbuf = NULL;
3210 struct cmsghdr *cmsgh;
3211 size_t cmsgdatalen = 0;
3212 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003213 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003214
3215 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3216 ignored" when the socket is connected (Linux fills them in
3217 anyway for AF_UNIX sockets at least). Normally msg_namelen
3218 seems to be set to 0 if there's no address, but try to
3219 initialize msg_name to something that won't be mistaken for a
3220 real address if that doesn't happen. */
3221 if (!getsockaddrlen(s, &addrbuflen))
3222 return NULL;
3223 memset(&addrbuf, 0, addrbuflen);
3224 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3225
3226 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3227 PyErr_SetString(PyExc_ValueError,
3228 "invalid ancillary data buffer length");
3229 return NULL;
3230 }
3231 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3232 return PyErr_NoMemory();
3233
3234 /* Make the system call. */
3235 if (!IS_SELECTABLE(s)) {
3236 select_error();
3237 goto finally;
3238 }
3239
Victor Stinner31bf2d52015-04-01 21:57:09 +02003240 msg.msg_name = SAS2SA(&addrbuf);
3241 msg.msg_namelen = addrbuflen;
3242 msg.msg_iov = iov;
3243 msg.msg_iovlen = iovlen;
3244 msg.msg_control = controlbuf;
3245 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003246
Victor Stinner31bf2d52015-04-01 21:57:09 +02003247 ctx.msg = &msg;
3248 ctx.flags = flags;
3249 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003250 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003251
3252 /* Make list of (level, type, data) tuples from control messages. */
3253 if ((cmsg_list = PyList_New(0)) == NULL)
3254 goto err_closefds;
3255 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3256 implementations didn't do so. */
3257 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3258 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3259 PyObject *bytes, *tuple;
3260 int tmp;
3261
3262 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3263 if (cmsg_status != 0) {
3264 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3265 "received malformed or improperly-truncated "
3266 "ancillary data", 1) == -1)
3267 goto err_closefds;
3268 }
3269 if (cmsg_status < 0)
3270 break;
3271 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003272 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003273 goto err_closefds;
3274 }
3275
3276 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3277 cmsgdatalen);
3278 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3279 (int)cmsgh->cmsg_type, bytes);
3280 if (tuple == NULL)
3281 goto err_closefds;
3282 tmp = PyList_Append(cmsg_list, tuple);
3283 Py_DECREF(tuple);
3284 if (tmp != 0)
3285 goto err_closefds;
3286
3287 if (cmsg_status != 0)
3288 break;
3289 }
3290
3291 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003292 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003293 cmsg_list,
3294 (int)msg.msg_flags,
3295 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3296 ((msg.msg_namelen > addrbuflen) ?
3297 addrbuflen : msg.msg_namelen),
3298 s->sock_proto));
3299 if (retval == NULL)
3300 goto err_closefds;
3301
3302finally:
3303 Py_XDECREF(cmsg_list);
3304 PyMem_Free(controlbuf);
3305 return retval;
3306
3307err_closefds:
3308#ifdef SCM_RIGHTS
3309 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3310 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3311 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3312 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3313 if (cmsg_status < 0)
3314 break;
3315 if (cmsgh->cmsg_level == SOL_SOCKET &&
3316 cmsgh->cmsg_type == SCM_RIGHTS) {
3317 size_t numfds;
3318 int *fdp;
3319
3320 numfds = cmsgdatalen / sizeof(int);
3321 fdp = (int *)CMSG_DATA(cmsgh);
3322 while (numfds-- > 0)
3323 close(*fdp++);
3324 }
3325 if (cmsg_status != 0)
3326 break;
3327 }
3328#endif /* SCM_RIGHTS */
3329 goto finally;
3330}
3331
3332
3333static PyObject *
3334makeval_recvmsg(ssize_t received, void *data)
3335{
3336 PyObject **buf = data;
3337
3338 if (received < PyBytes_GET_SIZE(*buf))
3339 _PyBytes_Resize(buf, received);
3340 Py_XINCREF(*buf);
3341 return *buf;
3342}
3343
3344/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3345
3346static PyObject *
3347sock_recvmsg(PySocketSockObject *s, PyObject *args)
3348{
3349 Py_ssize_t bufsize, ancbufsize = 0;
3350 int flags = 0;
3351 struct iovec iov;
3352 PyObject *buf = NULL, *retval = NULL;
3353
3354 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3355 return NULL;
3356
3357 if (bufsize < 0) {
3358 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3359 return NULL;
3360 }
3361 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3362 return NULL;
3363 iov.iov_base = PyBytes_AS_STRING(buf);
3364 iov.iov_len = bufsize;
3365
3366 /* Note that we're passing a pointer to *our pointer* to the bytes
3367 object here (&buf); makeval_recvmsg() may incref the object, or
3368 deallocate it and set our pointer to NULL. */
3369 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3370 &makeval_recvmsg, &buf);
3371 Py_XDECREF(buf);
3372 return retval;
3373}
3374
3375PyDoc_STRVAR(recvmsg_doc,
3376"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3377\n\
3378Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3379socket. The ancbufsize argument sets the size in bytes of the\n\
3380internal buffer used to receive the ancillary data; it defaults to 0,\n\
3381meaning that no ancillary data will be received. Appropriate buffer\n\
3382sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3383CMSG_LEN(), and items which do not fit into the buffer might be\n\
3384truncated or discarded. The flags argument defaults to 0 and has the\n\
3385same meaning as for recv().\n\
3386\n\
3387The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3388The data item is a bytes object holding the non-ancillary data\n\
3389received. The ancdata item is a list of zero or more tuples\n\
3390(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3391(control messages) received: cmsg_level and cmsg_type are integers\n\
3392specifying the protocol level and protocol-specific type respectively,\n\
3393and cmsg_data is a bytes object holding the associated data. The\n\
3394msg_flags item is the bitwise OR of various flags indicating\n\
3395conditions on the received message; see your system documentation for\n\
3396details. If the receiving socket is unconnected, address is the\n\
3397address of the sending socket, if available; otherwise, its value is\n\
3398unspecified.\n\
3399\n\
3400If recvmsg() raises an exception after the system call returns, it\n\
3401will first attempt to close any file descriptors received via the\n\
3402SCM_RIGHTS mechanism.");
3403
3404
3405static PyObject *
3406makeval_recvmsg_into(ssize_t received, void *data)
3407{
3408 return PyLong_FromSsize_t(received);
3409}
3410
3411/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3412
3413static PyObject *
3414sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3415{
3416 Py_ssize_t ancbufsize = 0;
3417 int flags = 0;
3418 struct iovec *iovs = NULL;
3419 Py_ssize_t i, nitems, nbufs = 0;
3420 Py_buffer *bufs = NULL;
3421 PyObject *buffers_arg, *fast, *retval = NULL;
3422
3423 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3424 &buffers_arg, &ancbufsize, &flags))
3425 return NULL;
3426
3427 if ((fast = PySequence_Fast(buffers_arg,
3428 "recvmsg_into() argument 1 must be an "
3429 "iterable")) == NULL)
3430 return NULL;
3431 nitems = PySequence_Fast_GET_SIZE(fast);
3432 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003433 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003434 goto finally;
3435 }
3436
3437 /* Fill in an iovec for each item, and save the Py_buffer
3438 structs to release afterwards. */
3439 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3440 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3441 PyErr_NoMemory();
3442 goto finally;
3443 }
3444 for (; nbufs < nitems; nbufs++) {
3445 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3446 "w*;recvmsg_into() argument 1 must be an iterable "
3447 "of single-segment read-write buffers",
3448 &bufs[nbufs]))
3449 goto finally;
3450 iovs[nbufs].iov_base = bufs[nbufs].buf;
3451 iovs[nbufs].iov_len = bufs[nbufs].len;
3452 }
3453
3454 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3455 &makeval_recvmsg_into, NULL);
3456finally:
3457 for (i = 0; i < nbufs; i++)
3458 PyBuffer_Release(&bufs[i]);
3459 PyMem_Free(bufs);
3460 PyMem_Free(iovs);
3461 Py_DECREF(fast);
3462 return retval;
3463}
3464
3465PyDoc_STRVAR(recvmsg_into_doc,
3466"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3467\n\
3468Receive normal data and ancillary data from the socket, scattering the\n\
3469non-ancillary data into a series of buffers. The buffers argument\n\
3470must be an iterable of objects that export writable buffers\n\
3471(e.g. bytearray objects); these will be filled with successive chunks\n\
3472of the non-ancillary data until it has all been written or there are\n\
3473no more buffers. The ancbufsize argument sets the size in bytes of\n\
3474the internal buffer used to receive the ancillary data; it defaults to\n\
34750, meaning that no ancillary data will be received. Appropriate\n\
3476buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3477or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3478truncated or discarded. The flags argument defaults to 0 and has the\n\
3479same meaning as for recv().\n\
3480\n\
3481The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3482The nbytes item is the total number of bytes of non-ancillary data\n\
3483written into the buffers. The ancdata item is a list of zero or more\n\
3484tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3485data (control messages) received: cmsg_level and cmsg_type are\n\
3486integers specifying the protocol level and protocol-specific type\n\
3487respectively, and cmsg_data is a bytes object holding the associated\n\
3488data. The msg_flags item is the bitwise OR of various flags\n\
3489indicating conditions on the received message; see your system\n\
3490documentation for details. If the receiving socket is unconnected,\n\
3491address is the address of the sending socket, if available; otherwise,\n\
3492its value is unspecified.\n\
3493\n\
3494If recvmsg_into() raises an exception after the system call returns,\n\
3495it will first attempt to close any file descriptors received via the\n\
3496SCM_RIGHTS mechanism.");
3497#endif /* CMSG_LEN */
3498
3499
Victor Stinner31bf2d52015-04-01 21:57:09 +02003500struct sock_send {
3501 char *buf;
3502 Py_ssize_t len;
3503 int flags;
3504 Py_ssize_t result;
3505};
3506
3507static int
3508sock_send_impl(PySocketSockObject *s, void *data)
3509{
3510 struct sock_send *ctx = data;
3511
3512#ifdef MS_WINDOWS
3513 if (ctx->len > INT_MAX)
3514 ctx->len = INT_MAX;
3515 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3516#else
3517 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3518#endif
3519 return (ctx->result >= 0);
3520}
3521
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003522/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003523
Guido van Rossum73624e91994-10-10 17:59:00 +00003524static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003525sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003526{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003527 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003529 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003530
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3532 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003534 if (!IS_SELECTABLE(s)) {
3535 PyBuffer_Release(&pbuf);
3536 return select_error();
3537 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003538 ctx.buf = pbuf.buf;
3539 ctx.len = pbuf.len;
3540 ctx.flags = flags;
3541 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003542 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003543 return NULL;
3544 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003545 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003546
3547 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003548}
3549
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003550PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003551"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003552\n\
3553Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003554argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003555sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003556
3557
3558/* s.sendall(data [,flags]) method */
3559
3560static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003561sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003562{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003564 Py_ssize_t len, n;
3565 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003567 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003569 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3570 return NULL;
3571 buf = pbuf.buf;
3572 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003574 if (!IS_SELECTABLE(s)) {
3575 PyBuffer_Release(&pbuf);
3576 return select_error();
3577 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003579 do {
Victor Stinner02f32ab2015-04-01 22:53:26 +02003580 ctx.buf = buf;
3581 ctx.len = len;
3582 ctx.flags = flags;
3583 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003584 PyBuffer_Release(&pbuf);
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003585 return NULL;
3586 }
Victor Stinner02f32ab2015-04-01 22:53:26 +02003587 n = ctx.result;
3588 assert(n >= 0);
3589
3590 buf += n;
3591 len -= n;
3592
3593 /* We must run our signal handlers before looping again.
3594 send() can return a successful partial write when it is
3595 interrupted, so we can't restrict ourselves to EINTR. */
3596 if (PyErr_CheckSignals()) {
3597 PyBuffer_Release(&pbuf);
3598 return NULL;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003599 }
Victor Stinner02f32ab2015-04-01 22:53:26 +02003600 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003601 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003602
Victor Stinner02f32ab2015-04-01 22:53:26 +02003603 Py_RETURN_NONE;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003604}
3605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003606PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003607"sendall(data[, flags])\n\
3608\n\
3609Send a data string to the socket. For the optional flags\n\
3610argument, see the Unix manual. This calls send() repeatedly\n\
3611until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003612to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003613
Guido van Rossum30a685f1991-06-27 15:51:29 +00003614
Victor Stinner31bf2d52015-04-01 21:57:09 +02003615struct sock_sendto {
3616 char *buf;
3617 Py_ssize_t len;
3618 int flags;
3619 int addrlen;
3620 sock_addr_t *addrbuf;
3621 Py_ssize_t result;
3622};
3623
3624static int
3625sock_sendto_impl(PySocketSockObject *s, void *data)
3626{
3627 struct sock_sendto *ctx = data;
3628
3629#ifdef MS_WINDOWS
3630 if (ctx->len > INT_MAX)
3631 ctx->len = INT_MAX;
3632 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3633 SAS2SA(ctx->addrbuf), ctx->addrlen);
3634#else
3635 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3636 SAS2SA(ctx->addrbuf), ctx->addrlen);
3637#endif
3638 return (ctx->result >= 0);
3639}
3640
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003641/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003642
Guido van Rossum73624e91994-10-10 17:59:00 +00003643static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003644sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003646 Py_buffer pbuf;
3647 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003648 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003649 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003650 int addrlen, flags;
3651 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003652
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003654 arglen = PyTuple_Size(args);
3655 switch (arglen) {
3656 case 2:
3657 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3658 break;
3659 case 3:
3660 PyArg_ParseTuple(args, "y*iO:sendto",
3661 &pbuf, &flags, &addro);
3662 break;
3663 default:
3664 PyErr_Format(PyExc_TypeError,
3665 "sendto() takes 2 or 3 arguments (%d given)",
3666 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003667 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003668 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003669 if (PyErr_Occurred())
3670 return NULL;
3671
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 if (!IS_SELECTABLE(s)) {
3673 PyBuffer_Release(&pbuf);
3674 return select_error();
3675 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003677 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3678 PyBuffer_Release(&pbuf);
3679 return NULL;
3680 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003681
Victor Stinner31bf2d52015-04-01 21:57:09 +02003682 ctx.buf = pbuf.buf;
3683 ctx.len = pbuf.len;
3684 ctx.flags = flags;
3685 ctx.addrlen = addrlen;
3686 ctx.addrbuf = &addrbuf;
3687 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003688 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003689 return NULL;
3690 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003691 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003692
3693 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003694}
3695
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003696PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003697"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003698\n\
3699Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003700For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003701
Guido van Rossum30a685f1991-06-27 15:51:29 +00003702
Victor Stinner35bee932015-04-02 12:28:07 +02003703/* The sendmsg() and recvmsg[_into]() methods require a working
3704 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3705#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003706struct sock_sendmsg {
3707 struct msghdr *msg;
3708 int flags;
3709 ssize_t result;
3710};
3711
3712static int
3713sock_sendmsg_impl(PySocketSockObject *s, void *data)
3714{
3715 struct sock_sendmsg *ctx = data;
3716
3717 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3718 return (ctx->result >= 0);
3719}
3720
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003721/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3722
3723static PyObject *
3724sock_sendmsg(PySocketSockObject *s, PyObject *args)
3725{
3726 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3727 Py_buffer *databufs = NULL;
3728 struct iovec *iovs = NULL;
3729 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003730 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003731 struct cmsginfo {
3732 int level;
3733 int type;
3734 Py_buffer data;
3735 } *cmsgs = NULL;
3736 void *controlbuf = NULL;
3737 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003738 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003739 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3740 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003741 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003742
3743 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3744 &data_arg, &cmsg_arg, &flags, &addr_arg))
3745 return NULL;
3746
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747 /* Parse destination address. */
3748 if (addr_arg != NULL && addr_arg != Py_None) {
3749 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3750 goto finally;
3751 msg.msg_name = &addrbuf;
3752 msg.msg_namelen = addrlen;
3753 }
3754
3755 /* Fill in an iovec for each message part, and save the Py_buffer
3756 structs to release afterwards. */
3757 if ((data_fast = PySequence_Fast(data_arg,
3758 "sendmsg() argument 1 must be an "
3759 "iterable")) == NULL)
3760 goto finally;
3761 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3762 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003763 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003764 goto finally;
3765 }
3766 msg.msg_iovlen = ndataparts;
3767 if (ndataparts > 0 &&
3768 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3769 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3770 PyErr_NoMemory();
3771 goto finally;
3772 }
3773 for (; ndatabufs < ndataparts; ndatabufs++) {
3774 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3775 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003776 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003777 &databufs[ndatabufs]))
3778 goto finally;
3779 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3780 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3781 }
3782
3783 if (cmsg_arg == NULL)
3784 ncmsgs = 0;
3785 else {
3786 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3787 "sendmsg() argument 2 must be an "
3788 "iterable")) == NULL)
3789 goto finally;
3790 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3791 }
3792
3793#ifndef CMSG_SPACE
3794 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003795 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003796 "sending multiple control messages is not supported "
3797 "on this system");
3798 goto finally;
3799 }
3800#endif
3801 /* Save level, type and Py_buffer for each control message,
3802 and calculate total size. */
3803 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3804 PyErr_NoMemory();
3805 goto finally;
3806 }
3807 controllen = controllen_last = 0;
3808 while (ncmsgbufs < ncmsgs) {
3809 size_t bufsize, space;
3810
3811 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3812 "(iiy*):[sendmsg() ancillary data items]",
3813 &cmsgs[ncmsgbufs].level,
3814 &cmsgs[ncmsgbufs].type,
3815 &cmsgs[ncmsgbufs].data))
3816 goto finally;
3817 bufsize = cmsgs[ncmsgbufs++].data.len;
3818
3819#ifdef CMSG_SPACE
3820 if (!get_CMSG_SPACE(bufsize, &space)) {
3821#else
3822 if (!get_CMSG_LEN(bufsize, &space)) {
3823#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003824 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003825 goto finally;
3826 }
3827 controllen += space;
3828 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003829 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003830 goto finally;
3831 }
3832 controllen_last = controllen;
3833 }
3834
3835 /* Construct ancillary data block from control message info. */
3836 if (ncmsgbufs > 0) {
3837 struct cmsghdr *cmsgh = NULL;
3838
3839 if ((msg.msg_control = controlbuf =
3840 PyMem_Malloc(controllen)) == NULL) {
3841 PyErr_NoMemory();
3842 goto finally;
3843 }
3844 msg.msg_controllen = controllen;
3845
3846 /* Need to zero out the buffer as a workaround for glibc's
3847 CMSG_NXTHDR() implementation. After getting the pointer to
3848 the next header, it checks its (uninitialized) cmsg_len
3849 member to see if the "message" fits in the buffer, and
3850 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003851 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003852 memset(controlbuf, 0, controllen);
3853
3854 for (i = 0; i < ncmsgbufs; i++) {
3855 size_t msg_len, data_len = cmsgs[i].data.len;
3856 int enough_space = 0;
3857
3858 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3859 if (cmsgh == NULL) {
3860 PyErr_Format(PyExc_RuntimeError,
3861 "unexpected NULL result from %s()",
3862 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3863 goto finally;
3864 }
3865 if (!get_CMSG_LEN(data_len, &msg_len)) {
3866 PyErr_SetString(PyExc_RuntimeError,
3867 "item size out of range for CMSG_LEN()");
3868 goto finally;
3869 }
3870 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3871 size_t space;
3872
3873 cmsgh->cmsg_len = msg_len;
3874 if (get_cmsg_data_space(&msg, cmsgh, &space))
3875 enough_space = (space >= data_len);
3876 }
3877 if (!enough_space) {
3878 PyErr_SetString(PyExc_RuntimeError,
3879 "ancillary data does not fit in calculated "
3880 "space");
3881 goto finally;
3882 }
3883 cmsgh->cmsg_level = cmsgs[i].level;
3884 cmsgh->cmsg_type = cmsgs[i].type;
3885 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3886 }
3887 }
3888
3889 /* Make the system call. */
3890 if (!IS_SELECTABLE(s)) {
3891 select_error();
3892 goto finally;
3893 }
3894
Victor Stinner31bf2d52015-04-01 21:57:09 +02003895 ctx.msg = &msg;
3896 ctx.flags = flags;
3897 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003898 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003899
3900 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003901
3902finally:
3903 PyMem_Free(controlbuf);
3904 for (i = 0; i < ncmsgbufs; i++)
3905 PyBuffer_Release(&cmsgs[i].data);
3906 PyMem_Free(cmsgs);
3907 Py_XDECREF(cmsg_fast);
3908 for (i = 0; i < ndatabufs; i++)
3909 PyBuffer_Release(&databufs[i]);
3910 PyMem_Free(databufs);
3911 PyMem_Free(iovs);
3912 Py_XDECREF(data_fast);
3913 return retval;
3914}
3915
3916PyDoc_STRVAR(sendmsg_doc,
3917"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3918\n\
3919Send normal and ancillary data to the socket, gathering the\n\
3920non-ancillary data from a series of buffers and concatenating it into\n\
3921a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003922data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003923The ancdata argument specifies the ancillary data (control messages)\n\
3924as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3925cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3926protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003927is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003928argument defaults to 0 and has the same meaning as for send(). If\n\
3929address is supplied and not None, it sets a destination address for\n\
3930the message. The return value is the number of bytes of non-ancillary\n\
3931data sent.");
3932#endif /* CMSG_LEN */
3933
3934
Guido van Rossum30a685f1991-06-27 15:51:29 +00003935/* s.shutdown(how) method */
3936
Guido van Rossum73624e91994-10-10 17:59:00 +00003937static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003938sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003939{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 int how;
3941 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003942
Serhiy Storchaka78980432013-01-15 01:12:17 +02003943 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 if (how == -1 && PyErr_Occurred())
3945 return NULL;
3946 Py_BEGIN_ALLOW_THREADS
3947 res = shutdown(s->sock_fd, how);
3948 Py_END_ALLOW_THREADS
3949 if (res < 0)
3950 return s->errorhandler();
3951 Py_INCREF(Py_None);
3952 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003953}
3954
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003955PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003956"shutdown(flag)\n\
3957\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003958Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3959of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003960
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003961#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003962static PyObject*
3963sock_ioctl(PySocketSockObject *s, PyObject *arg)
3964{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 unsigned long cmd = SIO_RCVALL;
3966 PyObject *argO;
3967 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003968
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003969 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3970 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003972 switch (cmd) {
3973 case SIO_RCVALL: {
3974 unsigned int option = RCVALL_ON;
3975 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3976 return NULL;
3977 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3978 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3979 return set_error();
3980 }
3981 return PyLong_FromUnsignedLong(recv); }
3982 case SIO_KEEPALIVE_VALS: {
3983 struct tcp_keepalive ka;
3984 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3985 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3986 return NULL;
3987 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3988 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3989 return set_error();
3990 }
3991 return PyLong_FromUnsignedLong(recv); }
3992 default:
3993 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3994 return NULL;
3995 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003996}
3997PyDoc_STRVAR(sock_ioctl_doc,
3998"ioctl(cmd, option) -> long\n\
3999\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004000Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4001SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4002SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004003#endif
4004
4005#if defined(MS_WINDOWS)
4006static PyObject*
4007sock_share(PySocketSockObject *s, PyObject *arg)
4008{
4009 WSAPROTOCOL_INFO info;
4010 DWORD processId;
4011 int result;
4012
4013 if (!PyArg_ParseTuple(arg, "I", &processId))
4014 return NULL;
4015
4016 Py_BEGIN_ALLOW_THREADS
4017 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4018 Py_END_ALLOW_THREADS
4019 if (result == SOCKET_ERROR)
4020 return set_error();
4021 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4022}
4023PyDoc_STRVAR(sock_share_doc,
4024"share(process_id) -> bytes\n\
4025\n\
4026Share the socket with another process. The target process id\n\
4027must be provided and the resulting bytes object passed to the target\n\
4028process. There the shared socket can be instantiated by calling\n\
4029socket.fromshare().");
4030
Christian Heimesfaf2f632008-01-06 16:59:19 +00004031
4032#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004033
4034/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004035
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004036static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4038 accept_doc},
4039 {"bind", (PyCFunction)sock_bind, METH_O,
4040 bind_doc},
4041 {"close", (PyCFunction)sock_close, METH_NOARGS,
4042 close_doc},
4043 {"connect", (PyCFunction)sock_connect, METH_O,
4044 connect_doc},
4045 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4046 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004047 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4048 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4050 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004051#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004052 {"getpeername", (PyCFunction)sock_getpeername,
4053 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004055 {"getsockname", (PyCFunction)sock_getsockname,
4056 METH_NOARGS, getsockname_doc},
4057 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4058 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004059#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4061 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004062#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004063#if defined(MS_WINDOWS)
4064 {"share", (PyCFunction)sock_share, METH_VARARGS,
4065 sock_share_doc},
4066#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004067 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 listen_doc},
4069 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4070 recv_doc},
4071 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4072 recv_into_doc},
4073 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4074 recvfrom_doc},
4075 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4076 recvfrom_into_doc},
4077 {"send", (PyCFunction)sock_send, METH_VARARGS,
4078 send_doc},
4079 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4080 sendall_doc},
4081 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4082 sendto_doc},
4083 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4084 setblocking_doc},
4085 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4086 settimeout_doc},
4087 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4088 gettimeout_doc},
4089 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4090 setsockopt_doc},
4091 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4092 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004093#ifdef CMSG_LEN
4094 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4095 recvmsg_doc},
4096 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4097 recvmsg_into_doc,},
4098 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4099 sendmsg_doc},
4100#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004102};
4103
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004104/* SockObject members */
4105static PyMemberDef sock_memberlist[] = {
4106 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4107 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4108 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004109 {0},
4110};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004111
Victor Stinner71694d52015-03-28 01:18:54 +01004112static PyGetSetDef sock_getsetlist[] = {
4113 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4114 {NULL} /* sentinel */
4115};
4116
Guido van Rossum73624e91994-10-10 17:59:00 +00004117/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004118 First close the file description. */
4119
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004120static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004121sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004122{
Antoine Pitroue033e062010-10-29 10:38:18 +00004123 if (s->sock_fd != -1) {
4124 PyObject *exc, *val, *tb;
4125 Py_ssize_t old_refcount = Py_REFCNT(s);
4126 ++Py_REFCNT(s);
4127 PyErr_Fetch(&exc, &val, &tb);
4128 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4129 "unclosed %R", s))
4130 /* Spurious errors can appear at shutdown */
4131 if (PyErr_ExceptionMatches(PyExc_Warning))
4132 PyErr_WriteUnraisable((PyObject *) s);
4133 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004134 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004135 Py_REFCNT(s) = old_refcount;
4136 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004137 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004138}
4139
Guido van Rossum30a685f1991-06-27 15:51:29 +00004140
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004141static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004142sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004143{
Victor Stinnere254e532014-07-26 14:36:55 +02004144 long sock_fd;
4145 /* On Windows, this test is needed because SOCKET_T is unsigned */
4146 if (s->sock_fd == INVALID_SOCKET) {
4147 sock_fd = -1;
4148 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004149#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004150 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 /* this can occur on Win64, and actually there is a special
4152 ugly printf formatter for decimal pointer length integer
4153 printing, only bother if necessary*/
4154 PyErr_SetString(PyExc_OverflowError,
4155 "no printf formatter to display "
4156 "the socket descriptor in decimal");
4157 return NULL;
4158 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004159#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004160 else
4161 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 return PyUnicode_FromFormat(
4163 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004164 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004165 s->sock_type,
4166 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004167}
4168
4169
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004170/* Create a new, uninitialized socket object. */
4171
4172static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004173sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004175 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004177 new = type->tp_alloc(type, 0);
4178 if (new != NULL) {
4179 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner71694d52015-03-28 01:18:54 +01004180 ((PySocketSockObject *)new)->sock_timeout = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004181 ((PySocketSockObject *)new)->errorhandler = &set_error;
4182 }
4183 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004184}
4185
4186
4187/* Initialize a new socket object. */
4188
Victor Stinnerdaf45552013-08-28 00:53:59 +02004189#ifdef SOCK_CLOEXEC
4190/* socket() and socketpair() fail with EINVAL on Linux kernel older
4191 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4192static int sock_cloexec_works = -1;
4193#endif
4194
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004195/*ARGSUSED*/
4196static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004197sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004198{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004199 PySocketSockObject *s = (PySocketSockObject *)self;
4200 PyObject *fdobj = NULL;
4201 SOCKET_T fd = INVALID_SOCKET;
4202 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4203 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004204#ifndef MS_WINDOWS
4205#ifdef SOCK_CLOEXEC
4206 int *atomic_flag_works = &sock_cloexec_works;
4207#else
4208 int *atomic_flag_works = NULL;
4209#endif
4210#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4213 "|iiiO:socket", keywords,
4214 &family, &type, &proto, &fdobj))
4215 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004218#ifdef MS_WINDOWS
4219 /* recreate a socket that was duplicated */
4220 if (PyBytes_Check(fdobj)) {
4221 WSAPROTOCOL_INFO info;
4222 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4223 PyErr_Format(PyExc_ValueError,
4224 "socket descriptor string has wrong size, "
4225 "should be %zu bytes.", sizeof(info));
4226 return -1;
4227 }
4228 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4229 Py_BEGIN_ALLOW_THREADS
4230 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4231 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4232 Py_END_ALLOW_THREADS
4233 if (fd == INVALID_SOCKET) {
4234 set_error();
4235 return -1;
4236 }
4237 family = info.iAddressFamily;
4238 type = info.iSocketType;
4239 proto = info.iProtocol;
4240 }
4241 else
4242#endif
4243 {
4244 fd = PyLong_AsSocket_t(fdobj);
4245 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4246 return -1;
4247 if (fd == INVALID_SOCKET) {
4248 PyErr_SetString(PyExc_ValueError,
4249 "can't use invalid socket value");
4250 return -1;
4251 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004252 }
4253 }
4254 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004255#ifdef MS_WINDOWS
4256 /* Windows implementation */
4257#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4258#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4259#endif
4260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004261 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004262 if (support_wsa_no_inherit) {
4263 fd = WSASocket(family, type, proto,
4264 NULL, 0,
4265 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4266 if (fd == INVALID_SOCKET) {
4267 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4268 support_wsa_no_inherit = 0;
4269 fd = socket(family, type, proto);
4270 }
4271 }
4272 else {
4273 fd = socket(family, type, proto);
4274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004277 if (fd == INVALID_SOCKET) {
4278 set_error();
4279 return -1;
4280 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004281
4282 if (!support_wsa_no_inherit) {
4283 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4284 closesocket(fd);
4285 PyErr_SetFromWindowsErr(0);
4286 return -1;
4287 }
4288 }
4289#else
4290 /* UNIX */
4291 Py_BEGIN_ALLOW_THREADS
4292#ifdef SOCK_CLOEXEC
4293 if (sock_cloexec_works != 0) {
4294 fd = socket(family, type | SOCK_CLOEXEC, proto);
4295 if (sock_cloexec_works == -1) {
4296 if (fd >= 0) {
4297 sock_cloexec_works = 1;
4298 }
4299 else if (errno == EINVAL) {
4300 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4301 sock_cloexec_works = 0;
4302 fd = socket(family, type, proto);
4303 }
4304 }
4305 }
4306 else
4307#endif
4308 {
4309 fd = socket(family, type, proto);
4310 }
4311 Py_END_ALLOW_THREADS
4312
4313 if (fd == INVALID_SOCKET) {
4314 set_error();
4315 return -1;
4316 }
4317
4318 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4319 SOCKETCLOSE(fd);
4320 return -1;
4321 }
4322#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 }
4324 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004327
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004328}
4329
4330
Guido van Rossumb6775db1994-08-01 11:34:53 +00004331/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004332
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004333static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004334 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4335 "_socket.socket", /* tp_name */
4336 sizeof(PySocketSockObject), /* tp_basicsize */
4337 0, /* tp_itemsize */
4338 (destructor)sock_dealloc, /* tp_dealloc */
4339 0, /* tp_print */
4340 0, /* tp_getattr */
4341 0, /* tp_setattr */
4342 0, /* tp_reserved */
4343 (reprfunc)sock_repr, /* tp_repr */
4344 0, /* tp_as_number */
4345 0, /* tp_as_sequence */
4346 0, /* tp_as_mapping */
4347 0, /* tp_hash */
4348 0, /* tp_call */
4349 0, /* tp_str */
4350 PyObject_GenericGetAttr, /* tp_getattro */
4351 0, /* tp_setattro */
4352 0, /* tp_as_buffer */
4353 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4354 sock_doc, /* tp_doc */
4355 0, /* tp_traverse */
4356 0, /* tp_clear */
4357 0, /* tp_richcompare */
4358 0, /* tp_weaklistoffset */
4359 0, /* tp_iter */
4360 0, /* tp_iternext */
4361 sock_methods, /* tp_methods */
4362 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004363 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004364 0, /* tp_base */
4365 0, /* tp_dict */
4366 0, /* tp_descr_get */
4367 0, /* tp_descr_set */
4368 0, /* tp_dictoffset */
4369 sock_initobj, /* tp_init */
4370 PyType_GenericAlloc, /* tp_alloc */
4371 sock_new, /* tp_new */
4372 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004373};
4374
Guido van Rossum30a685f1991-06-27 15:51:29 +00004375
Guido van Rossum81194471991-07-27 21:42:02 +00004376/* Python interface to gethostname(). */
4377
4378/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004379static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004380socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004381{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004382#ifdef MS_WINDOWS
4383 /* Don't use winsock's gethostname, as this returns the ANSI
4384 version of the hostname, whereas we need a Unicode string.
4385 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004386 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004387 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004388 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004389 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004390
4391 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004392 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004393
4394 if (GetLastError() != ERROR_MORE_DATA)
4395 return PyErr_SetFromWindowsErr(0);
4396
4397 if (size == 0)
4398 return PyUnicode_New(0, 0);
4399
4400 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4401 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004402 name = PyMem_New(wchar_t, size);
4403 if (!name) {
4404 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004405 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004406 }
Victor Stinner74168972011-11-17 01:11:36 +01004407 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4408 name,
4409 &size))
4410 {
4411 PyMem_Free(name);
4412 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004413 }
Victor Stinner74168972011-11-17 01:11:36 +01004414
4415 result = PyUnicode_FromWideChar(name, size);
4416 PyMem_Free(name);
4417 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004418#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 char buf[1024];
4420 int res;
4421 Py_BEGIN_ALLOW_THREADS
4422 res = gethostname(buf, (int) sizeof buf - 1);
4423 Py_END_ALLOW_THREADS
4424 if (res < 0)
4425 return set_error();
4426 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004427 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004428#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004429}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004430
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004431PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004432"gethostname() -> string\n\
4433\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004434Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004435
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004436#ifdef HAVE_SETHOSTNAME
4437PyDoc_STRVAR(sethostname_doc,
4438"sethostname(name)\n\n\
4439Sets the hostname to name.");
4440
4441static PyObject *
4442socket_sethostname(PyObject *self, PyObject *args)
4443{
4444 PyObject *hnobj;
4445 Py_buffer buf;
4446 int res, flag = 0;
4447
Christian Heimesd2774c72013-06-19 02:06:29 +02004448#ifdef _AIX
4449/* issue #18259, not declared in any useful header file */
4450extern int sethostname(const char *, size_t);
4451#endif
4452
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004453 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4454 PyErr_Clear();
4455 if (!PyArg_ParseTuple(args, "O&:sethostname",
4456 PyUnicode_FSConverter, &hnobj))
4457 return NULL;
4458 flag = 1;
4459 }
4460 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4461 if (!res) {
4462 res = sethostname(buf.buf, buf.len);
4463 PyBuffer_Release(&buf);
4464 }
4465 if (flag)
4466 Py_DECREF(hnobj);
4467 if (res)
4468 return set_error();
4469 Py_RETURN_NONE;
4470}
4471#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004472
Guido van Rossum30a685f1991-06-27 15:51:29 +00004473/* Python interface to gethostbyname(name). */
4474
4475/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004476static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004477socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004478{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 char *name;
4480 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004481 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004482
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004483 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 return NULL;
4485 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004486 goto finally;
4487 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4488finally:
4489 PyMem_Free(name);
4490 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004491}
4492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004493PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004494"gethostbyname(host) -> address\n\
4495\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004496Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004497
4498
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004499/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4500
4501static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004502gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004503{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004504 char **pch;
4505 PyObject *rtn_tuple = (PyObject *)NULL;
4506 PyObject *name_list = (PyObject *)NULL;
4507 PyObject *addr_list = (PyObject *)NULL;
4508 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 if (h == NULL) {
4511 /* Let's get real error message to return */
4512 set_herror(h_errno);
4513 return NULL;
4514 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 if (h->h_addrtype != af) {
4517 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004518 errno = EAFNOSUPPORT;
4519 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 return NULL;
4521 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004525 case AF_INET:
4526 if (alen < sizeof(struct sockaddr_in))
4527 return NULL;
4528 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004529
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004530#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004531 case AF_INET6:
4532 if (alen < sizeof(struct sockaddr_in6))
4533 return NULL;
4534 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004535#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004537 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 if ((name_list = PyList_New(0)) == NULL)
4540 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 if ((addr_list = PyList_New(0)) == NULL)
4543 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 /* SF #1511317: h_aliases can be NULL */
4546 if (h->h_aliases) {
4547 for (pch = h->h_aliases; *pch != NULL; pch++) {
4548 int status;
4549 tmp = PyUnicode_FromString(*pch);
4550 if (tmp == NULL)
4551 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 status = PyList_Append(name_list, tmp);
4554 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004556 if (status)
4557 goto err;
4558 }
4559 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004561 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4562 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004564 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 case AF_INET:
4567 {
4568 struct sockaddr_in sin;
4569 memset(&sin, 0, sizeof(sin));
4570 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004571#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004572 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4575 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004577 if (pch == h->h_addr_list && alen >= sizeof(sin))
4578 memcpy((char *) addr, &sin, sizeof(sin));
4579 break;
4580 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004581
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004582#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 case AF_INET6:
4584 {
4585 struct sockaddr_in6 sin6;
4586 memset(&sin6, 0, sizeof(sin6));
4587 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004588#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004590#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004591 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4592 tmp = makeipaddr((struct sockaddr *)&sin6,
4593 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4596 memcpy((char *) addr, &sin6, sizeof(sin6));
4597 break;
4598 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004599#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004602 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 "unsupported address family");
4604 return NULL;
4605 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004606
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004607 if (tmp == NULL)
4608 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004609
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004610 status = PyList_Append(addr_list, tmp);
4611 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004612
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004613 if (status)
4614 goto err;
4615 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004616
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004618
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004619 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 Py_XDECREF(name_list);
4621 Py_XDECREF(addr_list);
4622 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004623}
4624
4625
4626/* Python interface to gethostbyname_ex(name). */
4627
4628/*ARGSUSED*/
4629static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004630socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004631{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 char *name;
4633 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004634 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004635 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004636 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004637#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004639#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004641#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004642 char buf[16384];
4643 int buf_len = (sizeof buf) - 1;
4644 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004645#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004646#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004648#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004649#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004650
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004651 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004653 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004654 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004655 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004656#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004657#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004658 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004659 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004660#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004661 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004662#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004663 memset((void *) &data, '\0', sizeof(data));
4664 result = gethostbyname_r(name, &hp_allocated, &data);
4665 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004666#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004667#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004668#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004669 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004672#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004673 Py_END_ALLOW_THREADS
4674 /* Some C libraries would require addr.__ss_family instead of
4675 addr.ss_family.
4676 Therefore, we cast the sockaddr_storage into sockaddr to
4677 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004678 sa = SAS2SA(&addr);
4679 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004681#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004683#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004684finally:
4685 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004686 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004687}
4688
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004689PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004690"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4691\n\
4692Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004693for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004694
4695
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004696/* Python interface to gethostbyaddr(IP). */
4697
4698/*ARGSUSED*/
4699static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004700socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004701{
Charles-François Natali8b759652011-12-23 16:44:51 +01004702 sock_addr_t addr;
4703 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004704 char *ip_num;
4705 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004706 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004707#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004708 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004709#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004710 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 /* glibcs up to 2.10 assume that the buf argument to
4713 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4714 does not ensure. The attribute below instructs the compiler
4715 to maintain this alignment. */
4716 char buf[16384] Py_ALIGNED(8);
4717 int buf_len = (sizeof buf) - 1;
4718 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004719#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004720#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004722#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004723#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004724 char *ap;
4725 int al;
4726 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004727
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004728 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004729 return NULL;
4730 af = AF_UNSPEC;
4731 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004732 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 af = sa->sa_family;
4734 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004735 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 switch (af) {
4737 case AF_INET:
4738 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4739 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4740 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004741#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004742 case AF_INET6:
4743 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4744 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4745 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004747 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004748 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004749 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 }
4751 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004752#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004753#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004754 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004755 &hp_allocated, buf, buf_len,
4756 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004757#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 h = gethostbyaddr_r(ap, al, af,
4759 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004760#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 memset((void *) &data, '\0', sizeof(data));
4762 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4763 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004764#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004765#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004766#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004767 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004770#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004771 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004772 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004773#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004774 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004775#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004776finally:
4777 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004779}
4780
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004781PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004782"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4783\n\
4784Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004785for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004786
Guido van Rossum30a685f1991-06-27 15:51:29 +00004787
4788/* Python interface to getservbyname(name).
4789 This only returns the port number, since the other info is already
4790 known or not useful (like the list of aliases). */
4791
4792/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004793static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004794socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004795{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 char *name, *proto=NULL;
4797 struct servent *sp;
4798 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4799 return NULL;
4800 Py_BEGIN_ALLOW_THREADS
4801 sp = getservbyname(name, proto);
4802 Py_END_ALLOW_THREADS
4803 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004804 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004805 return NULL;
4806 }
4807 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004808}
4809
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004810PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004811"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004812\n\
4813Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004814The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4815otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004816
Guido van Rossum30a685f1991-06-27 15:51:29 +00004817
Barry Warsaw11b91a02004-06-28 00:50:43 +00004818/* Python interface to getservbyport(port).
4819 This only returns the service name, since the other info is already
4820 known or not useful (like the list of aliases). */
4821
4822/*ARGSUSED*/
4823static PyObject *
4824socket_getservbyport(PyObject *self, PyObject *args)
4825{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004826 int port;
4827 char *proto=NULL;
4828 struct servent *sp;
4829 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4830 return NULL;
4831 if (port < 0 || port > 0xffff) {
4832 PyErr_SetString(
4833 PyExc_OverflowError,
4834 "getservbyport: port must be 0-65535.");
4835 return NULL;
4836 }
4837 Py_BEGIN_ALLOW_THREADS
4838 sp = getservbyport(htons((short)port), proto);
4839 Py_END_ALLOW_THREADS
4840 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004841 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004842 return NULL;
4843 }
4844 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004845}
4846
4847PyDoc_STRVAR(getservbyport_doc,
4848"getservbyport(port[, protocolname]) -> string\n\
4849\n\
4850Return the service name from a port number and protocol name.\n\
4851The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4852otherwise any protocol will match.");
4853
Guido van Rossum3901d851996-12-19 16:35:04 +00004854/* Python interface to getprotobyname(name).
4855 This only returns the protocol number, since the other info is
4856 already known or not useful (like the list of aliases). */
4857
4858/*ARGSUSED*/
4859static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004860socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004861{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 char *name;
4863 struct protoent *sp;
4864 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4865 return NULL;
4866 Py_BEGIN_ALLOW_THREADS
4867 sp = getprotobyname(name);
4868 Py_END_ALLOW_THREADS
4869 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004870 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004871 return NULL;
4872 }
4873 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004874}
4875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004876PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004877"getprotobyname(name) -> integer\n\
4878\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004879Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004880
Guido van Rossum3901d851996-12-19 16:35:04 +00004881
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004882#ifndef NO_DUP
4883/* dup() function for socket fds */
4884
4885static PyObject *
4886socket_dup(PyObject *self, PyObject *fdobj)
4887{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 SOCKET_T fd, newfd;
4889 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004890#ifdef MS_WINDOWS
4891 WSAPROTOCOL_INFO info;
4892#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004893
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 fd = PyLong_AsSocket_t(fdobj);
4895 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4896 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004897
Victor Stinnerdaf45552013-08-28 00:53:59 +02004898#ifdef MS_WINDOWS
4899 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4900 return set_error();
4901
4902 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4903 FROM_PROTOCOL_INFO,
4904 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 if (newfd == INVALID_SOCKET)
4906 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004907
Victor Stinnerdaf45552013-08-28 00:53:59 +02004908 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4909 closesocket(newfd);
4910 PyErr_SetFromWindowsErr(0);
4911 return NULL;
4912 }
4913#else
4914 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4915 newfd = _Py_dup(fd);
4916 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004917 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004918#endif
4919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 newfdobj = PyLong_FromSocket_t(newfd);
4921 if (newfdobj == NULL)
4922 SOCKETCLOSE(newfd);
4923 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004924}
4925
4926PyDoc_STRVAR(dup_doc,
4927"dup(integer) -> integer\n\
4928\n\
4929Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4930sockets; on some platforms os.dup() won't work for socket file descriptors.");
4931#endif
4932
4933
Dave Cole331708b2004-08-09 04:51:41 +00004934#ifdef HAVE_SOCKETPAIR
4935/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004936 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004937 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004938
4939/*ARGSUSED*/
4940static PyObject *
4941socket_socketpair(PyObject *self, PyObject *args)
4942{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004943 PySocketSockObject *s0 = NULL, *s1 = NULL;
4944 SOCKET_T sv[2];
4945 int family, type = SOCK_STREAM, proto = 0;
4946 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004947#ifdef SOCK_CLOEXEC
4948 int *atomic_flag_works = &sock_cloexec_works;
4949#else
4950 int *atomic_flag_works = NULL;
4951#endif
4952 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004953
4954#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004956#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004959 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4960 &family, &type, &proto))
4961 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004964 Py_BEGIN_ALLOW_THREADS
4965#ifdef SOCK_CLOEXEC
4966 if (sock_cloexec_works != 0) {
4967 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4968 if (sock_cloexec_works == -1) {
4969 if (ret >= 0) {
4970 sock_cloexec_works = 1;
4971 }
4972 else if (errno == EINVAL) {
4973 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4974 sock_cloexec_works = 0;
4975 ret = socketpair(family, type, proto, sv);
4976 }
4977 }
4978 }
4979 else
4980#endif
4981 {
4982 ret = socketpair(family, type, proto, sv);
4983 }
4984 Py_END_ALLOW_THREADS
4985
4986 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004988
4989 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4990 goto finally;
4991 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4992 goto finally;
4993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 s0 = new_sockobject(sv[0], family, type, proto);
4995 if (s0 == NULL)
4996 goto finally;
4997 s1 = new_sockobject(sv[1], family, type, proto);
4998 if (s1 == NULL)
4999 goto finally;
5000 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005001
5002finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 if (res == NULL) {
5004 if (s0 == NULL)
5005 SOCKETCLOSE(sv[0]);
5006 if (s1 == NULL)
5007 SOCKETCLOSE(sv[1]);
5008 }
5009 Py_XDECREF(s0);
5010 Py_XDECREF(s1);
5011 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005012}
5013
5014PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005015"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005016\n\
5017Create a pair of socket objects from the sockets returned by the platform\n\
5018socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005019The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005020AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005021
5022#endif /* HAVE_SOCKETPAIR */
5023
5024
Guido van Rossum006bf911996-06-12 04:04:55 +00005025static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005026socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005027{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005028 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005030 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5031 return NULL;
5032 }
5033 if (x1 < 0) {
5034 PyErr_SetString(PyExc_OverflowError,
5035 "can't convert negative number to unsigned long");
5036 return NULL;
5037 }
5038 x2 = (unsigned int)ntohs((unsigned short)x1);
5039 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005040}
5041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005042PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005043"ntohs(integer) -> integer\n\
5044\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005045Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005046
5047
Guido van Rossum006bf911996-06-12 04:04:55 +00005048static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005049socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005050{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005051 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005052
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 if (PyLong_Check(arg)) {
5054 x = PyLong_AsUnsignedLong(arg);
5055 if (x == (unsigned long) -1 && PyErr_Occurred())
5056 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005057#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 {
5059 unsigned long y;
5060 /* only want the trailing 32 bits */
5061 y = x & 0xFFFFFFFFUL;
5062 if (y ^ x)
5063 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005064 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 x = y;
5066 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005067#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 }
5069 else
5070 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005071 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005073 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005074}
5075
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005076PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005077"ntohl(integer) -> integer\n\
5078\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005079Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005080
5081
Guido van Rossum006bf911996-06-12 04:04:55 +00005082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005083socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005085 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005087 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5088 return NULL;
5089 }
5090 if (x1 < 0) {
5091 PyErr_SetString(PyExc_OverflowError,
5092 "can't convert negative number to unsigned long");
5093 return NULL;
5094 }
5095 x2 = (unsigned int)htons((unsigned short)x1);
5096 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005097}
5098
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005099PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005100"htons(integer) -> integer\n\
5101\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005102Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005103
5104
Guido van Rossum006bf911996-06-12 04:04:55 +00005105static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005106socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 if (PyLong_Check(arg)) {
5111 x = PyLong_AsUnsignedLong(arg);
5112 if (x == (unsigned long) -1 && PyErr_Occurred())
5113 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005114#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 {
5116 unsigned long y;
5117 /* only want the trailing 32 bits */
5118 y = x & 0xFFFFFFFFUL;
5119 if (y ^ x)
5120 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005121 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005122 x = y;
5123 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005124#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 }
5126 else
5127 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005128 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005129 Py_TYPE(arg)->tp_name);
5130 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005131}
5132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005133PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005134"htonl(integer) -> integer\n\
5135\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005136Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005137
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005138/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005140PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005141"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005142\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005143Convert 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 +00005144binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005145
5146static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005147socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005148{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005149#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005151#endif
5152
5153#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005154#if (SIZEOF_INT != 4)
5155#error "Not sure if in_addr_t exists and int is not 32-bits."
5156#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005157 /* Have to use inet_addr() instead */
5158 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005159#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005160 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5163 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005164
Tim Peters1df9fdd2003-02-13 03:13:40 +00005165
5166#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005167
5168#ifdef USE_INET_ATON_WEAKLINK
5169 if (inet_aton != NULL) {
5170#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005171 if (inet_aton(ip_addr, &buf))
5172 return PyBytes_FromStringAndSize((char *)(&buf),
5173 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005174
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005175 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 "illegal IP address string passed to inet_aton");
5177 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005178
Thomas Wouters477c8d52006-05-27 19:21:47 +00005179#ifdef USE_INET_ATON_WEAKLINK
5180 } else {
5181#endif
5182
5183#endif
5184
5185#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 /* special-case this address as inet_addr might return INADDR_NONE
5188 * for this */
5189 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005190 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005191 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005192
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005196 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 "illegal IP address string passed to inet_aton");
5198 return NULL;
5199 }
5200 }
5201 return PyBytes_FromStringAndSize((char *) &packed_addr,
5202 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005203
5204#ifdef USE_INET_ATON_WEAKLINK
5205 }
5206#endif
5207
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005208#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005209}
5210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005211PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005212"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005213\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005214Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005215
5216static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005217socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005218{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005219 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005221
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005222 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005223 return NULL;
5224 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005225
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005226 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005227 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005228 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005229 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005230 return NULL;
5231 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005232
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005233 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5234 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005236 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005237}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005238
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005239#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005240
5241PyDoc_STRVAR(inet_pton_doc,
5242"inet_pton(af, ip) -> packed IP address string\n\
5243\n\
5244Convert an IP address from string format to a packed string suitable\n\
5245for use with low-level network functions.");
5246
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005247#endif
5248
5249#ifdef HAVE_INET_PTON
5250
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005251static PyObject *
5252socket_inet_pton(PyObject *self, PyObject *args)
5253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 int af;
5255 char* ip;
5256 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005257#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005258 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005259#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005261#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5263 return NULL;
5264 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005265
Martin v. Löwis04697e82004-06-02 12:35:29 +00005266#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005268 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 "can't use AF_INET6, IPv6 is disabled");
5270 return NULL;
5271 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005272#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005274 retval = inet_pton(af, ip, packed);
5275 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005276 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 return NULL;
5278 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005279 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 "illegal IP address string passed to inet_pton");
5281 return NULL;
5282 } else if (af == AF_INET) {
5283 return PyBytes_FromStringAndSize(packed,
5284 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005285#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 } else if (af == AF_INET6) {
5287 return PyBytes_FromStringAndSize(packed,
5288 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005289#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005291 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 return NULL;
5293 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005294}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005295#elif defined(MS_WINDOWS)
5296
5297static PyObject *
5298socket_inet_pton(PyObject *self, PyObject *args)
5299{
5300 int af;
5301 char* ip;
5302 struct sockaddr_in6 addr;
5303 INT ret, size;
5304
5305 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5306 return NULL;
5307 }
5308
Victor Stinnere990c6e2013-11-16 00:18:58 +01005309 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005310 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5311
5312 if (ret) {
5313 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5314 return NULL;
5315 } else if(af == AF_INET) {
5316 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005317 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005318 sizeof(addr4->sin_addr));
5319 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005320 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005321 sizeof(addr.sin6_addr));
5322 } else {
5323 PyErr_SetString(PyExc_OSError, "unknown address family");
5324 return NULL;
5325 }
5326}
5327
5328#endif
5329
5330#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005331
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005332PyDoc_STRVAR(inet_ntop_doc,
5333"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5334\n\
5335Convert a packed IP address of the given family to string format.");
5336
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005337#endif
5338
5339
5340#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005341static PyObject *
5342socket_inet_ntop(PyObject *self, PyObject *args)
5343{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005345 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005347#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005348 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005349#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005351#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5354 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005355
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005356 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 return NULL;
5358 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005361 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005362 PyErr_SetString(PyExc_ValueError,
5363 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005364 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 return NULL;
5366 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005367#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005368 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005369 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 PyErr_SetString(PyExc_ValueError,
5371 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005372 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005373 return NULL;
5374 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 } else {
5377 PyErr_Format(PyExc_ValueError,
5378 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005379 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 return NULL;
5381 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005382
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005383 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5384 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005385 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005386 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005387 return NULL;
5388 } else {
5389 return PyUnicode_FromString(retval);
5390 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005392 /* NOTREACHED */
5393 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5394 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005395}
5396
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005397#elif defined(MS_WINDOWS)
5398
5399static PyObject *
5400socket_inet_ntop(PyObject *self, PyObject *args)
5401{
5402 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005403 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005404 struct sockaddr_in6 addr;
5405 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005406#ifdef ENABLE_IPV6
5407 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5408#else
5409 char ip[INET_ADDRSTRLEN + 1];
5410#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005411
5412 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5413 memset((void *) &ip[0], '\0', sizeof(ip));
5414
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005415 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005416 return NULL;
5417 }
5418
5419 if (af == AF_INET) {
5420 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5421
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005422 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005423 PyErr_SetString(PyExc_ValueError,
5424 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005425 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005426 return NULL;
5427 }
5428 memset(addr4, 0, sizeof(struct sockaddr_in));
5429 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005430 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005431 addrlen = sizeof(struct sockaddr_in);
5432 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005433 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005434 PyErr_SetString(PyExc_ValueError,
5435 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005436 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005437 return NULL;
5438 }
5439
5440 memset(&addr, 0, sizeof(addr));
5441 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005442 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005443 addrlen = sizeof(addr);
5444 } else {
5445 PyErr_Format(PyExc_ValueError,
5446 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005447 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005448 return NULL;
5449 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005450 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005451
5452 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005453 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005454 ip, &retlen);
5455
5456 if (ret) {
5457 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5458 return NULL;
5459 } else {
5460 return PyUnicode_FromString(ip);
5461 }
5462}
5463
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005464#endif /* HAVE_INET_PTON */
5465
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005466/* Python interface to getaddrinfo(host, port). */
5467
5468/*ARGSUSED*/
5469static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005470socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005471{
Victor Stinner77af1722011-05-26 14:05:59 +02005472 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005473 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 struct addrinfo hints, *res;
5475 struct addrinfo *res0 = NULL;
5476 PyObject *hobj = NULL;
5477 PyObject *pobj = (PyObject *)NULL;
5478 char pbuf[30];
5479 char *hptr, *pptr;
5480 int family, socktype, protocol, flags;
5481 int error;
5482 PyObject *all = (PyObject *)NULL;
5483 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005484
Georg Brandl6083a4b2013-10-14 06:51:46 +02005485 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005487 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005488 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005489 &protocol, &flags)) {
5490 return NULL;
5491 }
5492 if (hobj == Py_None) {
5493 hptr = NULL;
5494 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005495 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005496
5497 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005498 if (!idna)
5499 return NULL;
5500 assert(PyBytes_Check(idna));
5501 hptr = PyBytes_AS_STRING(idna);
5502 } else if (PyBytes_Check(hobj)) {
5503 hptr = PyBytes_AsString(hobj);
5504 } else {
5505 PyErr_SetString(PyExc_TypeError,
5506 "getaddrinfo() argument 1 must be string or None");
5507 return NULL;
5508 }
5509 if (PyLong_CheckExact(pobj)) {
5510 long value = PyLong_AsLong(pobj);
5511 if (value == -1 && PyErr_Occurred())
5512 goto err;
5513 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5514 pptr = pbuf;
5515 } else if (PyUnicode_Check(pobj)) {
5516 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005517 if (pptr == NULL)
5518 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005519 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005520 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 } else if (pobj == Py_None) {
5522 pptr = (char *)NULL;
5523 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005524 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 goto err;
5526 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005527#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005528 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5529 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005530 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5531 * This workaround avoids a segfault in libsystem.
5532 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005533 pptr = "00";
5534 }
5535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 memset(&hints, 0, sizeof(hints));
5537 hints.ai_family = family;
5538 hints.ai_socktype = socktype;
5539 hints.ai_protocol = protocol;
5540 hints.ai_flags = flags;
5541 Py_BEGIN_ALLOW_THREADS
5542 ACQUIRE_GETADDRINFO_LOCK
5543 error = getaddrinfo(hptr, pptr, &hints, &res0);
5544 Py_END_ALLOW_THREADS
5545 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5546 if (error) {
5547 set_gaierror(error);
5548 goto err;
5549 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005550
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005551 all = PyList_New(0);
5552 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 goto err;
5554 for (res = res0; res; res = res->ai_next) {
5555 PyObject *single;
5556 PyObject *addr =
5557 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5558 if (addr == NULL)
5559 goto err;
5560 single = Py_BuildValue("iiisO", res->ai_family,
5561 res->ai_socktype, res->ai_protocol,
5562 res->ai_canonname ? res->ai_canonname : "",
5563 addr);
5564 Py_DECREF(addr);
5565 if (single == NULL)
5566 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005567
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005568 if (PyList_Append(all, single))
5569 goto err;
5570 Py_XDECREF(single);
5571 }
5572 Py_XDECREF(idna);
5573 if (res0)
5574 freeaddrinfo(res0);
5575 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005576 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 Py_XDECREF(all);
5578 Py_XDECREF(idna);
5579 if (res0)
5580 freeaddrinfo(res0);
5581 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005582}
5583
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005584PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005585"getaddrinfo(host, port [, family, type, proto, flags])\n\
5586 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005587\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005588Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005589
5590/* Python interface to getnameinfo(sa, flags). */
5591
5592/*ARGSUSED*/
5593static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005594socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005595{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005596 PyObject *sa = (PyObject *)NULL;
5597 int flags;
5598 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005599 int port;
5600 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005601 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5602 struct addrinfo hints, *res = NULL;
5603 int error;
5604 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 flags = flowinfo = scope_id = 0;
5607 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5608 return NULL;
5609 if (!PyTuple_Check(sa)) {
5610 PyErr_SetString(PyExc_TypeError,
5611 "getnameinfo() argument 1 must be a tuple");
5612 return NULL;
5613 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005614 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 &hostp, &port, &flowinfo, &scope_id))
5616 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005617 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005618 PyErr_SetString(PyExc_OverflowError,
5619 "getsockaddrarg: flowinfo must be 0-1048575.");
5620 return NULL;
5621 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005622 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5623 memset(&hints, 0, sizeof(hints));
5624 hints.ai_family = AF_UNSPEC;
5625 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005626 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005627 Py_BEGIN_ALLOW_THREADS
5628 ACQUIRE_GETADDRINFO_LOCK
5629 error = getaddrinfo(hostp, pbuf, &hints, &res);
5630 Py_END_ALLOW_THREADS
5631 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5632 if (error) {
5633 set_gaierror(error);
5634 goto fail;
5635 }
5636 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005637 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 "sockaddr resolved to multiple addresses");
5639 goto fail;
5640 }
5641 switch (res->ai_family) {
5642 case AF_INET:
5643 {
5644 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005645 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 "IPv4 sockaddr must be 2 tuple");
5647 goto fail;
5648 }
5649 break;
5650 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005651#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005652 case AF_INET6:
5653 {
5654 struct sockaddr_in6 *sin6;
5655 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005656 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005657 sin6->sin6_scope_id = scope_id;
5658 break;
5659 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005662 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005663 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5664 if (error) {
5665 set_gaierror(error);
5666 goto fail;
5667 }
5668 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005669
5670fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005671 if (res)
5672 freeaddrinfo(res);
5673 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005674}
5675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005676PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005677"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005678\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005679Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005680
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005681
5682/* Python API to getting and setting the default timeout value. */
5683
5684static PyObject *
5685socket_getdefaulttimeout(PyObject *self)
5686{
Victor Stinner71694d52015-03-28 01:18:54 +01005687 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005688 Py_INCREF(Py_None);
5689 return Py_None;
5690 }
Victor Stinner71694d52015-03-28 01:18:54 +01005691 else {
5692 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5693 return PyFloat_FromDouble(seconds);
5694 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005695}
5696
5697PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005698"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005699\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005700Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005701A value of None indicates that new socket objects have no timeout.\n\
5702When the socket module is first imported, the default is None.");
5703
5704static PyObject *
5705socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5706{
Victor Stinner71694d52015-03-28 01:18:54 +01005707 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005708
Victor Stinner71694d52015-03-28 01:18:54 +01005709 if (socket_parse_timeout(&timeout, arg) < 0)
5710 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005713
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 Py_INCREF(Py_None);
5715 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005716}
5717
5718PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005719"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005720\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005721Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005722A value of None indicates that new socket objects have no timeout.\n\
5723When the socket module is first imported, the default is None.");
5724
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005725#ifdef HAVE_IF_NAMEINDEX
5726/* Python API for getting interface indices and names */
5727
5728static PyObject *
5729socket_if_nameindex(PyObject *self, PyObject *arg)
5730{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005731 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005732 int i;
5733 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005734
Charles-François Natali60713592011-05-20 16:55:06 +02005735 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005736 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005737 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005738 return NULL;
5739 }
5740
5741 list = PyList_New(0);
5742 if (list == NULL) {
5743 if_freenameindex(ni);
5744 return NULL;
5745 }
5746
Charles-François Natali60713592011-05-20 16:55:06 +02005747 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5748 PyObject *ni_tuple = Py_BuildValue("IO&",
5749 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005750
5751 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5752 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005753 Py_DECREF(list);
5754 if_freenameindex(ni);
5755 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005756 }
5757 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005758 }
5759
5760 if_freenameindex(ni);
5761 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005762}
5763
5764PyDoc_STRVAR(if_nameindex_doc,
5765"if_nameindex()\n\
5766\n\
5767Returns a list of network interface information (index, name) tuples.");
5768
Charles-François Natali60713592011-05-20 16:55:06 +02005769static PyObject *
5770socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005771{
Charles-François Natali60713592011-05-20 16:55:06 +02005772 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005773 unsigned long index;
5774
Charles-François Natali60713592011-05-20 16:55:06 +02005775 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5776 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005777 return NULL;
5778
Charles-François Natali60713592011-05-20 16:55:06 +02005779 index = if_nametoindex(PyBytes_AS_STRING(oname));
5780 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005781 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005782 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005783 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005784 return NULL;
5785 }
5786
5787 return PyLong_FromUnsignedLong(index);
5788}
5789
5790PyDoc_STRVAR(if_nametoindex_doc,
5791"if_nametoindex(if_name)\n\
5792\n\
5793Returns the interface index corresponding to the interface name if_name.");
5794
Charles-François Natali60713592011-05-20 16:55:06 +02005795static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005796socket_if_indextoname(PyObject *self, PyObject *arg)
5797{
Charles-François Natali60713592011-05-20 16:55:06 +02005798 unsigned long index;
5799 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005800
Charles-François Natali60713592011-05-20 16:55:06 +02005801 index = PyLong_AsUnsignedLong(arg);
5802 if (index == (unsigned long) -1)
5803 return NULL;
5804
5805 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005806 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005807 return NULL;
5808 }
5809
Charles-François Natali60713592011-05-20 16:55:06 +02005810 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005811}
5812
5813PyDoc_STRVAR(if_indextoname_doc,
5814"if_indextoname(if_index)\n\
5815\n\
5816Returns the interface name corresponding to the interface index if_index.");
5817
5818#endif /* HAVE_IF_NAMEINDEX */
5819
5820
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005821#ifdef CMSG_LEN
5822/* Python interface to CMSG_LEN(length). */
5823
5824static PyObject *
5825socket_CMSG_LEN(PyObject *self, PyObject *args)
5826{
5827 Py_ssize_t length;
5828 size_t result;
5829
5830 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5831 return NULL;
5832 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5833 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5834 return NULL;
5835 }
5836 return PyLong_FromSize_t(result);
5837}
5838
5839PyDoc_STRVAR(CMSG_LEN_doc,
5840"CMSG_LEN(length) -> control message length\n\
5841\n\
5842Return the total length, without trailing padding, of an ancillary\n\
5843data item with associated data of the given length. This value can\n\
5844often be used as the buffer size for recvmsg() to receive a single\n\
5845item of ancillary data, but RFC 3542 requires portable applications to\n\
5846use CMSG_SPACE() and thus include space for padding, even when the\n\
5847item will be the last in the buffer. Raises OverflowError if length\n\
5848is outside the permissible range of values.");
5849
5850
5851#ifdef CMSG_SPACE
5852/* Python interface to CMSG_SPACE(length). */
5853
5854static PyObject *
5855socket_CMSG_SPACE(PyObject *self, PyObject *args)
5856{
5857 Py_ssize_t length;
5858 size_t result;
5859
5860 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5861 return NULL;
5862 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5863 PyErr_SetString(PyExc_OverflowError,
5864 "CMSG_SPACE() argument out of range");
5865 return NULL;
5866 }
5867 return PyLong_FromSize_t(result);
5868}
5869
5870PyDoc_STRVAR(CMSG_SPACE_doc,
5871"CMSG_SPACE(length) -> buffer size\n\
5872\n\
5873Return the buffer size needed for recvmsg() to receive an ancillary\n\
5874data item with associated data of the given length, along with any\n\
5875trailing padding. The buffer space needed to receive multiple items\n\
5876is the sum of the CMSG_SPACE() values for their associated data\n\
5877lengths. Raises OverflowError if length is outside the permissible\n\
5878range of values.");
5879#endif /* CMSG_SPACE */
5880#endif /* CMSG_LEN */
5881
5882
Guido van Rossum30a685f1991-06-27 15:51:29 +00005883/* List of functions exported by this module. */
5884
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005885static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005886 {"gethostbyname", socket_gethostbyname,
5887 METH_VARARGS, gethostbyname_doc},
5888 {"gethostbyname_ex", socket_gethostbyname_ex,
5889 METH_VARARGS, ghbn_ex_doc},
5890 {"gethostbyaddr", socket_gethostbyaddr,
5891 METH_VARARGS, gethostbyaddr_doc},
5892 {"gethostname", socket_gethostname,
5893 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005894#ifdef HAVE_SETHOSTNAME
5895 {"sethostname", socket_sethostname,
5896 METH_VARARGS, sethostname_doc},
5897#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005898 {"getservbyname", socket_getservbyname,
5899 METH_VARARGS, getservbyname_doc},
5900 {"getservbyport", socket_getservbyport,
5901 METH_VARARGS, getservbyport_doc},
5902 {"getprotobyname", socket_getprotobyname,
5903 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005904#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005905 {"dup", socket_dup,
5906 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005907#endif
Dave Cole331708b2004-08-09 04:51:41 +00005908#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005909 {"socketpair", socket_socketpair,
5910 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005911#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005912 {"ntohs", socket_ntohs,
5913 METH_VARARGS, ntohs_doc},
5914 {"ntohl", socket_ntohl,
5915 METH_O, ntohl_doc},
5916 {"htons", socket_htons,
5917 METH_VARARGS, htons_doc},
5918 {"htonl", socket_htonl,
5919 METH_O, htonl_doc},
5920 {"inet_aton", socket_inet_aton,
5921 METH_VARARGS, inet_aton_doc},
5922 {"inet_ntoa", socket_inet_ntoa,
5923 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005924#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 {"inet_pton", socket_inet_pton,
5926 METH_VARARGS, inet_pton_doc},
5927 {"inet_ntop", socket_inet_ntop,
5928 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005929#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005930 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5931 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005932 {"getnameinfo", socket_getnameinfo,
5933 METH_VARARGS, getnameinfo_doc},
5934 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5935 METH_NOARGS, getdefaulttimeout_doc},
5936 {"setdefaulttimeout", socket_setdefaulttimeout,
5937 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005938#ifdef HAVE_IF_NAMEINDEX
5939 {"if_nameindex", socket_if_nameindex,
5940 METH_NOARGS, if_nameindex_doc},
5941 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005942 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005943 {"if_indextoname", socket_if_indextoname,
5944 METH_O, if_indextoname_doc},
5945#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005946#ifdef CMSG_LEN
5947 {"CMSG_LEN", socket_CMSG_LEN,
5948 METH_VARARGS, CMSG_LEN_doc},
5949#ifdef CMSG_SPACE
5950 {"CMSG_SPACE", socket_CMSG_SPACE,
5951 METH_VARARGS, CMSG_SPACE_doc},
5952#endif
5953#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005955};
5956
Guido van Rossum30a685f1991-06-27 15:51:29 +00005957
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005958#ifdef MS_WINDOWS
5959#define OS_INIT_DEFINED
5960
5961/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005962
5963static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005964os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005965{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005967}
5968
5969static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005970os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005972 WSADATA WSAData;
5973 int ret;
5974 ret = WSAStartup(0x0101, &WSAData);
5975 switch (ret) {
5976 case 0: /* No error */
5977 Py_AtExit(os_cleanup);
5978 return 1; /* Success */
5979 case WSASYSNOTREADY:
5980 PyErr_SetString(PyExc_ImportError,
5981 "WSAStartup failed: network not ready");
5982 break;
5983 case WSAVERNOTSUPPORTED:
5984 case WSAEINVAL:
5985 PyErr_SetString(
5986 PyExc_ImportError,
5987 "WSAStartup failed: requested version not supported");
5988 break;
5989 default:
5990 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5991 break;
5992 }
5993 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005994}
5995
Guido van Rossum8d665e61996-06-26 18:22:49 +00005996#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005997
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005998
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005999
6000#ifndef OS_INIT_DEFINED
6001static int
6002os_init(void)
6003{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006005}
6006#endif
6007
6008
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006009/* C API table - always add new things to the end for binary
6010 compatibility. */
6011static
6012PySocketModule_APIObject PySocketModuleAPI =
6013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006014 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006015 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006017};
6018
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006019
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006020/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006021
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006022 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006023 "socket.py" which implements some additional functionality.
6024 The import of "_socket" may fail with an ImportError exception if
6025 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006026 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006027 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006028*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006030PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006031"Implementation module for socket operations.\n\
6032\n\
6033See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006034
Martin v. Löwis1a214512008-06-11 05:26:20 +00006035static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036 PyModuleDef_HEAD_INIT,
6037 PySocket_MODULE_NAME,
6038 socket_doc,
6039 -1,
6040 socket_methods,
6041 NULL,
6042 NULL,
6043 NULL,
6044 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006045};
6046
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006047PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006048PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006049{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006050 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 if (!os_init())
6053 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006054
Victor Stinnerdaf45552013-08-28 00:53:59 +02006055#ifdef MS_WINDOWS
6056 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006057#if defined(_MSC_VER) && _MSC_VER >= 1800
6058 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6059#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006060 DWORD version = GetVersion();
6061 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6062 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6063 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006064 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6065#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006066 }
6067#endif
6068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006069 Py_TYPE(&sock_type) = &PyType_Type;
6070 m = PyModule_Create(&socketmodule);
6071 if (m == NULL)
6072 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006073
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006074 Py_INCREF(PyExc_OSError);
6075 PySocketModuleAPI.error = PyExc_OSError;
6076 Py_INCREF(PyExc_OSError);
6077 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006079 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 if (socket_herror == NULL)
6081 return NULL;
6082 Py_INCREF(socket_herror);
6083 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006084 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 NULL);
6086 if (socket_gaierror == NULL)
6087 return NULL;
6088 Py_INCREF(socket_gaierror);
6089 PyModule_AddObject(m, "gaierror", socket_gaierror);
6090 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006091 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 if (socket_timeout == NULL)
6093 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006094 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 Py_INCREF(socket_timeout);
6096 PyModule_AddObject(m, "timeout", socket_timeout);
6097 Py_INCREF((PyObject *)&sock_type);
6098 if (PyModule_AddObject(m, "SocketType",
6099 (PyObject *)&sock_type) != 0)
6100 return NULL;
6101 Py_INCREF((PyObject *)&sock_type);
6102 if (PyModule_AddObject(m, "socket",
6103 (PyObject *)&sock_type) != 0)
6104 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006105
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006106#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006107 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006108#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006109 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006111 Py_INCREF(has_ipv6);
6112 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006114 /* Export C API */
6115 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6116 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6117 ) != 0)
6118 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006120 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006121#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006122 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006123#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006124 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006125#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006126 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006127#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006128#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006129 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006130#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006131#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006134#endif
6135#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006136 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006137#endif
6138#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006140 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006141#endif
6142#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006143 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006144 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006145#endif
6146#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006148 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006149#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006150#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006152 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006153#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006154#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006156 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006157#endif
6158#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006161#endif
6162#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006163 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006164#endif
6165#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006166 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006168#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006169#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006170 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006171 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006172#endif
6173#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006174 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006176#endif
6177#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006178 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006180#endif
6181#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006184#endif
6185#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, AF_NETLINK);
6188 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006189#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006190 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006191#endif
6192#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006193 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006194#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6196 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006197#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006198 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006199#endif
6200#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006201 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006202#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006203#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006204 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006205#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006206#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006208#endif
6209#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006210 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006211#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006212 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006213#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006215#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006216#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006217 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006218#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006219#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006220#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006223#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006224#ifdef AF_LINK
6225 PyModule_AddIntMacro(m, AF_LINK);
6226#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006227#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006228 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006229 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006230#endif
6231#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006232 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006234#endif
6235#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006236 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006238#endif
6239#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006241 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006242#endif
6243#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006244 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006245 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006246#endif
6247#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006248 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006250#endif
6251#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006252 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006254#endif
6255#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006256 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006258#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006259
Hye-Shik Chang81268602004-02-02 06:05:24 +00006260#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006261 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6262 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6263 PyModule_AddIntMacro(m, BTPROTO_HCI);
6264 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006265#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006266 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006267#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006268#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006269#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006271#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006272 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6273 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006274#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006275 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6277 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006278#endif
6279
Charles-François Natali47413c12011-10-06 19:47:44 +02006280#ifdef AF_CAN
6281 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006283#endif
6284#ifdef PF_CAN
6285 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006287#endif
6288
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006289/* Reliable Datagram Sockets */
6290#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006292#endif
6293#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006295#endif
6296
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006297/* Kernel event messages */
6298#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006299 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006300#endif
6301#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006303#endif
6304
Antoine Pitroub156a462010-10-27 20:13:57 +00006305#ifdef AF_PACKET
6306 PyModule_AddIntMacro(m, AF_PACKET);
6307#endif
6308#ifdef PF_PACKET
6309 PyModule_AddIntMacro(m, PF_PACKET);
6310#endif
6311#ifdef PACKET_HOST
6312 PyModule_AddIntMacro(m, PACKET_HOST);
6313#endif
6314#ifdef PACKET_BROADCAST
6315 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6316#endif
6317#ifdef PACKET_MULTICAST
6318 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6319#endif
6320#ifdef PACKET_OTHERHOST
6321 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6322#endif
6323#ifdef PACKET_OUTGOING
6324 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6325#endif
6326#ifdef PACKET_LOOPBACK
6327 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6328#endif
6329#ifdef PACKET_FASTROUTE
6330 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006331#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006332
Christian Heimes043d6f62008-01-07 17:19:16 +00006333#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006334 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006336 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6338 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6339 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006340
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6342 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6343 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006345 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006346 PyModule_AddIntMacro(m, SOL_TIPC);
6347 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6348 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6349 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6350 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006351
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006352 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6353 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6354 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6355 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006358 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6359 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006360#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006361 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006363#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006364 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6365 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6366 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6367 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6368 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6369 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006370#endif
6371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, SOCK_STREAM);
6374 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006375/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, SOCK_RAW);
6377 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006378#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006380#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006381#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006383#endif
6384#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006385 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006386#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006390#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006391#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006393#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006394#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006396#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006397#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006398 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006399#endif
6400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006402 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006414 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006417 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006420 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006426 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006429 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006435 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006439#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006440#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006443#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006444 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006446#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006447 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006448#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006449#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006450 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006451#endif
6452#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006453 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006454#endif
6455#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006457#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006458#ifdef SO_BINDTODEVICE
6459 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6460#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006461#ifdef SO_PRIORITY
6462 PyModule_AddIntMacro(m, SO_PRIORITY);
6463#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006464#ifdef SO_MARK
6465 PyModule_AddIntMacro(m, SO_MARK);
6466#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468 /* Maximum number of connections for "listen" */
6469#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006471#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006473#endif
6474
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006475 /* Ancilliary message types */
6476#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006477 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006478#endif
6479#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006481#endif
6482#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006483 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006484#endif
6485
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 /* Flags for send, recv */
6487#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006488 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006494 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006497 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006500 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006501#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006502#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006503 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006504#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006505#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006507#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006508#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006509 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006513#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006515 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006516#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006517#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006519#endif
6520#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006521 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006522#endif
6523#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006524 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006525#endif
6526#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006527 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006528#endif
6529#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006530 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006531#endif
6532#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006533 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006534#endif
6535#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006536 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006537#endif
6538#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006539 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006540#endif
6541#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006542 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006543#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006544#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006545 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006546#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548 /* Protocol level and numbers, usable for [gs]etsockopt */
6549#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006554#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006559#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006562#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006563#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006565#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006566#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006567 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006568#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006569#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006571#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006572#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006574#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006575 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006579#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006581#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006582#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006584#endif
6585#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6587 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006588#endif
6589#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6591 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6592 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006593
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6595 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6596 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006597#endif
6598#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006599 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6600 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6601 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6602 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006603#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006604#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006606 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6607 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6608 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6609 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6610 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6611 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6612 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6613 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6614 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6615 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6616 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6617 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6618#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006619#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006621#endif
6622#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006624#endif
6625#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006627#endif
6628#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006630#endif
6631#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006633#endif
6634#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006636#endif
6637#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006639#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006640#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006642#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006643 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006644#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006645#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006646 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006647#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006648#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006649 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006650#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006651 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006658#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006659#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006660 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006667#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006668#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006670#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006672#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006674 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006681#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006690#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006708#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006711#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006726#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006728#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006729#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006732#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006734#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006735#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006736 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006737#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006738#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006739 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006743#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006744#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006745 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006746#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006747#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006748 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006749#endif
6750/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006753#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006755#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006756#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006758#endif
6759
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006760#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006762#endif
6763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006764 /* Some port configuration */
6765#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006767#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006768 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006769#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006771 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006772#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006774#endif
6775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776 /* Some reserved IP v.4 addresses */
6777#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006779#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006783 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006784#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006785 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006789#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006790 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006794#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006796#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006797#ifdef INADDR_ALLHOSTS_GROUP
6798 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6799 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006800#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006801 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006805#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006807#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006808#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006809 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006810#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006811 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006812#endif
6813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814 /* IPv4 [gs]etsockopt options */
6815#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006821#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006824#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006827#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006833#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006835#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006836#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006839#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006845#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006847#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006848#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006850#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006851#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006856#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006861 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006862#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006863#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006864 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006865#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6868#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006887#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006888 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006890 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006891#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006893#endif
6894#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006896#endif
6897#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006899#endif
6900#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006902#endif
6903#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006905#endif
6906#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006908#endif
6909#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006911#endif
6912#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006914#endif
6915#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006917#endif
6918#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006920#endif
6921#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006923#endif
6924#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006926#endif
6927#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006929#endif
6930#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006932#endif
6933#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006935#endif
6936#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006937 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006938#endif
6939#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006940 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006941#endif
6942#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006943 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006944#endif
6945#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006946 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006947#endif
6948#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006949 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006950#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006952 /* TCP options */
6953#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006973#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006974#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006976#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006977#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006978 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006979#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006980#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006981 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006982#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006983#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006984 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006986#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006987 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006988#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006989#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006990 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006991#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006993 /* IPX options */
6994#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006996#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006997
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006998/* Reliable Datagram Sockets */
6999#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007001#endif
7002#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007004#endif
7005#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007007#endif
7008#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007010#endif
7011#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007013#endif
7014#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007016#endif
7017#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007019#endif
7020#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007022#endif
7023#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007025#endif
7026#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007028#endif
7029#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007031#endif
7032#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007034#endif
7035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007036 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007037#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007039#endif
7040#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007042#endif
7043#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007045#endif
7046#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007048#endif
7049#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007051#endif
7052#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007054#endif
7055#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007057#endif
7058#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007060#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007061#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007063#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007064#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007066#endif
7067#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007069#endif
7070#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007072#endif
7073#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007075#endif
7076#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007078#endif
7079#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007081#endif
7082#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007084#endif
7085#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007087#endif
7088#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007090#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007091#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007093#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007094#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007096#endif
7097#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007098 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007099#endif
7100#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007102#endif
7103#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007104 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007105#endif
7106#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007108#endif
7109#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007111#endif
7112#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007114#endif
7115#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007117#endif
7118#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007119 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007120#endif
7121#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007122 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007123#endif
7124#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007125 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007126#endif
7127#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007129#endif
7130#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007131 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007132#endif
7133
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007134 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007135#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007136 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007137#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007138 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007139#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007140 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007141#endif
7142#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007143 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007144#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007145 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007147 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007148#endif
7149#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007151#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007152 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007153#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007154 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007155#endif
7156
Christian Heimesfaf2f632008-01-06 16:59:19 +00007157#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007158 {
7159 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7160 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7161 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007162 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007163 PyObject *tmp;
7164 tmp = PyLong_FromUnsignedLong(codes[i]);
7165 if (tmp == NULL)
7166 return NULL;
7167 PyModule_AddObject(m, names[i], tmp);
7168 }
7169 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007170 PyModule_AddIntMacro(m, RCVALL_OFF);
7171 PyModule_AddIntMacro(m, RCVALL_ON);
7172 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007173#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007175#endif
7176#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007178#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007179#endif /* _MSTCPIP_ */
7180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007181 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007182#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007184#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007185 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007186}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007187
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007188
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007189#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007190#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007191
7192/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007193/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007194
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007195int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007196inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007199#if (SIZEOF_INT != 4)
7200#error "Not sure if in_addr_t exists and int is not 32-bits."
7201#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007202 unsigned int packed_addr;
7203 packed_addr = inet_addr(src);
7204 if (packed_addr == INADDR_NONE)
7205 return 0;
7206 memcpy(dst, &packed_addr, 4);
7207 return 1;
7208 }
7209 /* Should set errno to EAFNOSUPPORT */
7210 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007211}
7212
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007213const char *
7214inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007216 if (af == AF_INET) {
7217 struct in_addr packed_addr;
7218 if (size < 16)
7219 /* Should set errno to ENOSPC. */
7220 return NULL;
7221 memcpy(&packed_addr, src, sizeof(packed_addr));
7222 return strncpy(dst, inet_ntoa(packed_addr), size);
7223 }
7224 /* Should set errno to EAFNOSUPPORT */
7225 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007226}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007227
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007228#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007229#endif