blob: 604b9a82078fc4b214214522b7a1a726695944a3 [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Steve Dower65e4cb12014-11-22 12:54:57 -0800287#if defined(_MSC_VER) && _MSC_VER >= 1800
288/* Provides the IsWindows7SP1OrGreater() function */
289#include <VersionHelpers.h>
290#endif
291
Jeremy Hylton22308652001-02-02 03:23:09 +0000292#endif
293
Skip Montanaro7befb992004-02-10 16:50:21 +0000294#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000295
Neal Norwitz39d22e52002-11-02 19:55:21 +0000296#ifndef O_NONBLOCK
297# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
299
Trent Micka708d6e2004-09-07 17:48:26 +0000300/* include Python's addrinfo.h unless it causes trouble */
301#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
302 /* Do not include addinfo.h on some newer IRIX versions.
303 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
304 * for example, but not by 6.5.10.
305 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000307 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
308 * EAI_* constants are defined in (the already included) ws2tcpip.h.
309 */
310#else
311# include "addrinfo.h"
312#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000313
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000314#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000315#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000316int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000317const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000318#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000319#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000321#ifdef __APPLE__
322/* On OS X, getaddrinfo returns no error indication of lookup
323 failure, so we must use the emulation instead of the libinfo
324 implementation. Unfortunately, performing an autoconf test
325 for this bug would require DNS access for the machine performing
326 the configuration, which is not acceptable. Therefore, we
327 determine the bug just by checking for __APPLE__. If this bug
328 gets ever fixed, perhaps checking for sys/version.h would be
329 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#ifndef HAVE_GETNAMEINFO
331/* This bug seems to be fixed in Jaguar. Ths easiest way I could
332 Find to check for Jaguar is that it has getnameinfo(), which
333 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
337#ifdef HAVE_INET_ATON
338#define USE_INET_ATON_WEAKLINK
339#endif
340
Jack Jansen84262fb2002-07-02 14:40:42 +0000341#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000343/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345/* avoid clashes with the C library definition of the symbol. */
346#define getaddrinfo fake_getaddrinfo
347#define gai_strerror fake_gai_strerror
348#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349#include "getaddrinfo.c"
350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getnameinfo.c"
354#endif
355
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000356#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358#endif
359
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000360#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000361#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000362#define EAFNOSUPPORT WSAEAFNOSUPPORT
363#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000365
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#ifndef SOCKETCLOSE
367#define SOCKETCLOSE close
368#endif
369
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000370#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#define USE_BLUETOOTH 1
372#if defined(__FreeBSD__)
373#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
374#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376#define SOL_HCI SOL_HCI_RAW
377#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#define sockaddr_l2 sockaddr_l2cap
379#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
382#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000383#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385#define sockaddr_l2 sockaddr_bt
386#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#define SOL_HCI BTPROTO_HCI
390#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
400#endif
401#endif
402
Charles-François Natali8b759652011-12-23 16:44:51 +0100403/* Convert "sock_addr_t *" to "struct sockaddr *". */
404#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405
Martin v. Löwise9416172003-05-03 10:12:45 +0000406/*
407 * Constants for getnameinfo()
408 */
409#if !defined(NI_MAXHOST)
410#define NI_MAXHOST 1025
411#endif
412#if !defined(NI_MAXSERV)
413#define NI_MAXSERV 32
414#endif
415
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000416#ifndef INVALID_SOCKET /* MS defines this */
417#define INVALID_SOCKET (-1)
418#endif
419
Charles-François Natali0cc86852013-09-13 19:53:08 +0200420#ifndef INADDR_NONE
421#define INADDR_NONE (-1)
422#endif
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* XXX There's a problem here: *static* functions are not supposed to have
425 a Py prefix (or use CapitalizedWords). Later... */
426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* Global variable holding the exception type for errors detected
428 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429static PyObject *socket_herror;
430static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000431static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432
Tim Peters643a7fc2002-02-17 04:13:21 +0000433/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 The sock_type variable contains pointers to various functions,
435 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000436 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000437static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#if defined(HAVE_POLL_H)
440#include <poll.h>
441#elif defined(HAVE_SYS_POLL_H)
442#include <sys/poll.h>
443#endif
444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445/* Largest value to try to store in a socklen_t (used when handling
446 ancillary data). POSIX requires socklen_t to hold at least
447 (2**31)-1 and recommends against storing larger values, but
448 socklen_t was originally int in the BSD interface, so to be on the
449 safe side we use the smaller of (2**31)-1 and INT_MAX. */
450#if INT_MAX > 0x7fffffff
451#define SOCKLEN_T_LIMIT 0x7fffffff
452#else
453#define SOCKLEN_T_LIMIT INT_MAX
454#endif
455
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457/* Instead of select(), we'll use poll() since poll() works on any fd. */
458#define IS_SELECTABLE(s) 1
459/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000460#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461/* If there's no timeout left, we don't have to call select, so it's a safe,
462 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000465
466static PyObject*
467select_error(void)
468{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471}
472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000473#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000474#ifndef WSAEAGAIN
475#define WSAEAGAIN WSAEWOULDBLOCK
476#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#define CHECK_ERRNO(expected) \
478 (WSAGetLastError() == WSA ## expected)
479#else
480#define CHECK_ERRNO(expected) \
481 (errno == expected)
482#endif
483
Victor Stinnerdaf45552013-08-28 00:53:59 +0200484#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200485# define GET_SOCK_ERROR WSAGetLastError()
486# define SET_SOCK_ERROR(err) WSASetLastError(err)
487# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
488# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
489#else
490# define GET_SOCK_ERROR errno
491# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
492# define SOCK_TIMEOUT_ERR EWOULDBLOCK
493# define SOCK_INPROGRESS_ERR EINPROGRESS
494#endif
495
496
497#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200498/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
499static int support_wsa_no_inherit = -1;
500#endif
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502/* Convenience function to raise an error according to errno
503 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504
Guido van Rossum73624e91994-10-10 17:59:00 +0000505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000508#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 int err_no = WSAGetLastError();
510 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
511 recognizes the error codes used by both GetLastError() and
512 WSAGetLastError */
513 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200514 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000515#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000516
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200517 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518}
519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000525
526#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (v != NULL) {
532 PyErr_SetObject(socket_herror, v);
533 Py_DECREF(v);
534 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537}
538
539
540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544
Martin v. Löwis272cb402002-03-01 08:31:07 +0000545#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* EAI_SYSTEM is not available on Windows XP. */
547 if (error == EAI_SYSTEM)
548 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000549#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000551#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000553#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (v != NULL) {
557 PyErr_SetObject(socket_gaierror, v);
558 Py_DECREF(v);
559 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562}
563
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000564/* Function to perform the setting of socket blocking mode
565 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000566static int
567internal_setblocking(PySocketSockObject *s, int block)
568{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200569#ifdef MS_WINDOWS
570 u_long arg;
571#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100572#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100573 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100574 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000575#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000576#ifdef SOCK_NONBLOCK
577 if (block)
578 s->sock_type &= (~SOCK_NONBLOCK);
579 else
580 s->sock_type |= SOCK_NONBLOCK;
581#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100585#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 block = !block;
587 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100588#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
590 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100591 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 else
Victor Stinner9a954832013-12-04 00:41:24 +0100593 new_delay_flag = delay_flag | O_NONBLOCK;
594 if (new_delay_flag != delay_flag)
595 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
596#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200598 arg = !block;
599 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Since these don't return anything */
604 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605}
606
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000607static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200608internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
609 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100612#ifdef HAVE_POLL
613 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200614 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100615#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200616 fd_set fds, efds;
Victor Stinner71694d52015-03-28 01:18:54 +0100617 struct timeval tv;
618#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000619
Victor Stinnerb7df3142015-03-27 22:59:32 +0100620#ifdef WITH_THREAD
621 /* must be called with the GIL held */
622 assert(PyGILState_Check());
623#endif
624
Victor Stinner416f2e62015-03-31 13:56:29 +0200625 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200626 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* Guard against closed socket */
629 if (s->sock_fd < 0)
630 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 /* Prefer poll, if available, since you can poll() any fd
633 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100635 pollfd.fd = s->sock_fd;
636 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200637 if (connect) {
638 /* On Windows, the socket becomes writable on connection success,
639 but a connection failure is notified as an error. On POSIX, the
640 socket becomes writable on connection success or on connection
641 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200642 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200643 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644
Victor Stinner71694d52015-03-28 01:18:54 +0100645 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200646 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200647 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000648
Victor Stinner71694d52015-03-28 01:18:54 +0100649 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200650 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100651 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000652#else
Victor Stinner10550cd2015-04-03 13:22:27 +0200653 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000654
Victor Stinner71694d52015-03-28 01:18:54 +0100655 FD_ZERO(&fds);
656 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200657 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200658 if (connect) {
659 /* On Windows, the socket becomes writable on connection success,
660 but a connection failure is notified as an error. On POSIX, the
661 socket becomes writable on connection success or on connection
662 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200663 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200664 }
Victor Stinner71694d52015-03-28 01:18:54 +0100665
666 /* See if the socket is ready */
667 Py_BEGIN_ALLOW_THREADS;
668 if (writing)
669 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200670 NULL, &fds, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100671 else
672 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200673 &fds, NULL, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100674 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000675#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000676
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (n < 0)
678 return -1;
679 if (n == 0)
680 return 1;
681 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000682}
683
Victor Stinner31bf2d52015-04-01 21:57:09 +0200684/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000685
Victor Stinner81c41db2015-04-02 11:50:57 +0200686 On error, raise an exception and return -1 if err is set, or fill err and
687 return -1 otherwise. If a signal was received and the signal handler raised
688 an exception, return -1, and set err to -1 if err is set.
689
690 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100691
Victor Stinner31bf2d52015-04-01 21:57:09 +0200692 If the socket has a timeout, wait until the socket is ready before calling
693 the function: wait until the socket is writable if writing is nonzero, wait
694 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100695
Victor Stinner81c41db2015-04-02 11:50:57 +0200696 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200697 the function, except if the signal handler raised an exception (PEP 475).
698
699 When the function is retried, recompute the timeout using a monotonic clock.
700
Victor Stinner81c41db2015-04-02 11:50:57 +0200701 sock_call_ex() must be called with the GIL held. The socket function is
702 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200703static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200704sock_call_ex(PySocketSockObject *s,
705 int writing,
706 int (*sock_func) (PySocketSockObject *s, void *data),
707 void *data,
708 int connect,
709 int *err)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200710{
711 int has_timeout = (s->sock_timeout > 0);
712 _PyTime_t deadline = 0;
713 int deadline_initialized = 0;
714 int res;
715
716 /* sock_call() must be called with the GIL held. */
717 assert(PyGILState_Check());
718
719 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200720 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200721 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200722 /* For connect(), poll even for blocking socket. The connection
723 runs asynchronously. */
724 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200725 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200726 _PyTime_t interval;
727
Victor Stinner81c41db2015-04-02 11:50:57 +0200728 if (deadline_initialized) {
729 /* recompute the timeout */
730 interval = deadline - _PyTime_GetMonotonicClock();
731 }
732 else {
733 deadline_initialized = 1;
734 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
735 interval = s->sock_timeout;
736 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200737
Victor Stinner10550cd2015-04-03 13:22:27 +0200738 if (interval >= 0)
739 res = internal_select(s, writing, interval, connect);
740 else
741 res = 1;
742 }
743 else {
744 res = internal_select(s, writing, -1, connect);
745 }
746
Victor Stinner31bf2d52015-04-01 21:57:09 +0200747 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200748 if (err)
749 *err = GET_SOCK_ERROR;
750
Victor Stinner31bf2d52015-04-01 21:57:09 +0200751 if (CHECK_ERRNO(EINTR)) {
752 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200753 if (PyErr_CheckSignals()) {
754 if (err)
755 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200756 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200757 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200758
759 /* retry select() */
760 continue;
761 }
762
763 /* select() failed */
764 s->errorhandler();
765 return -1;
766 }
767
768 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200769 if (err)
770 *err = SOCK_TIMEOUT_ERR;
771 else
772 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200773 return -1;
774 }
775
776 /* the socket is ready */
777 }
778
Victor Stinner81c41db2015-04-02 11:50:57 +0200779 /* inner loop to retry sock_func() when sock_func() is interrupted
780 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200781 while (1) {
782 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200783 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200784 Py_END_ALLOW_THREADS
785
786 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200787 /* sock_func() succeeded */
788 if (err)
789 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200790 return 0;
791 }
792
Victor Stinner81c41db2015-04-02 11:50:57 +0200793 if (err)
794 *err = GET_SOCK_ERROR;
795
Victor Stinner31bf2d52015-04-01 21:57:09 +0200796 if (!CHECK_ERRNO(EINTR))
797 break;
798
Victor Stinner81c41db2015-04-02 11:50:57 +0200799 /* sock_func() was interrupted by a signal */
800 if (PyErr_CheckSignals()) {
801 if (err)
802 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200803 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200804 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200805
Victor Stinner81c41db2015-04-02 11:50:57 +0200806 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200807 }
808
809 if (s->sock_timeout > 0
810 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200811 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200812
813 For example, select() could indicate a socket is ready for
814 reading, but the data then discarded by the OS because of a
815 wrong checksum.
816
817 Loop on select() to recheck for socket readyness. */
818 continue;
819 }
820
Victor Stinner81c41db2015-04-02 11:50:57 +0200821 /* sock_func() failed */
822 if (!err)
823 s->errorhandler();
824 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000825 return -1;
826 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200827}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000828
Victor Stinner81c41db2015-04-02 11:50:57 +0200829static int
830sock_call(PySocketSockObject *s,
831 int writing,
832 int (*func) (PySocketSockObject *s, void *data),
833 void *data)
834{
835 return sock_call_ex(s, writing, func, data, 0, NULL);
836}
837
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000838
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000839/* Initialize a new socket object. */
840
Victor Stinner71694d52015-03-28 01:18:54 +0100841static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000842
Martin v. Löwis1a214512008-06-11 05:26:20 +0000843static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000844init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 s->sock_fd = fd;
848 s->sock_family = family;
849 s->sock_type = type;
850 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000852 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000853#ifdef SOCK_NONBLOCK
854 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100855 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000856 else
857#endif
858 {
859 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100860 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000861 internal_setblocking(s, 0);
862 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000863
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000864}
865
866
Guido van Rossum30a685f1991-06-27 15:51:29 +0000867/* Create a new socket object.
868 This just creates the object and initializes it.
869 If the creation fails, return NULL and set an exception (implicit
870 in NEWOBJ()). */
871
Guido van Rossum73624e91994-10-10 17:59:00 +0000872static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000873new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 PySocketSockObject *s;
876 s = (PySocketSockObject *)
877 PyType_GenericNew(&sock_type, NULL, NULL);
878 if (s != NULL)
879 init_sockobject(s, fd, family, type, proto);
880 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000881}
882
Guido van Rossum30a685f1991-06-27 15:51:29 +0000883
Guido van Rossum48a680c2001-03-02 06:34:14 +0000884/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000885 thread to be in gethostbyname or getaddrinfo */
886#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200887static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000888#endif
889
890
Guido van Rossum30a685f1991-06-27 15:51:29 +0000891/* Convert a string specifying a host name or one of a few symbolic
892 names to a numeric IP address. This usually calls gethostbyname()
893 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000894 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000895 an error occurred; then an exception is raised. */
896
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000897static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000898setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000899{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 struct addrinfo hints, *res;
901 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
904 if (name[0] == '\0') {
905 int siz;
906 memset(&hints, 0, sizeof(hints));
907 hints.ai_family = af;
908 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
909 hints.ai_flags = AI_PASSIVE;
910 Py_BEGIN_ALLOW_THREADS
911 ACQUIRE_GETADDRINFO_LOCK
912 error = getaddrinfo(NULL, "0", &hints, &res);
913 Py_END_ALLOW_THREADS
914 /* We assume that those thread-unsafe getaddrinfo() versions
915 *are* safe regarding their return value, ie. that a
916 subsequent call to getaddrinfo() does not destroy the
917 outcome of the first call. */
918 RELEASE_GETADDRINFO_LOCK
919 if (error) {
920 set_gaierror(error);
921 return -1;
922 }
923 switch (res->ai_family) {
924 case AF_INET:
925 siz = 4;
926 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000927#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 case AF_INET6:
929 siz = 16;
930 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 default:
933 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200934 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 "unsupported address family");
936 return -1;
937 }
938 if (res->ai_next) {
939 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200940 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 "wildcard resolved to multiple address");
942 return -1;
943 }
944 if (res->ai_addrlen < addr_ret_size)
945 addr_ret_size = res->ai_addrlen;
946 memcpy(addr_ret, res->ai_addr, addr_ret_size);
947 freeaddrinfo(res);
948 return siz;
949 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200950 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100951 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200952 if (strcmp(name, "255.255.255.255") == 0 ||
953 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000954 struct sockaddr_in *sin;
955 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200956 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000957 "address family mismatched");
958 return -1;
959 }
960 sin = (struct sockaddr_in *)addr_ret;
961 memset((void *) sin, '\0', sizeof(*sin));
962 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000963#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000965#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 sin->sin_addr.s_addr = INADDR_BROADCAST;
967 return sizeof(sin->sin_addr);
968 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200969
970 /* avoid a name resolution in case of numeric address */
971#ifdef HAVE_INET_PTON
972 /* check for an IPv4 address */
973 if (af == AF_UNSPEC || af == AF_INET) {
974 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
975 memset(sin, 0, sizeof(*sin));
976 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
977 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000978#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200979 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000980#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200981 return 4;
982 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000983 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200984#ifdef ENABLE_IPV6
985 /* check for an IPv6 address - if the address contains a scope ID, we
986 * fallback to getaddrinfo(), which can handle translation from interface
987 * name to interface index */
988 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
989 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
990 memset(sin, 0, sizeof(*sin));
991 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
992 sin->sin6_family = AF_INET6;
993#ifdef HAVE_SOCKADDR_SA_LEN
994 sin->sin6_len = sizeof(*sin);
995#endif
996 return 16;
997 }
998 }
999#endif /* ENABLE_IPV6 */
1000#else /* HAVE_INET_PTON */
1001 /* check for an IPv4 address */
1002 if (af == AF_INET || af == AF_UNSPEC) {
1003 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1004 memset(sin, 0, sizeof(*sin));
1005 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1006 sin->sin_family = AF_INET;
1007#ifdef HAVE_SOCKADDR_SA_LEN
1008 sin->sin_len = sizeof(*sin);
1009#endif
1010 return 4;
1011 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001012 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001013#endif /* HAVE_INET_PTON */
1014
1015 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 memset(&hints, 0, sizeof(hints));
1017 hints.ai_family = af;
1018 Py_BEGIN_ALLOW_THREADS
1019 ACQUIRE_GETADDRINFO_LOCK
1020 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001021#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 if (error == EAI_NONAME && af == AF_UNSPEC) {
1023 /* On Tru64 V5.1, numeric-to-addr conversion fails
1024 if no address family is given. Assume IPv4 for now.*/
1025 hints.ai_family = AF_INET;
1026 error = getaddrinfo(name, NULL, &hints, &res);
1027 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 Py_END_ALLOW_THREADS
1030 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1031 if (error) {
1032 set_gaierror(error);
1033 return -1;
1034 }
1035 if (res->ai_addrlen < addr_ret_size)
1036 addr_ret_size = res->ai_addrlen;
1037 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1038 freeaddrinfo(res);
1039 switch (addr_ret->sa_family) {
1040 case AF_INET:
1041 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001042#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 case AF_INET6:
1044 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001045#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001047 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001048 return -1;
1049 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001050}
1051
Guido van Rossum30a685f1991-06-27 15:51:29 +00001052
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053/* Create a string object representing an IP address.
1054 This is always a string of the form 'dd.dd.dd.dd' (with variable
1055 size numbers). */
1056
Guido van Rossum73624e91994-10-10 17:59:00 +00001057static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001058makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001059{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001060 char buf[NI_MAXHOST];
1061 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001063 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1064 NI_NUMERICHOST);
1065 if (error) {
1066 set_gaierror(error);
1067 return NULL;
1068 }
1069 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001070}
1071
1072
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001073#ifdef USE_BLUETOOTH
1074/* Convert a string representation of a Bluetooth address into a numeric
1075 address. Returns the length (6), or raises an exception and returns -1 if
1076 an error occurred. */
1077
1078static int
1079setbdaddr(char *name, bdaddr_t *bdaddr)
1080{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 unsigned int b0, b1, b2, b3, b4, b5;
1082 char ch;
1083 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001085 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1086 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1087 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1088 bdaddr->b[0] = b0;
1089 bdaddr->b[1] = b1;
1090 bdaddr->b[2] = b2;
1091 bdaddr->b[3] = b3;
1092 bdaddr->b[4] = b4;
1093 bdaddr->b[5] = b5;
1094 return 6;
1095 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001096 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 return -1;
1098 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001099}
1100
1101/* Create a string representation of the Bluetooth address. This is always a
1102 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1103 value (zero padded if necessary). */
1104
1105static PyObject *
1106makebdaddr(bdaddr_t *bdaddr)
1107{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001108 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1111 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1112 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1113 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001114}
1115#endif
1116
1117
Guido van Rossum30a685f1991-06-27 15:51:29 +00001118/* Create an object representing the given socket address,
1119 suitable for passing it back to bind(), connect() etc.
1120 The family field of the sockaddr structure is inspected
1121 to determine what kind of address it really is. */
1122
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001123/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001124static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001125makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001126{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001127 if (addrlen == 0) {
1128 /* No address -- may be recvfrom() from known socket */
1129 Py_INCREF(Py_None);
1130 return Py_None;
1131 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001133 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001134
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001135 case AF_INET:
1136 {
1137 struct sockaddr_in *a;
1138 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1139 PyObject *ret = NULL;
1140 if (addrobj) {
1141 a = (struct sockaddr_in *)addr;
1142 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1143 Py_DECREF(addrobj);
1144 }
1145 return ret;
1146 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001147
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001148#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001149 case AF_UNIX:
1150 {
1151 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001152#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001153 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1154 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001155 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001156 }
1157 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001158#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001159 {
1160 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001161 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 }
1163 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001164#endif /* AF_UNIX */
1165
Martin v. Löwis11017b12006-01-14 18:12:57 +00001166#if defined(AF_NETLINK)
1167 case AF_NETLINK:
1168 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001169 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1170 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001171 }
1172#endif /* AF_NETLINK */
1173
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001174#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 case AF_INET6:
1176 {
1177 struct sockaddr_in6 *a;
1178 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1179 PyObject *ret = NULL;
1180 if (addrobj) {
1181 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001182 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 addrobj,
1184 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001185 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 a->sin6_scope_id);
1187 Py_DECREF(addrobj);
1188 }
1189 return ret;
1190 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001191#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001192
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001193#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 case AF_BLUETOOTH:
1195 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001197 case BTPROTO_L2CAP:
1198 {
1199 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1200 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1201 PyObject *ret = NULL;
1202 if (addrobj) {
1203 ret = Py_BuildValue("Oi",
1204 addrobj,
1205 _BT_L2_MEMB(a, psm));
1206 Py_DECREF(addrobj);
1207 }
1208 return ret;
1209 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001210
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001211 case BTPROTO_RFCOMM:
1212 {
1213 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1214 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1215 PyObject *ret = NULL;
1216 if (addrobj) {
1217 ret = Py_BuildValue("Oi",
1218 addrobj,
1219 _BT_RC_MEMB(a, channel));
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_HCI:
1226 {
1227 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001228#if defined(__NetBSD__) || defined(__DragonFly__)
1229 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1230#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001231 PyObject *ret = NULL;
1232 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1233 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001234#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001235 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001236
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001237#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001238 case BTPROTO_SCO:
1239 {
1240 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1241 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1242 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001243#endif
1244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001245 default:
1246 PyErr_SetString(PyExc_ValueError,
1247 "Unknown Bluetooth protocol");
1248 return NULL;
1249 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001250#endif
1251
Antoine Pitroub156a462010-10-27 20:13:57 +00001252#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001253 case AF_PACKET:
1254 {
1255 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1256 char *ifname = "";
1257 struct ifreq ifr;
1258 /* need to look up interface name give index */
1259 if (a->sll_ifindex) {
1260 ifr.ifr_ifindex = a->sll_ifindex;
1261 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1262 ifname = ifr.ifr_name;
1263 }
1264 return Py_BuildValue("shbhy#",
1265 ifname,
1266 ntohs(a->sll_protocol),
1267 a->sll_pkttype,
1268 a->sll_hatype,
1269 a->sll_addr,
1270 a->sll_halen);
1271 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001272#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001273
Christian Heimes043d6f62008-01-07 17:19:16 +00001274#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001275 case AF_TIPC:
1276 {
1277 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1278 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1279 return Py_BuildValue("IIIII",
1280 a->addrtype,
1281 a->addr.nameseq.type,
1282 a->addr.nameseq.lower,
1283 a->addr.nameseq.upper,
1284 a->scope);
1285 } else if (a->addrtype == TIPC_ADDR_NAME) {
1286 return Py_BuildValue("IIIII",
1287 a->addrtype,
1288 a->addr.name.name.type,
1289 a->addr.name.name.instance,
1290 a->addr.name.name.instance,
1291 a->scope);
1292 } else if (a->addrtype == TIPC_ADDR_ID) {
1293 return Py_BuildValue("IIIII",
1294 a->addrtype,
1295 a->addr.id.node,
1296 a->addr.id.ref,
1297 0,
1298 a->scope);
1299 } else {
1300 PyErr_SetString(PyExc_ValueError,
1301 "Invalid address type");
1302 return NULL;
1303 }
1304 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001305#endif
1306
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001307#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001308 case AF_CAN:
1309 {
1310 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1311 char *ifname = "";
1312 struct ifreq ifr;
1313 /* need to look up interface name given index */
1314 if (a->can_ifindex) {
1315 ifr.ifr_ifindex = a->can_ifindex;
1316 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1317 ifname = ifr.ifr_name;
1318 }
1319
1320 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1321 ifname,
1322 a->can_family);
1323 }
1324#endif
1325
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001326#ifdef PF_SYSTEM
1327 case PF_SYSTEM:
1328 switch(proto) {
1329#ifdef SYSPROTO_CONTROL
1330 case SYSPROTO_CONTROL:
1331 {
1332 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1333 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1334 }
1335#endif
1336 default:
1337 PyErr_SetString(PyExc_ValueError,
1338 "Invalid address type");
1339 return 0;
1340 }
1341#endif
1342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 default:
1346 /* If we don't know the address family, don't raise an
1347 exception -- return it as an (int, bytes) tuple. */
1348 return Py_BuildValue("iy#",
1349 addr->sa_family,
1350 addr->sa_data,
1351 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001354}
1355
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001356/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1357 (in particular, numeric IP addresses). */
1358struct maybe_idna {
1359 PyObject *obj;
1360 char *buf;
1361};
1362
1363static void
1364idna_cleanup(struct maybe_idna *data)
1365{
1366 Py_CLEAR(data->obj);
1367}
1368
1369static int
1370idna_converter(PyObject *obj, struct maybe_idna *data)
1371{
1372 size_t len;
1373 PyObject *obj2, *obj3;
1374 if (obj == NULL) {
1375 idna_cleanup(data);
1376 return 1;
1377 }
1378 data->obj = NULL;
1379 len = -1;
1380 if (PyBytes_Check(obj)) {
1381 data->buf = PyBytes_AsString(obj);
1382 len = PyBytes_Size(obj);
1383 }
1384 else if (PyByteArray_Check(obj)) {
1385 data->buf = PyByteArray_AsString(obj);
1386 len = PyByteArray_Size(obj);
1387 }
1388 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1389 data->buf = PyUnicode_DATA(obj);
1390 len = PyUnicode_GET_LENGTH(obj);
1391 }
1392 else {
1393 obj2 = PyUnicode_FromObject(obj);
1394 if (!obj2) {
1395 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1396 obj->ob_type->tp_name);
1397 return 0;
1398 }
1399 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1400 Py_DECREF(obj2);
1401 if (!obj3) {
1402 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1403 return 0;
1404 }
1405 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001406 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001407 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1408 return 0;
1409 }
1410 data->obj = obj3;
1411 data->buf = PyBytes_AS_STRING(obj3);
1412 len = PyBytes_GET_SIZE(obj3);
1413 }
1414 if (strlen(data->buf) != len) {
1415 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001416 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001417 return 0;
1418 }
1419 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001420}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001421
1422/* Parse a socket address argument according to the socket object's
1423 address family. Return 1 if the address was in the proper format,
1424 0 of not. The address is returned through addr_ret, its length
1425 through len_ret. */
1426
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001427static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001428getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001429 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001431 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001432
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001433#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001434 case AF_UNIX:
1435 {
1436 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001437 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001438 int retval = 0;
1439
1440 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1441 allow embedded nulls on Linux. */
1442 if (PyUnicode_Check(args)) {
1443 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1444 return 0;
1445 }
1446 else
1447 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001448 if (!PyArg_Parse(args, "y*", &path)) {
1449 Py_DECREF(args);
1450 return retval;
1451 }
1452 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001455#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001456 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001457 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001458 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001459 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001460 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001461 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 }
1463 }
1464 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001465#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 {
1467 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001468 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001469 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001470 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001471 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001472 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001473 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001474 }
1475 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001476 memcpy(addr->sun_path, path.buf, path.len);
1477 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001478 retval = 1;
1479 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001480 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001481 Py_DECREF(args);
1482 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001484#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001485
Martin v. Löwis11017b12006-01-14 18:12:57 +00001486#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 case AF_NETLINK:
1488 {
1489 struct sockaddr_nl* addr;
1490 int pid, groups;
1491 addr = (struct sockaddr_nl *)addr_ret;
1492 if (!PyTuple_Check(args)) {
1493 PyErr_Format(
1494 PyExc_TypeError,
1495 "getsockaddrarg: "
1496 "AF_NETLINK address must be tuple, not %.500s",
1497 Py_TYPE(args)->tp_name);
1498 return 0;
1499 }
1500 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1501 return 0;
1502 addr->nl_family = AF_NETLINK;
1503 addr->nl_pid = pid;
1504 addr->nl_groups = groups;
1505 *len_ret = sizeof(*addr);
1506 return 1;
1507 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001508#endif
1509
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001510#ifdef AF_RDS
1511 case AF_RDS:
1512 /* RDS sockets use sockaddr_in: fall-through */
1513#endif
1514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001515 case AF_INET:
1516 {
1517 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001518 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001519 int port, result;
1520 if (!PyTuple_Check(args)) {
1521 PyErr_Format(
1522 PyExc_TypeError,
1523 "getsockaddrarg: "
1524 "AF_INET address must be tuple, not %.500s",
1525 Py_TYPE(args)->tp_name);
1526 return 0;
1527 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001528 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1529 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001530 return 0;
1531 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001532 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001533 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001534 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001535 if (result < 0)
1536 return 0;
1537 if (port < 0 || port > 0xffff) {
1538 PyErr_SetString(
1539 PyExc_OverflowError,
1540 "getsockaddrarg: port must be 0-65535.");
1541 return 0;
1542 }
1543 addr->sin_family = AF_INET;
1544 addr->sin_port = htons((short)port);
1545 *len_ret = sizeof *addr;
1546 return 1;
1547 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001548
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001549#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001550 case AF_INET6:
1551 {
1552 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001553 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001554 int port, result;
1555 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001556 flowinfo = scope_id = 0;
1557 if (!PyTuple_Check(args)) {
1558 PyErr_Format(
1559 PyExc_TypeError,
1560 "getsockaddrarg: "
1561 "AF_INET6 address must be tuple, not %.500s",
1562 Py_TYPE(args)->tp_name);
1563 return 0;
1564 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001565 if (!PyArg_ParseTuple(args, "O&i|II",
1566 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001567 &scope_id)) {
1568 return 0;
1569 }
1570 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001571 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001572 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001573 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001574 if (result < 0)
1575 return 0;
1576 if (port < 0 || port > 0xffff) {
1577 PyErr_SetString(
1578 PyExc_OverflowError,
1579 "getsockaddrarg: port must be 0-65535.");
1580 return 0;
1581 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001582 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001583 PyErr_SetString(
1584 PyExc_OverflowError,
1585 "getsockaddrarg: flowinfo must be 0-1048575.");
1586 return 0;
1587 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 addr->sin6_family = s->sock_family;
1589 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001590 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 addr->sin6_scope_id = scope_id;
1592 *len_ret = sizeof *addr;
1593 return 1;
1594 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001595#endif
1596
Hye-Shik Chang81268602004-02-02 06:05:24 +00001597#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001598 case AF_BLUETOOTH:
1599 {
1600 switch (s->sock_proto) {
1601 case BTPROTO_L2CAP:
1602 {
1603 struct sockaddr_l2 *addr;
1604 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001606 addr = (struct sockaddr_l2 *)addr_ret;
1607 memset(addr, 0, sizeof(struct sockaddr_l2));
1608 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1609 if (!PyArg_ParseTuple(args, "si", &straddr,
1610 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001611 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001612 "wrong format");
1613 return 0;
1614 }
1615 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1616 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001618 *len_ret = sizeof *addr;
1619 return 1;
1620 }
1621 case BTPROTO_RFCOMM:
1622 {
1623 struct sockaddr_rc *addr;
1624 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001625
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001626 addr = (struct sockaddr_rc *)addr_ret;
1627 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1628 if (!PyArg_ParseTuple(args, "si", &straddr,
1629 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001630 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001631 "wrong format");
1632 return 0;
1633 }
1634 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1635 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001636
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 *len_ret = sizeof *addr;
1638 return 1;
1639 }
1640 case BTPROTO_HCI:
1641 {
1642 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001643#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001644 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001645
Alexander Belopolskye239d232010-12-08 23:31:48 +00001646 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001647 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001648 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001649 "wrong format");
1650 return 0;
1651 }
1652 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1653 return 0;
1654#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1656 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001657 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001658 "wrong format");
1659 return 0;
1660 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 *len_ret = sizeof *addr;
1663 return 1;
1664 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001665#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001666 case BTPROTO_SCO:
1667 {
1668 struct sockaddr_sco *addr;
1669 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 addr = (struct sockaddr_sco *)addr_ret;
1672 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1673 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001674 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 "wrong format");
1676 return 0;
1677 }
1678 straddr = PyBytes_AS_STRING(args);
1679 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1680 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001682 *len_ret = sizeof *addr;
1683 return 1;
1684 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001687 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001688 return 0;
1689 }
1690 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001691#endif
1692
Antoine Pitroub156a462010-10-27 20:13:57 +00001693#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001694 case AF_PACKET:
1695 {
1696 struct sockaddr_ll* addr;
1697 struct ifreq ifr;
1698 char *interfaceName;
1699 int protoNumber;
1700 int hatype = 0;
1701 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001702 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001704 if (!PyTuple_Check(args)) {
1705 PyErr_Format(
1706 PyExc_TypeError,
1707 "getsockaddrarg: "
1708 "AF_PACKET address must be tuple, not %.500s",
1709 Py_TYPE(args)->tp_name);
1710 return 0;
1711 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001712 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001714 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001715 return 0;
1716 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1717 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1718 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1719 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001720 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 return 0;
1722 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001723 if (haddr.buf && haddr.len > 8) {
1724 PyErr_SetString(PyExc_ValueError,
1725 "Hardware address must be 8 bytes or less");
1726 PyBuffer_Release(&haddr);
1727 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 }
1729 if (protoNumber < 0 || protoNumber > 0xffff) {
1730 PyErr_SetString(
1731 PyExc_OverflowError,
1732 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001733 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001734 return 0;
1735 }
1736 addr = (struct sockaddr_ll*)addr_ret;
1737 addr->sll_family = AF_PACKET;
1738 addr->sll_protocol = htons((short)protoNumber);
1739 addr->sll_ifindex = ifr.ifr_ifindex;
1740 addr->sll_pkttype = pkttype;
1741 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001742 if (haddr.buf) {
1743 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1744 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001745 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001746 else
1747 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001748 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001749 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001750 return 1;
1751 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001752#endif
1753
Christian Heimes043d6f62008-01-07 17:19:16 +00001754#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 case AF_TIPC:
1756 {
1757 unsigned int atype, v1, v2, v3;
1758 unsigned int scope = TIPC_CLUSTER_SCOPE;
1759 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001761 if (!PyTuple_Check(args)) {
1762 PyErr_Format(
1763 PyExc_TypeError,
1764 "getsockaddrarg: "
1765 "AF_TIPC address must be tuple, not %.500s",
1766 Py_TYPE(args)->tp_name);
1767 return 0;
1768 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 if (!PyArg_ParseTuple(args,
1771 "IIII|I;Invalid TIPC address format",
1772 &atype, &v1, &v2, &v3, &scope))
1773 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001774
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001775 addr = (struct sockaddr_tipc *) addr_ret;
1776 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001778 addr->family = AF_TIPC;
1779 addr->scope = scope;
1780 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001781
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001782 if (atype == TIPC_ADDR_NAMESEQ) {
1783 addr->addr.nameseq.type = v1;
1784 addr->addr.nameseq.lower = v2;
1785 addr->addr.nameseq.upper = v3;
1786 } else if (atype == TIPC_ADDR_NAME) {
1787 addr->addr.name.name.type = v1;
1788 addr->addr.name.name.instance = v2;
1789 } else if (atype == TIPC_ADDR_ID) {
1790 addr->addr.id.node = v1;
1791 addr->addr.id.ref = v2;
1792 } else {
1793 /* Shouldn't happen */
1794 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1795 return 0;
1796 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001797
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001798 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 return 1;
1801 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001802#endif
1803
Vinay Sajiped6783f2014-03-21 11:44:32 +00001804#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001805 case AF_CAN:
1806 switch (s->sock_proto) {
1807 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001808 /* fall-through */
1809 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001810 {
1811 struct sockaddr_can *addr;
1812 PyObject *interfaceName;
1813 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001814 Py_ssize_t len;
1815
Benjamin Peterson18b71912013-05-16 15:29:44 -05001816 addr = (struct sockaddr_can *)addr_ret;
1817
Charles-François Natali47413c12011-10-06 19:47:44 +02001818 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1819 &interfaceName))
1820 return 0;
1821
1822 len = PyBytes_GET_SIZE(interfaceName);
1823
1824 if (len == 0) {
1825 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001826 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001827 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1828 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001829 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1830 s->errorhandler();
1831 Py_DECREF(interfaceName);
1832 return 0;
1833 }
1834 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001835 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001836 "AF_CAN interface name too long");
1837 Py_DECREF(interfaceName);
1838 return 0;
1839 }
1840
1841 addr->can_family = AF_CAN;
1842 addr->can_ifindex = ifr.ifr_ifindex;
1843
1844 *len_ret = sizeof(*addr);
1845 Py_DECREF(interfaceName);
1846 return 1;
1847 }
1848 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001849 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001850 "getsockaddrarg: unsupported CAN protocol");
1851 return 0;
1852 }
1853#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001854
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001855#ifdef PF_SYSTEM
1856 case PF_SYSTEM:
1857 switch (s->sock_proto) {
1858#ifdef SYSPROTO_CONTROL
1859 case SYSPROTO_CONTROL:
1860 {
1861 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001862
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001863 addr = (struct sockaddr_ctl *)addr_ret;
1864 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001865 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001866
1867 if (PyUnicode_Check(args)) {
1868 struct ctl_info info;
1869 PyObject *ctl_name;
1870
1871 if (!PyArg_Parse(args, "O&",
1872 PyUnicode_FSConverter, &ctl_name)) {
1873 return 0;
1874 }
1875
Victor Stinnerf50e1872015-03-20 11:32:24 +01001876 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001877 PyErr_SetString(PyExc_ValueError,
1878 "provided string is too long");
1879 Py_DECREF(ctl_name);
1880 return 0;
1881 }
1882 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1883 sizeof(info.ctl_name));
1884 Py_DECREF(ctl_name);
1885
1886 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1887 PyErr_SetString(PyExc_OSError,
1888 "cannot find kernel control with provided name");
1889 return 0;
1890 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001891
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001892 addr->sc_id = info.ctl_id;
1893 addr->sc_unit = 0;
1894 } else if (!PyArg_ParseTuple(args, "II",
1895 &(addr->sc_id), &(addr->sc_unit))) {
1896 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1897 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001898
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001899 return 0;
1900 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001901
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001902 *len_ret = sizeof(*addr);
1903 return 1;
1904 }
1905#endif
1906 default:
1907 PyErr_SetString(PyExc_OSError,
1908 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1909 return 0;
1910 }
1911#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001913 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001916 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001917 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001918
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001919 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001920}
1921
Guido van Rossum30a685f1991-06-27 15:51:29 +00001922
Guido van Rossum48a680c2001-03-02 06:34:14 +00001923/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001924 Return 1 if the family is known, 0 otherwise. The length is returned
1925 through len_ret. */
1926
1927static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001928getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001929{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001930 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001931
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001932#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001933 case AF_UNIX:
1934 {
1935 *len_ret = sizeof (struct sockaddr_un);
1936 return 1;
1937 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001938#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001939#if defined(AF_NETLINK)
1940 case AF_NETLINK:
1941 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 *len_ret = sizeof (struct sockaddr_nl);
1943 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001944 }
1945#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001946
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001947#ifdef AF_RDS
1948 case AF_RDS:
1949 /* RDS sockets use sockaddr_in: fall-through */
1950#endif
1951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001952 case AF_INET:
1953 {
1954 *len_ret = sizeof (struct sockaddr_in);
1955 return 1;
1956 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001957
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001958#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001959 case AF_INET6:
1960 {
1961 *len_ret = sizeof (struct sockaddr_in6);
1962 return 1;
1963 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001964#endif
1965
Hye-Shik Chang81268602004-02-02 06:05:24 +00001966#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001967 case AF_BLUETOOTH:
1968 {
1969 switch(s->sock_proto)
1970 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001972 case BTPROTO_L2CAP:
1973 *len_ret = sizeof (struct sockaddr_l2);
1974 return 1;
1975 case BTPROTO_RFCOMM:
1976 *len_ret = sizeof (struct sockaddr_rc);
1977 return 1;
1978 case BTPROTO_HCI:
1979 *len_ret = sizeof (struct sockaddr_hci);
1980 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001981#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001982 case BTPROTO_SCO:
1983 *len_ret = sizeof (struct sockaddr_sco);
1984 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001985#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001986 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001987 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001988 "unknown BT protocol");
1989 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 }
1992 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001993#endif
1994
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001995#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001996 case AF_PACKET:
1997 {
1998 *len_ret = sizeof (struct sockaddr_ll);
1999 return 1;
2000 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002001#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002002
Christian Heimes043d6f62008-01-07 17:19:16 +00002003#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 case AF_TIPC:
2005 {
2006 *len_ret = sizeof (struct sockaddr_tipc);
2007 return 1;
2008 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002009#endif
2010
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002011#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002012 case AF_CAN:
2013 {
2014 *len_ret = sizeof (struct sockaddr_can);
2015 return 1;
2016 }
2017#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002018
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002019#ifdef PF_SYSTEM
2020 case PF_SYSTEM:
2021 switch(s->sock_proto) {
2022#ifdef SYSPROTO_CONTROL
2023 case SYSPROTO_CONTROL:
2024 *len_ret = sizeof (struct sockaddr_ctl);
2025 return 1;
2026#endif
2027 default:
2028 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2029 "unknown PF_SYSTEM protocol");
2030 return 0;
2031 }
2032#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002036 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002037 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002040 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002041}
2042
2043
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002044/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2045 Currently, these methods are only compiled if the RFC 2292/3542
2046 CMSG_LEN() macro is available. Older systems seem to have used
2047 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2048 it may be possible to define CMSG_LEN() that way if it's not
2049 provided. Some architectures might need extra padding after the
2050 cmsghdr, however, and CMSG_LEN() would have to take account of
2051 this. */
2052#ifdef CMSG_LEN
2053/* If length is in range, set *result to CMSG_LEN(length) and return
2054 true; otherwise, return false. */
2055static int
2056get_CMSG_LEN(size_t length, size_t *result)
2057{
2058 size_t tmp;
2059
2060 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2061 return 0;
2062 tmp = CMSG_LEN(length);
2063 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2064 return 0;
2065 *result = tmp;
2066 return 1;
2067}
2068
2069#ifdef CMSG_SPACE
2070/* If length is in range, set *result to CMSG_SPACE(length) and return
2071 true; otherwise, return false. */
2072static int
2073get_CMSG_SPACE(size_t length, size_t *result)
2074{
2075 size_t tmp;
2076
2077 /* Use CMSG_SPACE(1) here in order to take account of the padding
2078 necessary before *and* after the data. */
2079 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2080 return 0;
2081 tmp = CMSG_SPACE(length);
2082 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2083 return 0;
2084 *result = tmp;
2085 return 1;
2086}
2087#endif
2088
2089/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2090 pointer in msg->msg_control with at least "space" bytes after it,
2091 and its cmsg_len member inside the buffer. */
2092static int
2093cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2094{
2095 size_t cmsg_offset;
2096 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2097 sizeof(cmsgh->cmsg_len));
2098
Charles-François Natali466517d2011-08-28 18:23:43 +02002099 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002100 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002101 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002102 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2103 annoying under OS X as it's unsigned there and so it triggers a
2104 tautological comparison warning under Clang when compared against 0.
2105 Since the check is valid on other platforms, silence the warning under
2106 Clang. */
2107 #ifdef __clang__
2108 #pragma clang diagnostic push
2109 #pragma clang diagnostic ignored "-Wtautological-compare"
2110 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002111 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002112 #pragma GCC diagnostic push
2113 #pragma GCC diagnostic ignored "-Wtype-limits"
2114 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002115 if (msg->msg_controllen < 0)
2116 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002117 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002118 #pragma GCC diagnostic pop
2119 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002120 #ifdef __clang__
2121 #pragma clang diagnostic pop
2122 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002123 if (space < cmsg_len_end)
2124 space = cmsg_len_end;
2125 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2126 return (cmsg_offset <= (size_t)-1 - space &&
2127 cmsg_offset + space <= msg->msg_controllen);
2128}
2129
2130/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2131 *space to number of bytes following it in the buffer and return
2132 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2133 msg->msg_controllen are valid. */
2134static int
2135get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2136{
2137 size_t data_offset;
2138 char *data_ptr;
2139
2140 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2141 return 0;
2142 data_offset = data_ptr - (char *)msg->msg_control;
2143 if (data_offset > msg->msg_controllen)
2144 return 0;
2145 *space = msg->msg_controllen - data_offset;
2146 return 1;
2147}
2148
2149/* If cmsgh is invalid or not contained in the buffer pointed to by
2150 msg->msg_control, return -1. If cmsgh is valid and its associated
2151 data is entirely contained in the buffer, set *data_len to the
2152 length of the associated data and return 0. If only part of the
2153 associated data is contained in the buffer but cmsgh is otherwise
2154 valid, set *data_len to the length contained in the buffer and
2155 return 1. */
2156static int
2157get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2158{
2159 size_t space, cmsg_data_len;
2160
2161 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2162 cmsgh->cmsg_len < CMSG_LEN(0))
2163 return -1;
2164 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2165 if (!get_cmsg_data_space(msg, cmsgh, &space))
2166 return -1;
2167 if (space >= cmsg_data_len) {
2168 *data_len = cmsg_data_len;
2169 return 0;
2170 }
2171 *data_len = space;
2172 return 1;
2173}
2174#endif /* CMSG_LEN */
2175
2176
Victor Stinner31bf2d52015-04-01 21:57:09 +02002177struct sock_accept {
2178 socklen_t *addrlen;
2179 sock_addr_t *addrbuf;
2180 SOCKET_T result;
2181};
2182
2183#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2184/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2185static int accept4_works = -1;
2186#endif
2187
2188static int
2189sock_accept_impl(PySocketSockObject *s, void *data)
2190{
2191 struct sock_accept *ctx = data;
2192
2193#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2194 if (accept4_works != 0) {
2195 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2196 SOCK_CLOEXEC);
2197 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2198 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2199 accept4_works = (errno != ENOSYS);
2200 }
2201 }
2202 if (accept4_works == 0)
2203 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2204#else
2205 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2206#endif
2207 return (ctx->result >= 0);
2208}
2209
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002210/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002211
Guido van Rossum73624e91994-10-10 17:59:00 +00002212static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002213sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002215 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002216 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002217 socklen_t addrlen;
2218 PyObject *sock = NULL;
2219 PyObject *addr = NULL;
2220 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002221 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002222
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002223 if (!getsockaddrlen(s, &addrlen))
2224 return NULL;
2225 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002227 if (!IS_SELECTABLE(s))
2228 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002229
Victor Stinner31bf2d52015-04-01 21:57:09 +02002230 ctx.addrlen = &addrlen;
2231 ctx.addrbuf = &addrbuf;
2232 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002234 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002235
Victor Stinnerdaf45552013-08-28 00:53:59 +02002236#ifdef MS_WINDOWS
2237 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2238 PyErr_SetFromWindowsErr(0);
2239 SOCKETCLOSE(newfd);
2240 goto finally;
2241 }
2242#else
2243
2244#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2245 if (!accept4_works)
2246#endif
2247 {
2248 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2249 SOCKETCLOSE(newfd);
2250 goto finally;
2251 }
2252 }
2253#endif
2254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002255 sock = PyLong_FromSocket_t(newfd);
2256 if (sock == NULL) {
2257 SOCKETCLOSE(newfd);
2258 goto finally;
2259 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002261 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2262 addrlen, s->sock_proto);
2263 if (addr == NULL)
2264 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002266 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002267
Guido van Rossum67f7a382002-06-06 21:08:16 +00002268finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 Py_XDECREF(sock);
2270 Py_XDECREF(addr);
2271 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002272}
2273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002274PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002275"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002276\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002277Wait for an incoming connection. Return a new socket file descriptor\n\
2278representing the connection, and the address of the client.\n\
2279For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002280
Guido van Rossum11ba0942002-06-13 15:07:44 +00002281/* s.setblocking(flag) method. Argument:
2282 False -- non-blocking mode; same as settimeout(0)
2283 True -- blocking mode; same as settimeout(None)
2284*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002285
Guido van Rossum73624e91994-10-10 17:59:00 +00002286static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002287sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002288{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002289 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 block = PyLong_AsLong(arg);
2292 if (block == -1 && PyErr_Occurred())
2293 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002294
Victor Stinner9001d802015-04-06 23:06:01 +02002295 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002296 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 Py_INCREF(Py_None);
2299 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002300}
Guido van Rossume4485b01994-09-07 14:32:49 +00002301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002302PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002303"setblocking(flag)\n\
2304\n\
2305Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002306setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002307setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002308
Victor Stinner71694d52015-03-28 01:18:54 +01002309static int
2310socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2311{
2312#ifdef MS_WINDOWS
2313 struct timeval tv;
2314#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002315#ifndef HAVE_POLL
2316 _PyTime_t ms;
2317#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002318 int overflow = 0;
2319
2320 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002321 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002322 return 0;
2323 }
2324
Victor Stinner869e1772015-03-30 03:49:14 +02002325 if (_PyTime_FromSecondsObject(timeout,
2326 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002327 return -1;
2328
2329 if (*timeout < 0) {
2330 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2331 return -1;
2332 }
2333
2334#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002335 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002336#endif
2337#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002338 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2339 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002340#endif
2341 if (overflow) {
2342 PyErr_SetString(PyExc_OverflowError,
2343 "timeout doesn't fit into C timeval");
2344 return -1;
2345 }
2346
2347 return 0;
2348}
2349
Guido van Rossum11ba0942002-06-13 15:07:44 +00002350/* s.settimeout(timeout) method. Argument:
2351 None -- no timeout, blocking mode; same as setblocking(True)
2352 0.0 -- non-blocking mode; same as setblocking(False)
2353 > 0 -- timeout mode; operations time out after timeout seconds
2354 < 0 -- illegal; raises an exception
2355*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002356static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002357sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002358{
Victor Stinner71694d52015-03-28 01:18:54 +01002359 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002360
Victor Stinner71694d52015-03-28 01:18:54 +01002361 if (socket_parse_timeout(&timeout, arg) < 0)
2362 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002365 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002367 Py_INCREF(Py_None);
2368 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002369}
2370
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002371PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002372"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002373\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002374Set a timeout on socket operations. 'timeout' can be a float,\n\
2375giving in seconds, or None. Setting a timeout of None disables\n\
2376the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002377Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002378
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002379/* s.gettimeout() method.
2380 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002381static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002382sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002383{
Victor Stinner71694d52015-03-28 01:18:54 +01002384 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002385 Py_INCREF(Py_None);
2386 return Py_None;
2387 }
Victor Stinner71694d52015-03-28 01:18:54 +01002388 else {
2389 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2390 return PyFloat_FromDouble(seconds);
2391 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002392}
2393
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002394PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002395"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002396\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002397Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002398operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002399operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002400
Guido van Rossumaee08791992-09-08 09:05:33 +00002401/* s.setsockopt() method.
2402 With an integer third argument, sets an integer option.
2403 With a string third argument, sets an option from a buffer;
2404 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002405
Guido van Rossum73624e91994-10-10 17:59:00 +00002406static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002407sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002408{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002409 int level;
2410 int optname;
2411 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002412 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002415 if (PyArg_ParseTuple(args, "iii:setsockopt",
2416 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002417 res = setsockopt(s->sock_fd, level, optname,
2418 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 }
2420 else {
2421 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002422 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2423 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002424 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002425 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2426 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002428 if (res < 0)
2429 return s->errorhandler();
2430 Py_INCREF(Py_None);
2431 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002432}
2433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002434PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002435"setsockopt(level, option, value)\n\
2436\n\
2437Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002438The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002439
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002440
Guido van Rossumaee08791992-09-08 09:05:33 +00002441/* s.getsockopt() method.
2442 With two arguments, retrieves an integer option.
2443 With a third integer argument, retrieves a string buffer of that size;
2444 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002445
Guido van Rossum73624e91994-10-10 17:59:00 +00002446static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002447sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002448{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002449 int level;
2450 int optname;
2451 int res;
2452 PyObject *buf;
2453 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2456 &level, &optname, &buflen))
2457 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002459 if (buflen == 0) {
2460 int flag = 0;
2461 socklen_t flagsize = sizeof flag;
2462 res = getsockopt(s->sock_fd, level, optname,
2463 (void *)&flag, &flagsize);
2464 if (res < 0)
2465 return s->errorhandler();
2466 return PyLong_FromLong(flag);
2467 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002468 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002469 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002470 "getsockopt buflen out of range");
2471 return NULL;
2472 }
2473 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2474 if (buf == NULL)
2475 return NULL;
2476 res = getsockopt(s->sock_fd, level, optname,
2477 (void *)PyBytes_AS_STRING(buf), &buflen);
2478 if (res < 0) {
2479 Py_DECREF(buf);
2480 return s->errorhandler();
2481 }
2482 _PyBytes_Resize(&buf, buflen);
2483 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002484}
2485
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002486PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002487"getsockopt(level, option[, buffersize]) -> value\n\
2488\n\
2489Get a socket option. See the Unix manual for level and option.\n\
2490If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002491string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002492
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002493
Fred Drake728819a2000-07-01 03:40:12 +00002494/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002495
Guido van Rossum73624e91994-10-10 17:59:00 +00002496static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002497sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002498{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002499 sock_addr_t addrbuf;
2500 int addrlen;
2501 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2504 return NULL;
2505 Py_BEGIN_ALLOW_THREADS
2506 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2507 Py_END_ALLOW_THREADS
2508 if (res < 0)
2509 return s->errorhandler();
2510 Py_INCREF(Py_None);
2511 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002512}
2513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002514PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002515"bind(address)\n\
2516\n\
2517Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002518pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002519sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002520
Guido van Rossum30a685f1991-06-27 15:51:29 +00002521
2522/* s.close() method.
2523 Set the file descriptor to -1 so operations tried subsequently
2524 will surely fail. */
2525
Guido van Rossum73624e91994-10-10 17:59:00 +00002526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002527sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002530
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002531 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2532 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2533 * for more details.
2534 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 if ((fd = s->sock_fd) != -1) {
2536 s->sock_fd = -1;
2537 Py_BEGIN_ALLOW_THREADS
2538 (void) SOCKETCLOSE(fd);
2539 Py_END_ALLOW_THREADS
2540 }
2541 Py_INCREF(Py_None);
2542 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002543}
2544
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002545PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002546"close()\n\
2547\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002548Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002549
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002550static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002551sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002552{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002553 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002554 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002555 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002556}
2557
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002558PyDoc_STRVAR(detach_doc,
2559"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002560\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002561Close the socket object without closing the underlying file descriptor.\n\
2562The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002563can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002564
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002565static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002566sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002567{
Victor Stinner81c41db2015-04-02 11:50:57 +02002568 int err;
2569 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002570
Victor Stinner81c41db2015-04-02 11:50:57 +02002571 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2572 /* getsockopt() failed */
2573 return 0;
2574 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002575
Victor Stinner81c41db2015-04-02 11:50:57 +02002576 if (err == EISCONN)
2577 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002578 if (err != 0) {
2579 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2580 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002581 return 0;
2582 }
2583 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002584}
2585
2586static int
2587internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2588 int raise)
2589{
2590 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002591
2592 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002593 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002594 Py_END_ALLOW_THREADS
2595
Victor Stinner70a46f62015-03-31 22:03:59 +02002596 if (!res) {
2597 /* connect() succeeded, the socket is connected */
2598 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002600
Victor Stinner81c41db2015-04-02 11:50:57 +02002601 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002602
Victor Stinner81c41db2015-04-02 11:50:57 +02002603 /* save error, PyErr_CheckSignals() can replace it */
2604 err = GET_SOCK_ERROR;
2605 if (CHECK_ERRNO(EINTR)) {
2606 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002607 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002608
2609 /* Issue #23618: when connect() fails with EINTR, the connection is
2610 running asynchronously.
2611
2612 If the socket is blocking or has a timeout, wait until the
2613 connection completes, fails or timed out using select(), and then
2614 get the connection status using getsockopt(SO_ERROR).
2615
2616 If the socket is non-blocking, raise InterruptedError. The caller is
2617 responsible to wait until the connection completes, fails or timed
2618 out (it's the case in asyncio for example). */
2619 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2620 }
2621 else {
2622 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2623 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002624 }
2625
Victor Stinner81c41db2015-04-02 11:50:57 +02002626 if (!wait_connect) {
2627 if (raise) {
2628 /* restore error, maybe replaced by PyErr_CheckSignals() */
2629 SET_SOCK_ERROR(err);
2630 s->errorhandler();
2631 return -1;
2632 }
2633 else
2634 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002635 }
2636
Victor Stinner81c41db2015-04-02 11:50:57 +02002637 if (raise) {
2638 /* socket.connect() raises an exception on error */
2639 if (sock_call_ex(s, 1, sock_connect_impl, NULL, 1, NULL) < 0)
2640 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002641 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002642 else {
2643 /* socket.connect_ex() returns the error code on error */
2644 if (sock_call_ex(s, 1, sock_connect_impl, NULL, 1, &err) < 0)
2645 return err;
2646 }
2647 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002648}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002649
Fred Drake728819a2000-07-01 03:40:12 +00002650/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002651
Guido van Rossum73624e91994-10-10 17:59:00 +00002652static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002653sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002655 sock_addr_t addrbuf;
2656 int addrlen;
2657 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002659 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2660 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002661
Victor Stinner81c41db2015-04-02 11:50:57 +02002662 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002663 if (res < 0)
2664 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002665
Victor Stinneree699e92015-03-31 21:28:42 +02002666 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002667}
2668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002669PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002670"connect(address)\n\
2671\n\
2672Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002673is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002674
Guido van Rossum30a685f1991-06-27 15:51:29 +00002675
Fred Drake728819a2000-07-01 03:40:12 +00002676/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002677
2678static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002679sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002680{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 sock_addr_t addrbuf;
2682 int addrlen;
2683 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002685 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2686 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002687
Victor Stinner81c41db2015-04-02 11:50:57 +02002688 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002689 if (res < 0)
2690 return NULL;
2691
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002692 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002693}
2694
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002695PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002696"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002697\n\
2698This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002699instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002700
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002701
Guido van Rossumed233a51992-06-23 09:07:03 +00002702/* s.fileno() method */
2703
Guido van Rossum73624e91994-10-10 17:59:00 +00002704static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002705sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002706{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002708}
2709
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002711"fileno() -> integer\n\
2712\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002713Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002714
Guido van Rossumed233a51992-06-23 09:07:03 +00002715
Guido van Rossumc89705d1992-11-26 08:54:07 +00002716/* s.getsockname() method */
2717
Guido van Rossum73624e91994-10-10 17:59:00 +00002718static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002719sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002720{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002721 sock_addr_t addrbuf;
2722 int res;
2723 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002724
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002725 if (!getsockaddrlen(s, &addrlen))
2726 return NULL;
2727 memset(&addrbuf, 0, addrlen);
2728 Py_BEGIN_ALLOW_THREADS
2729 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2730 Py_END_ALLOW_THREADS
2731 if (res < 0)
2732 return s->errorhandler();
2733 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2734 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002735}
2736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002737PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002738"getsockname() -> address info\n\
2739\n\
2740Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002741info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002742
Guido van Rossumc89705d1992-11-26 08:54:07 +00002743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002745/* s.getpeername() method */
2746
Guido van Rossum73624e91994-10-10 17:59:00 +00002747static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002748sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002750 sock_addr_t addrbuf;
2751 int res;
2752 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002754 if (!getsockaddrlen(s, &addrlen))
2755 return NULL;
2756 memset(&addrbuf, 0, addrlen);
2757 Py_BEGIN_ALLOW_THREADS
2758 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2759 Py_END_ALLOW_THREADS
2760 if (res < 0)
2761 return s->errorhandler();
2762 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2763 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002764}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002766PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002767"getpeername() -> address info\n\
2768\n\
2769Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002770info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002771
Guido van Rossumb6775db1994-08-01 11:34:53 +00002772#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002773
2774
Guido van Rossum30a685f1991-06-27 15:51:29 +00002775/* s.listen(n) method */
2776
Guido van Rossum73624e91994-10-10 17:59:00 +00002777static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002778sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002779{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002780 /* We try to choose a default backlog high enough to avoid connection drops
2781 * for common workloads, yet not too high to limit resource usage. */
2782 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002784
Charles-François Natali644b8f52014-05-22 19:45:39 +01002785 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002789 /* To avoid problems on systems that don't allow a negative backlog
2790 * (which doesn't make sense anyway) we force a minimum value of 0. */
2791 if (backlog < 0)
2792 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 res = listen(s->sock_fd, backlog);
2794 Py_END_ALLOW_THREADS
2795 if (res < 0)
2796 return s->errorhandler();
2797 Py_INCREF(Py_None);
2798 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002799}
2800
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002801PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002802"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002803\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002804Enable a server to accept connections. If backlog is specified, it must be\n\
2805at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002806unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002807connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002808
Victor Stinner31bf2d52015-04-01 21:57:09 +02002809struct sock_recv {
2810 char *cbuf;
2811 Py_ssize_t len;
2812 int flags;
2813 Py_ssize_t result;
2814};
2815
2816static int
2817sock_recv_impl(PySocketSockObject *s, void *data)
2818{
2819 struct sock_recv *ctx = data;
2820
2821#ifdef MS_WINDOWS
2822 if (ctx->len > INT_MAX)
2823 ctx->len = INT_MAX;
2824 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2825#else
2826 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2827#endif
2828 return (ctx->result >= 0);
2829}
2830
Guido van Rossum82a5c661998-07-07 20:45:43 +00002831
Thomas Wouters477c8d52006-05-27 19:21:47 +00002832/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002833 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002834 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002835 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002836 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002837 * also possible that we return a number of bytes smaller than the request
2838 * bytes.
2839 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002840
Antoine Pitrou19467d22010-08-17 19:33:30 +00002841static Py_ssize_t
2842sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002843{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002844 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 if (!IS_SELECTABLE(s)) {
2847 select_error();
2848 return -1;
2849 }
2850 if (len == 0) {
2851 /* If 0 bytes were requested, do nothing. */
2852 return 0;
2853 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002854
Victor Stinner31bf2d52015-04-01 21:57:09 +02002855 ctx.cbuf = cbuf;
2856 ctx.len = len;
2857 ctx.flags = flags;
2858 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002860
2861 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002862}
2863
Guido van Rossum48a680c2001-03-02 06:34:14 +00002864
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002865/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002866
Guido van Rossum73624e91994-10-10 17:59:00 +00002867static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002868sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002869{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002870 Py_ssize_t recvlen, outlen;
2871 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002872 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002873
Antoine Pitrou19467d22010-08-17 19:33:30 +00002874 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002877 if (recvlen < 0) {
2878 PyErr_SetString(PyExc_ValueError,
2879 "negative buffersize in recv");
2880 return NULL;
2881 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002882
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002883 /* Allocate a new string. */
2884 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2885 if (buf == NULL)
2886 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002887
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 /* Call the guts */
2889 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2890 if (outlen < 0) {
2891 /* An error occurred, release the string and return an
2892 error. */
2893 Py_DECREF(buf);
2894 return NULL;
2895 }
2896 if (outlen != recvlen) {
2897 /* We did not read as many bytes as we anticipated, resize the
2898 string if possible and be successful. */
2899 _PyBytes_Resize(&buf, outlen);
2900 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002903}
2904
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002905PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002906"recv(buffersize[, flags]) -> data\n\
2907\n\
2908Receive up to buffersize bytes from the socket. For the optional flags\n\
2909argument, see the Unix manual. When no data is available, block until\n\
2910at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002911the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002912
Guido van Rossum30a685f1991-06-27 15:51:29 +00002913
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002914/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002915
Thomas Wouters477c8d52006-05-27 19:21:47 +00002916static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002917sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002918{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002919 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002920
Antoine Pitrou19467d22010-08-17 19:33:30 +00002921 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 Py_buffer pbuf;
2923 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002924 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002926 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002927 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002928 &pbuf, &recvlen, &flags))
2929 return NULL;
2930 buf = pbuf.buf;
2931 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002932
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002933 if (recvlen < 0) {
2934 PyBuffer_Release(&pbuf);
2935 PyErr_SetString(PyExc_ValueError,
2936 "negative buffersize in recv_into");
2937 return NULL;
2938 }
2939 if (recvlen == 0) {
2940 /* If nbytes was not specified, use the buffer's length */
2941 recvlen = buflen;
2942 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 /* Check if the buffer is large enough */
2945 if (buflen < recvlen) {
2946 PyBuffer_Release(&pbuf);
2947 PyErr_SetString(PyExc_ValueError,
2948 "buffer too small for requested bytes");
2949 return NULL;
2950 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002951
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002952 /* Call the guts */
2953 readlen = sock_recv_guts(s, buf, recvlen, flags);
2954 if (readlen < 0) {
2955 /* Return an error. */
2956 PyBuffer_Release(&pbuf);
2957 return NULL;
2958 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 PyBuffer_Release(&pbuf);
2961 /* Return the number of bytes read. Note that we do not do anything
2962 special here in the case that readlen < recvlen. */
2963 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002964}
2965
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002966PyDoc_STRVAR(recv_into_doc,
2967"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002968\n\
2969A version of recv() that stores its data into a buffer rather than creating \n\
2970a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2971is not specified (or 0), receive up to the size available in the given buffer.\n\
2972\n\
2973See recv() for documentation about the flags.");
2974
Victor Stinner31bf2d52015-04-01 21:57:09 +02002975struct sock_recvfrom {
2976 char* cbuf;
2977 Py_ssize_t len;
2978 int flags;
2979 socklen_t *addrlen;
2980 sock_addr_t *addrbuf;
2981 Py_ssize_t result;
2982};
2983
2984static int
2985sock_recvfrom_impl(PySocketSockObject *s, void *data)
2986{
2987 struct sock_recvfrom *ctx = data;
2988
2989 memset(ctx->addrbuf, 0, *ctx->addrlen);
2990
2991#ifdef MS_WINDOWS
2992 if (ctx->len > INT_MAX)
2993 ctx->len = INT_MAX;
2994 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
2995 SAS2SA(ctx->addrbuf), ctx->addrlen);
2996#else
2997 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
2998 SAS2SA(ctx->addrbuf), ctx->addrlen);
2999#endif
3000 return (ctx->result >= 0);
3001}
3002
Thomas Wouters477c8d52006-05-27 19:21:47 +00003003
3004/*
Christian Heimes99170a52007-12-19 02:07:34 +00003005 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3006 * into a char buffer. If you have any inc/def ref to do to the objects that
3007 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003008 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003009 * that it is also possible that we return a number of bytes smaller than the
3010 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003011 *
3012 * 'addr' is a return value for the address object. Note that you must decref
3013 * it yourself.
3014 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003015static Py_ssize_t
3016sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003019 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003020 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003021 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 if (!getsockaddrlen(s, &addrlen))
3026 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 if (!IS_SELECTABLE(s)) {
3029 select_error();
3030 return -1;
3031 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003032
Victor Stinner31bf2d52015-04-01 21:57:09 +02003033 ctx.cbuf = cbuf;
3034 ctx.len = len;
3035 ctx.flags = flags;
3036 ctx.addrbuf = &addrbuf;
3037 ctx.addrlen = &addrlen;
3038 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003040
Victor Stinner31bf2d52015-04-01 21:57:09 +02003041 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3042 s->sock_proto);
3043 if (*addr == NULL)
3044 return -1;
3045
3046 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003047}
3048
3049/* s.recvfrom(nbytes [,flags]) method */
3050
3051static PyObject *
3052sock_recvfrom(PySocketSockObject *s, PyObject *args)
3053{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003054 PyObject *buf = NULL;
3055 PyObject *addr = NULL;
3056 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003057 int flags = 0;
3058 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003059
Antoine Pitrou19467d22010-08-17 19:33:30 +00003060 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003063 if (recvlen < 0) {
3064 PyErr_SetString(PyExc_ValueError,
3065 "negative buffersize in recvfrom");
3066 return NULL;
3067 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003069 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3070 if (buf == NULL)
3071 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003073 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3074 recvlen, flags, &addr);
3075 if (outlen < 0) {
3076 goto finally;
3077 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 if (outlen != recvlen) {
3080 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003081 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003082 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003083 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003084 goto finally;
3085 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003087 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003088
3089finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 Py_XDECREF(buf);
3091 Py_XDECREF(addr);
3092 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003093}
3094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003095PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003096"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3097\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003098Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003099
Thomas Wouters477c8d52006-05-27 19:21:47 +00003100
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003101/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003102
3103static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003104sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003107
Antoine Pitrou19467d22010-08-17 19:33:30 +00003108 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003109 Py_buffer pbuf;
3110 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003111 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003112
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003113 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003114
Antoine Pitrou19467d22010-08-17 19:33:30 +00003115 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003116 kwlist, &pbuf,
3117 &recvlen, &flags))
3118 return NULL;
3119 buf = pbuf.buf;
3120 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 if (recvlen < 0) {
3123 PyBuffer_Release(&pbuf);
3124 PyErr_SetString(PyExc_ValueError,
3125 "negative buffersize in recvfrom_into");
3126 return NULL;
3127 }
3128 if (recvlen == 0) {
3129 /* If nbytes was not specified, use the buffer's length */
3130 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003131 } else if (recvlen > buflen) {
3132 PyBuffer_Release(&pbuf);
3133 PyErr_SetString(PyExc_ValueError,
3134 "nbytes is greater than the length of the buffer");
3135 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003136 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3139 if (readlen < 0) {
3140 PyBuffer_Release(&pbuf);
3141 /* Return an error */
3142 Py_XDECREF(addr);
3143 return NULL;
3144 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003146 PyBuffer_Release(&pbuf);
3147 /* Return the number of bytes read and the address. Note that we do
3148 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003149 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003150}
3151
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003152PyDoc_STRVAR(recvfrom_into_doc,
3153"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003154\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003155Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003156
Victor Stinner35bee932015-04-02 12:28:07 +02003157/* The sendmsg() and recvmsg[_into]() methods require a working
3158 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3159#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003160struct sock_recvmsg {
3161 struct msghdr *msg;
3162 int flags;
3163 ssize_t result;
3164};
3165
3166static int
3167sock_recvmsg_impl(PySocketSockObject *s, void *data)
3168{
3169 struct sock_recvmsg *ctx = data;
3170
3171 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3172 return (ctx->result >= 0);
3173}
3174
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003175/*
3176 * Call recvmsg() with the supplied iovec structures, flags, and
3177 * ancillary data buffer size (controllen). Returns the tuple return
3178 * value for recvmsg() or recvmsg_into(), with the first item provided
3179 * by the supplied makeval() function. makeval() will be called with
3180 * the length read and makeval_data as arguments, and must return a
3181 * new reference (which will be decrefed if there is a subsequent
3182 * error). On error, closes any file descriptors received via
3183 * SCM_RIGHTS.
3184 */
3185static PyObject *
3186sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3187 int flags, Py_ssize_t controllen,
3188 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3189{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003190 sock_addr_t addrbuf;
3191 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003192 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003193 PyObject *cmsg_list = NULL, *retval = NULL;
3194 void *controlbuf = NULL;
3195 struct cmsghdr *cmsgh;
3196 size_t cmsgdatalen = 0;
3197 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003198 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003199
3200 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3201 ignored" when the socket is connected (Linux fills them in
3202 anyway for AF_UNIX sockets at least). Normally msg_namelen
3203 seems to be set to 0 if there's no address, but try to
3204 initialize msg_name to something that won't be mistaken for a
3205 real address if that doesn't happen. */
3206 if (!getsockaddrlen(s, &addrbuflen))
3207 return NULL;
3208 memset(&addrbuf, 0, addrbuflen);
3209 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3210
3211 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3212 PyErr_SetString(PyExc_ValueError,
3213 "invalid ancillary data buffer length");
3214 return NULL;
3215 }
3216 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3217 return PyErr_NoMemory();
3218
3219 /* Make the system call. */
3220 if (!IS_SELECTABLE(s)) {
3221 select_error();
3222 goto finally;
3223 }
3224
Victor Stinner31bf2d52015-04-01 21:57:09 +02003225 msg.msg_name = SAS2SA(&addrbuf);
3226 msg.msg_namelen = addrbuflen;
3227 msg.msg_iov = iov;
3228 msg.msg_iovlen = iovlen;
3229 msg.msg_control = controlbuf;
3230 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003231
Victor Stinner31bf2d52015-04-01 21:57:09 +02003232 ctx.msg = &msg;
3233 ctx.flags = flags;
3234 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003235 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003236
3237 /* Make list of (level, type, data) tuples from control messages. */
3238 if ((cmsg_list = PyList_New(0)) == NULL)
3239 goto err_closefds;
3240 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3241 implementations didn't do so. */
3242 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3243 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3244 PyObject *bytes, *tuple;
3245 int tmp;
3246
3247 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3248 if (cmsg_status != 0) {
3249 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3250 "received malformed or improperly-truncated "
3251 "ancillary data", 1) == -1)
3252 goto err_closefds;
3253 }
3254 if (cmsg_status < 0)
3255 break;
3256 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003257 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003258 goto err_closefds;
3259 }
3260
3261 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3262 cmsgdatalen);
3263 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3264 (int)cmsgh->cmsg_type, bytes);
3265 if (tuple == NULL)
3266 goto err_closefds;
3267 tmp = PyList_Append(cmsg_list, tuple);
3268 Py_DECREF(tuple);
3269 if (tmp != 0)
3270 goto err_closefds;
3271
3272 if (cmsg_status != 0)
3273 break;
3274 }
3275
3276 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003277 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003278 cmsg_list,
3279 (int)msg.msg_flags,
3280 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3281 ((msg.msg_namelen > addrbuflen) ?
3282 addrbuflen : msg.msg_namelen),
3283 s->sock_proto));
3284 if (retval == NULL)
3285 goto err_closefds;
3286
3287finally:
3288 Py_XDECREF(cmsg_list);
3289 PyMem_Free(controlbuf);
3290 return retval;
3291
3292err_closefds:
3293#ifdef SCM_RIGHTS
3294 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3295 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3296 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3297 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3298 if (cmsg_status < 0)
3299 break;
3300 if (cmsgh->cmsg_level == SOL_SOCKET &&
3301 cmsgh->cmsg_type == SCM_RIGHTS) {
3302 size_t numfds;
3303 int *fdp;
3304
3305 numfds = cmsgdatalen / sizeof(int);
3306 fdp = (int *)CMSG_DATA(cmsgh);
3307 while (numfds-- > 0)
3308 close(*fdp++);
3309 }
3310 if (cmsg_status != 0)
3311 break;
3312 }
3313#endif /* SCM_RIGHTS */
3314 goto finally;
3315}
3316
3317
3318static PyObject *
3319makeval_recvmsg(ssize_t received, void *data)
3320{
3321 PyObject **buf = data;
3322
3323 if (received < PyBytes_GET_SIZE(*buf))
3324 _PyBytes_Resize(buf, received);
3325 Py_XINCREF(*buf);
3326 return *buf;
3327}
3328
3329/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3330
3331static PyObject *
3332sock_recvmsg(PySocketSockObject *s, PyObject *args)
3333{
3334 Py_ssize_t bufsize, ancbufsize = 0;
3335 int flags = 0;
3336 struct iovec iov;
3337 PyObject *buf = NULL, *retval = NULL;
3338
3339 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3340 return NULL;
3341
3342 if (bufsize < 0) {
3343 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3344 return NULL;
3345 }
3346 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3347 return NULL;
3348 iov.iov_base = PyBytes_AS_STRING(buf);
3349 iov.iov_len = bufsize;
3350
3351 /* Note that we're passing a pointer to *our pointer* to the bytes
3352 object here (&buf); makeval_recvmsg() may incref the object, or
3353 deallocate it and set our pointer to NULL. */
3354 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3355 &makeval_recvmsg, &buf);
3356 Py_XDECREF(buf);
3357 return retval;
3358}
3359
3360PyDoc_STRVAR(recvmsg_doc,
3361"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3362\n\
3363Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3364socket. The ancbufsize argument sets the size in bytes of the\n\
3365internal buffer used to receive the ancillary data; it defaults to 0,\n\
3366meaning that no ancillary data will be received. Appropriate buffer\n\
3367sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3368CMSG_LEN(), and items which do not fit into the buffer might be\n\
3369truncated or discarded. The flags argument defaults to 0 and has the\n\
3370same meaning as for recv().\n\
3371\n\
3372The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3373The data item is a bytes object holding the non-ancillary data\n\
3374received. The ancdata item is a list of zero or more tuples\n\
3375(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3376(control messages) received: cmsg_level and cmsg_type are integers\n\
3377specifying the protocol level and protocol-specific type respectively,\n\
3378and cmsg_data is a bytes object holding the associated data. The\n\
3379msg_flags item is the bitwise OR of various flags indicating\n\
3380conditions on the received message; see your system documentation for\n\
3381details. If the receiving socket is unconnected, address is the\n\
3382address of the sending socket, if available; otherwise, its value is\n\
3383unspecified.\n\
3384\n\
3385If recvmsg() raises an exception after the system call returns, it\n\
3386will first attempt to close any file descriptors received via the\n\
3387SCM_RIGHTS mechanism.");
3388
3389
3390static PyObject *
3391makeval_recvmsg_into(ssize_t received, void *data)
3392{
3393 return PyLong_FromSsize_t(received);
3394}
3395
3396/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3397
3398static PyObject *
3399sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3400{
3401 Py_ssize_t ancbufsize = 0;
3402 int flags = 0;
3403 struct iovec *iovs = NULL;
3404 Py_ssize_t i, nitems, nbufs = 0;
3405 Py_buffer *bufs = NULL;
3406 PyObject *buffers_arg, *fast, *retval = NULL;
3407
3408 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3409 &buffers_arg, &ancbufsize, &flags))
3410 return NULL;
3411
3412 if ((fast = PySequence_Fast(buffers_arg,
3413 "recvmsg_into() argument 1 must be an "
3414 "iterable")) == NULL)
3415 return NULL;
3416 nitems = PySequence_Fast_GET_SIZE(fast);
3417 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003418 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003419 goto finally;
3420 }
3421
3422 /* Fill in an iovec for each item, and save the Py_buffer
3423 structs to release afterwards. */
3424 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3425 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3426 PyErr_NoMemory();
3427 goto finally;
3428 }
3429 for (; nbufs < nitems; nbufs++) {
3430 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3431 "w*;recvmsg_into() argument 1 must be an iterable "
3432 "of single-segment read-write buffers",
3433 &bufs[nbufs]))
3434 goto finally;
3435 iovs[nbufs].iov_base = bufs[nbufs].buf;
3436 iovs[nbufs].iov_len = bufs[nbufs].len;
3437 }
3438
3439 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3440 &makeval_recvmsg_into, NULL);
3441finally:
3442 for (i = 0; i < nbufs; i++)
3443 PyBuffer_Release(&bufs[i]);
3444 PyMem_Free(bufs);
3445 PyMem_Free(iovs);
3446 Py_DECREF(fast);
3447 return retval;
3448}
3449
3450PyDoc_STRVAR(recvmsg_into_doc,
3451"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3452\n\
3453Receive normal data and ancillary data from the socket, scattering the\n\
3454non-ancillary data into a series of buffers. The buffers argument\n\
3455must be an iterable of objects that export writable buffers\n\
3456(e.g. bytearray objects); these will be filled with successive chunks\n\
3457of the non-ancillary data until it has all been written or there are\n\
3458no more buffers. The ancbufsize argument sets the size in bytes of\n\
3459the internal buffer used to receive the ancillary data; it defaults to\n\
34600, meaning that no ancillary data will be received. Appropriate\n\
3461buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3462or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3463truncated or discarded. The flags argument defaults to 0 and has the\n\
3464same meaning as for recv().\n\
3465\n\
3466The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3467The nbytes item is the total number of bytes of non-ancillary data\n\
3468written into the buffers. The ancdata item is a list of zero or more\n\
3469tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3470data (control messages) received: cmsg_level and cmsg_type are\n\
3471integers specifying the protocol level and protocol-specific type\n\
3472respectively, and cmsg_data is a bytes object holding the associated\n\
3473data. The msg_flags item is the bitwise OR of various flags\n\
3474indicating conditions on the received message; see your system\n\
3475documentation for details. If the receiving socket is unconnected,\n\
3476address is the address of the sending socket, if available; otherwise,\n\
3477its value is unspecified.\n\
3478\n\
3479If recvmsg_into() raises an exception after the system call returns,\n\
3480it will first attempt to close any file descriptors received via the\n\
3481SCM_RIGHTS mechanism.");
3482#endif /* CMSG_LEN */
3483
3484
Victor Stinner31bf2d52015-04-01 21:57:09 +02003485struct sock_send {
3486 char *buf;
3487 Py_ssize_t len;
3488 int flags;
3489 Py_ssize_t result;
3490};
3491
3492static int
3493sock_send_impl(PySocketSockObject *s, void *data)
3494{
3495 struct sock_send *ctx = data;
3496
3497#ifdef MS_WINDOWS
3498 if (ctx->len > INT_MAX)
3499 ctx->len = INT_MAX;
3500 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3501#else
3502 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3503#endif
3504 return (ctx->result >= 0);
3505}
3506
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003507/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003508
Guido van Rossum73624e91994-10-10 17:59:00 +00003509static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003510sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003511{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003512 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003514 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3517 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003518
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003519 if (!IS_SELECTABLE(s)) {
3520 PyBuffer_Release(&pbuf);
3521 return select_error();
3522 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003523 ctx.buf = pbuf.buf;
3524 ctx.len = pbuf.len;
3525 ctx.flags = flags;
3526 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003527 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 return NULL;
3529 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003530 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003531
3532 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003533}
3534
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003535PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003536"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003537\n\
3538Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003539argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003540sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003541
3542
3543/* s.sendall(data [,flags]) method */
3544
3545static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003546sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003549 Py_ssize_t len, n;
3550 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003552 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3555 return NULL;
3556 buf = pbuf.buf;
3557 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003559 if (!IS_SELECTABLE(s)) {
3560 PyBuffer_Release(&pbuf);
3561 return select_error();
3562 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003563
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 do {
Victor Stinner02f32ab2015-04-01 22:53:26 +02003565 ctx.buf = buf;
3566 ctx.len = len;
3567 ctx.flags = flags;
3568 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003569 PyBuffer_Release(&pbuf);
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003570 return NULL;
3571 }
Victor Stinner02f32ab2015-04-01 22:53:26 +02003572 n = ctx.result;
3573 assert(n >= 0);
3574
3575 buf += n;
3576 len -= n;
3577
3578 /* We must run our signal handlers before looping again.
3579 send() can return a successful partial write when it is
3580 interrupted, so we can't restrict ourselves to EINTR. */
3581 if (PyErr_CheckSignals()) {
3582 PyBuffer_Release(&pbuf);
3583 return NULL;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003584 }
Victor Stinner02f32ab2015-04-01 22:53:26 +02003585 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003587
Victor Stinner02f32ab2015-04-01 22:53:26 +02003588 Py_RETURN_NONE;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003589}
3590
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003591PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003592"sendall(data[, flags])\n\
3593\n\
3594Send a data string to the socket. For the optional flags\n\
3595argument, see the Unix manual. This calls send() repeatedly\n\
3596until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003597to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003598
Guido van Rossum30a685f1991-06-27 15:51:29 +00003599
Victor Stinner31bf2d52015-04-01 21:57:09 +02003600struct sock_sendto {
3601 char *buf;
3602 Py_ssize_t len;
3603 int flags;
3604 int addrlen;
3605 sock_addr_t *addrbuf;
3606 Py_ssize_t result;
3607};
3608
3609static int
3610sock_sendto_impl(PySocketSockObject *s, void *data)
3611{
3612 struct sock_sendto *ctx = data;
3613
3614#ifdef MS_WINDOWS
3615 if (ctx->len > INT_MAX)
3616 ctx->len = INT_MAX;
3617 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3618 SAS2SA(ctx->addrbuf), ctx->addrlen);
3619#else
3620 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3621 SAS2SA(ctx->addrbuf), ctx->addrlen);
3622#endif
3623 return (ctx->result >= 0);
3624}
3625
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003626/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003627
Guido van Rossum73624e91994-10-10 17:59:00 +00003628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003629sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003631 Py_buffer pbuf;
3632 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003633 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003634 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003635 int addrlen, flags;
3636 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003638 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003639 arglen = PyTuple_Size(args);
3640 switch (arglen) {
3641 case 2:
3642 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3643 break;
3644 case 3:
3645 PyArg_ParseTuple(args, "y*iO:sendto",
3646 &pbuf, &flags, &addro);
3647 break;
3648 default:
3649 PyErr_Format(PyExc_TypeError,
3650 "sendto() takes 2 or 3 arguments (%d given)",
3651 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003652 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003653 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003654 if (PyErr_Occurred())
3655 return NULL;
3656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003657 if (!IS_SELECTABLE(s)) {
3658 PyBuffer_Release(&pbuf);
3659 return select_error();
3660 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003662 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3663 PyBuffer_Release(&pbuf);
3664 return NULL;
3665 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003666
Victor Stinner31bf2d52015-04-01 21:57:09 +02003667 ctx.buf = pbuf.buf;
3668 ctx.len = pbuf.len;
3669 ctx.flags = flags;
3670 ctx.addrlen = addrlen;
3671 ctx.addrbuf = &addrbuf;
3672 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003673 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003674 return NULL;
3675 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003676 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003677
3678 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003679}
3680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003681PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003682"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003683\n\
3684Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003685For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003686
Guido van Rossum30a685f1991-06-27 15:51:29 +00003687
Victor Stinner35bee932015-04-02 12:28:07 +02003688/* The sendmsg() and recvmsg[_into]() methods require a working
3689 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3690#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003691struct sock_sendmsg {
3692 struct msghdr *msg;
3693 int flags;
3694 ssize_t result;
3695};
3696
3697static int
3698sock_sendmsg_impl(PySocketSockObject *s, void *data)
3699{
3700 struct sock_sendmsg *ctx = data;
3701
3702 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3703 return (ctx->result >= 0);
3704}
3705
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003706/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3707
3708static PyObject *
3709sock_sendmsg(PySocketSockObject *s, PyObject *args)
3710{
3711 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3712 Py_buffer *databufs = NULL;
3713 struct iovec *iovs = NULL;
3714 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003715 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003716 struct cmsginfo {
3717 int level;
3718 int type;
3719 Py_buffer data;
3720 } *cmsgs = NULL;
3721 void *controlbuf = NULL;
3722 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003723 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003724 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3725 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003726 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003727
3728 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3729 &data_arg, &cmsg_arg, &flags, &addr_arg))
3730 return NULL;
3731
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003732 /* Parse destination address. */
3733 if (addr_arg != NULL && addr_arg != Py_None) {
3734 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3735 goto finally;
3736 msg.msg_name = &addrbuf;
3737 msg.msg_namelen = addrlen;
3738 }
3739
3740 /* Fill in an iovec for each message part, and save the Py_buffer
3741 structs to release afterwards. */
3742 if ((data_fast = PySequence_Fast(data_arg,
3743 "sendmsg() argument 1 must be an "
3744 "iterable")) == NULL)
3745 goto finally;
3746 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3747 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003748 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003749 goto finally;
3750 }
3751 msg.msg_iovlen = ndataparts;
3752 if (ndataparts > 0 &&
3753 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3754 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3755 PyErr_NoMemory();
3756 goto finally;
3757 }
3758 for (; ndatabufs < ndataparts; ndatabufs++) {
3759 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3760 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003761 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762 &databufs[ndatabufs]))
3763 goto finally;
3764 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3765 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3766 }
3767
3768 if (cmsg_arg == NULL)
3769 ncmsgs = 0;
3770 else {
3771 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3772 "sendmsg() argument 2 must be an "
3773 "iterable")) == NULL)
3774 goto finally;
3775 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3776 }
3777
3778#ifndef CMSG_SPACE
3779 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003780 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003781 "sending multiple control messages is not supported "
3782 "on this system");
3783 goto finally;
3784 }
3785#endif
3786 /* Save level, type and Py_buffer for each control message,
3787 and calculate total size. */
3788 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3789 PyErr_NoMemory();
3790 goto finally;
3791 }
3792 controllen = controllen_last = 0;
3793 while (ncmsgbufs < ncmsgs) {
3794 size_t bufsize, space;
3795
3796 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3797 "(iiy*):[sendmsg() ancillary data items]",
3798 &cmsgs[ncmsgbufs].level,
3799 &cmsgs[ncmsgbufs].type,
3800 &cmsgs[ncmsgbufs].data))
3801 goto finally;
3802 bufsize = cmsgs[ncmsgbufs++].data.len;
3803
3804#ifdef CMSG_SPACE
3805 if (!get_CMSG_SPACE(bufsize, &space)) {
3806#else
3807 if (!get_CMSG_LEN(bufsize, &space)) {
3808#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003809 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003810 goto finally;
3811 }
3812 controllen += space;
3813 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003814 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003815 goto finally;
3816 }
3817 controllen_last = controllen;
3818 }
3819
3820 /* Construct ancillary data block from control message info. */
3821 if (ncmsgbufs > 0) {
3822 struct cmsghdr *cmsgh = NULL;
3823
3824 if ((msg.msg_control = controlbuf =
3825 PyMem_Malloc(controllen)) == NULL) {
3826 PyErr_NoMemory();
3827 goto finally;
3828 }
3829 msg.msg_controllen = controllen;
3830
3831 /* Need to zero out the buffer as a workaround for glibc's
3832 CMSG_NXTHDR() implementation. After getting the pointer to
3833 the next header, it checks its (uninitialized) cmsg_len
3834 member to see if the "message" fits in the buffer, and
3835 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003836 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003837 memset(controlbuf, 0, controllen);
3838
3839 for (i = 0; i < ncmsgbufs; i++) {
3840 size_t msg_len, data_len = cmsgs[i].data.len;
3841 int enough_space = 0;
3842
3843 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3844 if (cmsgh == NULL) {
3845 PyErr_Format(PyExc_RuntimeError,
3846 "unexpected NULL result from %s()",
3847 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3848 goto finally;
3849 }
3850 if (!get_CMSG_LEN(data_len, &msg_len)) {
3851 PyErr_SetString(PyExc_RuntimeError,
3852 "item size out of range for CMSG_LEN()");
3853 goto finally;
3854 }
3855 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3856 size_t space;
3857
3858 cmsgh->cmsg_len = msg_len;
3859 if (get_cmsg_data_space(&msg, cmsgh, &space))
3860 enough_space = (space >= data_len);
3861 }
3862 if (!enough_space) {
3863 PyErr_SetString(PyExc_RuntimeError,
3864 "ancillary data does not fit in calculated "
3865 "space");
3866 goto finally;
3867 }
3868 cmsgh->cmsg_level = cmsgs[i].level;
3869 cmsgh->cmsg_type = cmsgs[i].type;
3870 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3871 }
3872 }
3873
3874 /* Make the system call. */
3875 if (!IS_SELECTABLE(s)) {
3876 select_error();
3877 goto finally;
3878 }
3879
Victor Stinner31bf2d52015-04-01 21:57:09 +02003880 ctx.msg = &msg;
3881 ctx.flags = flags;
3882 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003883 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003884
3885 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003886
3887finally:
3888 PyMem_Free(controlbuf);
3889 for (i = 0; i < ncmsgbufs; i++)
3890 PyBuffer_Release(&cmsgs[i].data);
3891 PyMem_Free(cmsgs);
3892 Py_XDECREF(cmsg_fast);
3893 for (i = 0; i < ndatabufs; i++)
3894 PyBuffer_Release(&databufs[i]);
3895 PyMem_Free(databufs);
3896 PyMem_Free(iovs);
3897 Py_XDECREF(data_fast);
3898 return retval;
3899}
3900
3901PyDoc_STRVAR(sendmsg_doc,
3902"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3903\n\
3904Send normal and ancillary data to the socket, gathering the\n\
3905non-ancillary data from a series of buffers and concatenating it into\n\
3906a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003907data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003908The ancdata argument specifies the ancillary data (control messages)\n\
3909as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3910cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3911protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003912is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003913argument defaults to 0 and has the same meaning as for send(). If\n\
3914address is supplied and not None, it sets a destination address for\n\
3915the message. The return value is the number of bytes of non-ancillary\n\
3916data sent.");
3917#endif /* CMSG_LEN */
3918
3919
Guido van Rossum30a685f1991-06-27 15:51:29 +00003920/* s.shutdown(how) method */
3921
Guido van Rossum73624e91994-10-10 17:59:00 +00003922static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003923sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003924{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003925 int how;
3926 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003927
Serhiy Storchaka78980432013-01-15 01:12:17 +02003928 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003929 if (how == -1 && PyErr_Occurred())
3930 return NULL;
3931 Py_BEGIN_ALLOW_THREADS
3932 res = shutdown(s->sock_fd, how);
3933 Py_END_ALLOW_THREADS
3934 if (res < 0)
3935 return s->errorhandler();
3936 Py_INCREF(Py_None);
3937 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003938}
3939
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003940PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003941"shutdown(flag)\n\
3942\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003943Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3944of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003945
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003946#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003947static PyObject*
3948sock_ioctl(PySocketSockObject *s, PyObject *arg)
3949{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 unsigned long cmd = SIO_RCVALL;
3951 PyObject *argO;
3952 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003954 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3955 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003956
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003957 switch (cmd) {
3958 case SIO_RCVALL: {
3959 unsigned int option = RCVALL_ON;
3960 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3961 return NULL;
3962 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3963 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3964 return set_error();
3965 }
3966 return PyLong_FromUnsignedLong(recv); }
3967 case SIO_KEEPALIVE_VALS: {
3968 struct tcp_keepalive ka;
3969 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3970 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3971 return NULL;
3972 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3973 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3974 return set_error();
3975 }
3976 return PyLong_FromUnsignedLong(recv); }
3977 default:
3978 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3979 return NULL;
3980 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003981}
3982PyDoc_STRVAR(sock_ioctl_doc,
3983"ioctl(cmd, option) -> long\n\
3984\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003985Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3986SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3987SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003988#endif
3989
3990#if defined(MS_WINDOWS)
3991static PyObject*
3992sock_share(PySocketSockObject *s, PyObject *arg)
3993{
3994 WSAPROTOCOL_INFO info;
3995 DWORD processId;
3996 int result;
3997
3998 if (!PyArg_ParseTuple(arg, "I", &processId))
3999 return NULL;
4000
4001 Py_BEGIN_ALLOW_THREADS
4002 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4003 Py_END_ALLOW_THREADS
4004 if (result == SOCKET_ERROR)
4005 return set_error();
4006 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4007}
4008PyDoc_STRVAR(sock_share_doc,
4009"share(process_id) -> bytes\n\
4010\n\
4011Share the socket with another process. The target process id\n\
4012must be provided and the resulting bytes object passed to the target\n\
4013process. There the shared socket can be instantiated by calling\n\
4014socket.fromshare().");
4015
Christian Heimesfaf2f632008-01-06 16:59:19 +00004016
4017#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004018
4019/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004020
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004021static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4023 accept_doc},
4024 {"bind", (PyCFunction)sock_bind, METH_O,
4025 bind_doc},
4026 {"close", (PyCFunction)sock_close, METH_NOARGS,
4027 close_doc},
4028 {"connect", (PyCFunction)sock_connect, METH_O,
4029 connect_doc},
4030 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4031 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004032 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4033 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4035 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004036#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 {"getpeername", (PyCFunction)sock_getpeername,
4038 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004039#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004040 {"getsockname", (PyCFunction)sock_getsockname,
4041 METH_NOARGS, getsockname_doc},
4042 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4043 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004044#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004045 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4046 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004047#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004048#if defined(MS_WINDOWS)
4049 {"share", (PyCFunction)sock_share, METH_VARARGS,
4050 sock_share_doc},
4051#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004052 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004053 listen_doc},
4054 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4055 recv_doc},
4056 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4057 recv_into_doc},
4058 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4059 recvfrom_doc},
4060 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4061 recvfrom_into_doc},
4062 {"send", (PyCFunction)sock_send, METH_VARARGS,
4063 send_doc},
4064 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4065 sendall_doc},
4066 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4067 sendto_doc},
4068 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4069 setblocking_doc},
4070 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4071 settimeout_doc},
4072 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4073 gettimeout_doc},
4074 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4075 setsockopt_doc},
4076 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4077 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004078#ifdef CMSG_LEN
4079 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4080 recvmsg_doc},
4081 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4082 recvmsg_into_doc,},
4083 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4084 sendmsg_doc},
4085#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004086 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004087};
4088
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004089/* SockObject members */
4090static PyMemberDef sock_memberlist[] = {
4091 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4092 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4093 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004094 {0},
4095};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004096
Victor Stinner71694d52015-03-28 01:18:54 +01004097static PyGetSetDef sock_getsetlist[] = {
4098 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4099 {NULL} /* sentinel */
4100};
4101
Guido van Rossum73624e91994-10-10 17:59:00 +00004102/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004103 First close the file description. */
4104
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004105static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004106sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004107{
Antoine Pitroue033e062010-10-29 10:38:18 +00004108 if (s->sock_fd != -1) {
4109 PyObject *exc, *val, *tb;
4110 Py_ssize_t old_refcount = Py_REFCNT(s);
4111 ++Py_REFCNT(s);
4112 PyErr_Fetch(&exc, &val, &tb);
4113 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4114 "unclosed %R", s))
4115 /* Spurious errors can appear at shutdown */
4116 if (PyErr_ExceptionMatches(PyExc_Warning))
4117 PyErr_WriteUnraisable((PyObject *) s);
4118 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004120 Py_REFCNT(s) = old_refcount;
4121 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004123}
4124
Guido van Rossum30a685f1991-06-27 15:51:29 +00004125
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004127sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004128{
Victor Stinnere254e532014-07-26 14:36:55 +02004129 long sock_fd;
4130 /* On Windows, this test is needed because SOCKET_T is unsigned */
4131 if (s->sock_fd == INVALID_SOCKET) {
4132 sock_fd = -1;
4133 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004134#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004135 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 /* this can occur on Win64, and actually there is a special
4137 ugly printf formatter for decimal pointer length integer
4138 printing, only bother if necessary*/
4139 PyErr_SetString(PyExc_OverflowError,
4140 "no printf formatter to display "
4141 "the socket descriptor in decimal");
4142 return NULL;
4143 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004144#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004145 else
4146 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 return PyUnicode_FromFormat(
4148 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004149 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004150 s->sock_type,
4151 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004152}
4153
4154
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004155/* Create a new, uninitialized socket object. */
4156
4157static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004158sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 new = type->tp_alloc(type, 0);
4163 if (new != NULL) {
4164 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner9001d802015-04-06 23:06:01 +02004165 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004166 ((PySocketSockObject *)new)->errorhandler = &set_error;
4167 }
4168 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004169}
4170
4171
4172/* Initialize a new socket object. */
4173
Victor Stinnerdaf45552013-08-28 00:53:59 +02004174#ifdef SOCK_CLOEXEC
4175/* socket() and socketpair() fail with EINVAL on Linux kernel older
4176 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4177static int sock_cloexec_works = -1;
4178#endif
4179
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004180/*ARGSUSED*/
4181static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004182sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 PySocketSockObject *s = (PySocketSockObject *)self;
4185 PyObject *fdobj = NULL;
4186 SOCKET_T fd = INVALID_SOCKET;
4187 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4188 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004189#ifndef MS_WINDOWS
4190#ifdef SOCK_CLOEXEC
4191 int *atomic_flag_works = &sock_cloexec_works;
4192#else
4193 int *atomic_flag_works = NULL;
4194#endif
4195#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4198 "|iiiO:socket", keywords,
4199 &family, &type, &proto, &fdobj))
4200 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004202 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004203#ifdef MS_WINDOWS
4204 /* recreate a socket that was duplicated */
4205 if (PyBytes_Check(fdobj)) {
4206 WSAPROTOCOL_INFO info;
4207 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4208 PyErr_Format(PyExc_ValueError,
4209 "socket descriptor string has wrong size, "
4210 "should be %zu bytes.", sizeof(info));
4211 return -1;
4212 }
4213 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4214 Py_BEGIN_ALLOW_THREADS
4215 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4216 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4217 Py_END_ALLOW_THREADS
4218 if (fd == INVALID_SOCKET) {
4219 set_error();
4220 return -1;
4221 }
4222 family = info.iAddressFamily;
4223 type = info.iSocketType;
4224 proto = info.iProtocol;
4225 }
4226 else
4227#endif
4228 {
4229 fd = PyLong_AsSocket_t(fdobj);
4230 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4231 return -1;
4232 if (fd == INVALID_SOCKET) {
4233 PyErr_SetString(PyExc_ValueError,
4234 "can't use invalid socket value");
4235 return -1;
4236 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004237 }
4238 }
4239 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004240#ifdef MS_WINDOWS
4241 /* Windows implementation */
4242#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4243#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4244#endif
4245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004246 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004247 if (support_wsa_no_inherit) {
4248 fd = WSASocket(family, type, proto,
4249 NULL, 0,
4250 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4251 if (fd == INVALID_SOCKET) {
4252 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4253 support_wsa_no_inherit = 0;
4254 fd = socket(family, type, proto);
4255 }
4256 }
4257 else {
4258 fd = socket(family, type, proto);
4259 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004260 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004262 if (fd == INVALID_SOCKET) {
4263 set_error();
4264 return -1;
4265 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004266
4267 if (!support_wsa_no_inherit) {
4268 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4269 closesocket(fd);
4270 PyErr_SetFromWindowsErr(0);
4271 return -1;
4272 }
4273 }
4274#else
4275 /* UNIX */
4276 Py_BEGIN_ALLOW_THREADS
4277#ifdef SOCK_CLOEXEC
4278 if (sock_cloexec_works != 0) {
4279 fd = socket(family, type | SOCK_CLOEXEC, proto);
4280 if (sock_cloexec_works == -1) {
4281 if (fd >= 0) {
4282 sock_cloexec_works = 1;
4283 }
4284 else if (errno == EINVAL) {
4285 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4286 sock_cloexec_works = 0;
4287 fd = socket(family, type, proto);
4288 }
4289 }
4290 }
4291 else
4292#endif
4293 {
4294 fd = socket(family, type, proto);
4295 }
4296 Py_END_ALLOW_THREADS
4297
4298 if (fd == INVALID_SOCKET) {
4299 set_error();
4300 return -1;
4301 }
4302
4303 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4304 SOCKETCLOSE(fd);
4305 return -1;
4306 }
4307#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004308 }
4309 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004310
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004312
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004313}
4314
4315
Guido van Rossumb6775db1994-08-01 11:34:53 +00004316/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004317
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004318static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4320 "_socket.socket", /* tp_name */
4321 sizeof(PySocketSockObject), /* tp_basicsize */
4322 0, /* tp_itemsize */
4323 (destructor)sock_dealloc, /* tp_dealloc */
4324 0, /* tp_print */
4325 0, /* tp_getattr */
4326 0, /* tp_setattr */
4327 0, /* tp_reserved */
4328 (reprfunc)sock_repr, /* tp_repr */
4329 0, /* tp_as_number */
4330 0, /* tp_as_sequence */
4331 0, /* tp_as_mapping */
4332 0, /* tp_hash */
4333 0, /* tp_call */
4334 0, /* tp_str */
4335 PyObject_GenericGetAttr, /* tp_getattro */
4336 0, /* tp_setattro */
4337 0, /* tp_as_buffer */
4338 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4339 sock_doc, /* tp_doc */
4340 0, /* tp_traverse */
4341 0, /* tp_clear */
4342 0, /* tp_richcompare */
4343 0, /* tp_weaklistoffset */
4344 0, /* tp_iter */
4345 0, /* tp_iternext */
4346 sock_methods, /* tp_methods */
4347 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004348 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 0, /* tp_base */
4350 0, /* tp_dict */
4351 0, /* tp_descr_get */
4352 0, /* tp_descr_set */
4353 0, /* tp_dictoffset */
4354 sock_initobj, /* tp_init */
4355 PyType_GenericAlloc, /* tp_alloc */
4356 sock_new, /* tp_new */
4357 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004358};
4359
Guido van Rossum30a685f1991-06-27 15:51:29 +00004360
Guido van Rossum81194471991-07-27 21:42:02 +00004361/* Python interface to gethostname(). */
4362
4363/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004364static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004365socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004366{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004367#ifdef MS_WINDOWS
4368 /* Don't use winsock's gethostname, as this returns the ANSI
4369 version of the hostname, whereas we need a Unicode string.
4370 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004371 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004372 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004373 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004374 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004375
4376 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004377 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004378
4379 if (GetLastError() != ERROR_MORE_DATA)
4380 return PyErr_SetFromWindowsErr(0);
4381
4382 if (size == 0)
4383 return PyUnicode_New(0, 0);
4384
4385 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4386 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004387 name = PyMem_New(wchar_t, size);
4388 if (!name) {
4389 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004390 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004391 }
Victor Stinner74168972011-11-17 01:11:36 +01004392 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4393 name,
4394 &size))
4395 {
4396 PyMem_Free(name);
4397 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004398 }
Victor Stinner74168972011-11-17 01:11:36 +01004399
4400 result = PyUnicode_FromWideChar(name, size);
4401 PyMem_Free(name);
4402 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004403#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 char buf[1024];
4405 int res;
4406 Py_BEGIN_ALLOW_THREADS
4407 res = gethostname(buf, (int) sizeof buf - 1);
4408 Py_END_ALLOW_THREADS
4409 if (res < 0)
4410 return set_error();
4411 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004412 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004413#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004414}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004415
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004416PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004417"gethostname() -> string\n\
4418\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004419Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004420
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004421#ifdef HAVE_SETHOSTNAME
4422PyDoc_STRVAR(sethostname_doc,
4423"sethostname(name)\n\n\
4424Sets the hostname to name.");
4425
4426static PyObject *
4427socket_sethostname(PyObject *self, PyObject *args)
4428{
4429 PyObject *hnobj;
4430 Py_buffer buf;
4431 int res, flag = 0;
4432
Christian Heimesd2774c72013-06-19 02:06:29 +02004433#ifdef _AIX
4434/* issue #18259, not declared in any useful header file */
4435extern int sethostname(const char *, size_t);
4436#endif
4437
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004438 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4439 PyErr_Clear();
4440 if (!PyArg_ParseTuple(args, "O&:sethostname",
4441 PyUnicode_FSConverter, &hnobj))
4442 return NULL;
4443 flag = 1;
4444 }
4445 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4446 if (!res) {
4447 res = sethostname(buf.buf, buf.len);
4448 PyBuffer_Release(&buf);
4449 }
4450 if (flag)
4451 Py_DECREF(hnobj);
4452 if (res)
4453 return set_error();
4454 Py_RETURN_NONE;
4455}
4456#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004457
Guido van Rossum30a685f1991-06-27 15:51:29 +00004458/* Python interface to gethostbyname(name). */
4459
4460/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004461static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004462socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 char *name;
4465 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004466 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004467
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004468 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004469 return NULL;
4470 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004471 goto finally;
4472 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4473finally:
4474 PyMem_Free(name);
4475 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004476}
4477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004478PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004479"gethostbyname(host) -> address\n\
4480\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004481Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004482
4483
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004484/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4485
4486static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004487gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004488{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 char **pch;
4490 PyObject *rtn_tuple = (PyObject *)NULL;
4491 PyObject *name_list = (PyObject *)NULL;
4492 PyObject *addr_list = (PyObject *)NULL;
4493 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 if (h == NULL) {
4496 /* Let's get real error message to return */
4497 set_herror(h_errno);
4498 return NULL;
4499 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004500
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 if (h->h_addrtype != af) {
4502 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004503 errno = EAFNOSUPPORT;
4504 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 return NULL;
4506 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 case AF_INET:
4511 if (alen < sizeof(struct sockaddr_in))
4512 return NULL;
4513 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004514
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004515#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 case AF_INET6:
4517 if (alen < sizeof(struct sockaddr_in6))
4518 return NULL;
4519 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004520#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004522 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 if ((name_list = PyList_New(0)) == NULL)
4525 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 if ((addr_list = PyList_New(0)) == NULL)
4528 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004529
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 /* SF #1511317: h_aliases can be NULL */
4531 if (h->h_aliases) {
4532 for (pch = h->h_aliases; *pch != NULL; pch++) {
4533 int status;
4534 tmp = PyUnicode_FromString(*pch);
4535 if (tmp == NULL)
4536 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004537
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004538 status = PyList_Append(name_list, tmp);
4539 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004540
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004541 if (status)
4542 goto err;
4543 }
4544 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4547 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 case AF_INET:
4552 {
4553 struct sockaddr_in sin;
4554 memset(&sin, 0, sizeof(sin));
4555 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004556#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4560 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 if (pch == h->h_addr_list && alen >= sizeof(sin))
4563 memcpy((char *) addr, &sin, sizeof(sin));
4564 break;
4565 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004566
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004567#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 case AF_INET6:
4569 {
4570 struct sockaddr_in6 sin6;
4571 memset(&sin6, 0, sizeof(sin6));
4572 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004573#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4577 tmp = makeipaddr((struct sockaddr *)&sin6,
4578 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4581 memcpy((char *) addr, &sin6, sizeof(sin6));
4582 break;
4583 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004584#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004586 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004587 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004588 "unsupported address family");
4589 return NULL;
4590 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 if (tmp == NULL)
4593 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004595 status = PyList_Append(addr_list, tmp);
4596 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 if (status)
4599 goto err;
4600 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004602 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004603
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004604 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004605 Py_XDECREF(name_list);
4606 Py_XDECREF(addr_list);
4607 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004608}
4609
4610
4611/* Python interface to gethostbyname_ex(name). */
4612
4613/*ARGSUSED*/
4614static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004615socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 char *name;
4618 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004619 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004621 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004622#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004623 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004624#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004625 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004626#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004627 char buf[16384];
4628 int buf_len = (sizeof buf) - 1;
4629 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004630#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004631#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004633#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004634#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004635
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004636 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004637 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004638 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004639 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004641#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004642#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004643 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004645#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004647#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 memset((void *) &data, '\0', sizeof(data));
4649 result = gethostbyname_r(name, &hp_allocated, &data);
4650 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004651#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004652#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004653#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004656 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004657#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004658 Py_END_ALLOW_THREADS
4659 /* Some C libraries would require addr.__ss_family instead of
4660 addr.ss_family.
4661 Therefore, we cast the sockaddr_storage into sockaddr to
4662 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004663 sa = SAS2SA(&addr);
4664 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004666#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004667 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004668#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004669finally:
4670 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004672}
4673
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004674PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004675"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4676\n\
4677Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004678for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004679
4680
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004681/* Python interface to gethostbyaddr(IP). */
4682
4683/*ARGSUSED*/
4684static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004685socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004686{
Charles-François Natali8b759652011-12-23 16:44:51 +01004687 sock_addr_t addr;
4688 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004689 char *ip_num;
4690 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004691 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004692#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004693 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004694#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 /* glibcs up to 2.10 assume that the buf argument to
4698 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4699 does not ensure. The attribute below instructs the compiler
4700 to maintain this alignment. */
4701 char buf[16384] Py_ALIGNED(8);
4702 int buf_len = (sizeof buf) - 1;
4703 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004704#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004705#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004707#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004708#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 char *ap;
4710 int al;
4711 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004712
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004713 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004714 return NULL;
4715 af = AF_UNSPEC;
4716 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004717 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004718 af = sa->sa_family;
4719 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004720 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004721 switch (af) {
4722 case AF_INET:
4723 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4724 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4725 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004726#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004727 case AF_INET6:
4728 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4729 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4730 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004733 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004734 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 }
4736 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004737#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004738#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004739 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004740 &hp_allocated, buf, buf_len,
4741 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004742#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004743 h = gethostbyaddr_r(ap, al, af,
4744 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004745#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004746 memset((void *) &data, '\0', sizeof(data));
4747 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4748 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004749#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004750#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004751#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004754 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004755#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004757 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004758#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004760#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004761finally:
4762 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004764}
4765
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004766PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004767"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4768\n\
4769Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004770for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004771
Guido van Rossum30a685f1991-06-27 15:51:29 +00004772
4773/* Python interface to getservbyname(name).
4774 This only returns the port number, since the other info is already
4775 known or not useful (like the list of aliases). */
4776
4777/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004778static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004779socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 char *name, *proto=NULL;
4782 struct servent *sp;
4783 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4784 return NULL;
4785 Py_BEGIN_ALLOW_THREADS
4786 sp = getservbyname(name, proto);
4787 Py_END_ALLOW_THREADS
4788 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004789 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 return NULL;
4791 }
4792 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004793}
4794
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004795PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004796"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004797\n\
4798Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004799The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4800otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004801
Guido van Rossum30a685f1991-06-27 15:51:29 +00004802
Barry Warsaw11b91a02004-06-28 00:50:43 +00004803/* Python interface to getservbyport(port).
4804 This only returns the service name, since the other info is already
4805 known or not useful (like the list of aliases). */
4806
4807/*ARGSUSED*/
4808static PyObject *
4809socket_getservbyport(PyObject *self, PyObject *args)
4810{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 int port;
4812 char *proto=NULL;
4813 struct servent *sp;
4814 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4815 return NULL;
4816 if (port < 0 || port > 0xffff) {
4817 PyErr_SetString(
4818 PyExc_OverflowError,
4819 "getservbyport: port must be 0-65535.");
4820 return NULL;
4821 }
4822 Py_BEGIN_ALLOW_THREADS
4823 sp = getservbyport(htons((short)port), proto);
4824 Py_END_ALLOW_THREADS
4825 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004826 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 return NULL;
4828 }
4829 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004830}
4831
4832PyDoc_STRVAR(getservbyport_doc,
4833"getservbyport(port[, protocolname]) -> string\n\
4834\n\
4835Return the service name from a port number and protocol name.\n\
4836The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4837otherwise any protocol will match.");
4838
Guido van Rossum3901d851996-12-19 16:35:04 +00004839/* Python interface to getprotobyname(name).
4840 This only returns the protocol number, since the other info is
4841 already known or not useful (like the list of aliases). */
4842
4843/*ARGSUSED*/
4844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004845socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847 char *name;
4848 struct protoent *sp;
4849 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4850 return NULL;
4851 Py_BEGIN_ALLOW_THREADS
4852 sp = getprotobyname(name);
4853 Py_END_ALLOW_THREADS
4854 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004855 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004856 return NULL;
4857 }
4858 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004859}
4860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004861PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004862"getprotobyname(name) -> integer\n\
4863\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004864Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004865
Guido van Rossum3901d851996-12-19 16:35:04 +00004866
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004867#ifndef NO_DUP
4868/* dup() function for socket fds */
4869
4870static PyObject *
4871socket_dup(PyObject *self, PyObject *fdobj)
4872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 SOCKET_T fd, newfd;
4874 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004875#ifdef MS_WINDOWS
4876 WSAPROTOCOL_INFO info;
4877#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004879 fd = PyLong_AsSocket_t(fdobj);
4880 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4881 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004882
Victor Stinnerdaf45552013-08-28 00:53:59 +02004883#ifdef MS_WINDOWS
4884 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4885 return set_error();
4886
4887 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4888 FROM_PROTOCOL_INFO,
4889 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 if (newfd == INVALID_SOCKET)
4891 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004892
Victor Stinnerdaf45552013-08-28 00:53:59 +02004893 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4894 closesocket(newfd);
4895 PyErr_SetFromWindowsErr(0);
4896 return NULL;
4897 }
4898#else
4899 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4900 newfd = _Py_dup(fd);
4901 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004902 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004903#endif
4904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004905 newfdobj = PyLong_FromSocket_t(newfd);
4906 if (newfdobj == NULL)
4907 SOCKETCLOSE(newfd);
4908 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004909}
4910
4911PyDoc_STRVAR(dup_doc,
4912"dup(integer) -> integer\n\
4913\n\
4914Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4915sockets; on some platforms os.dup() won't work for socket file descriptors.");
4916#endif
4917
4918
Dave Cole331708b2004-08-09 04:51:41 +00004919#ifdef HAVE_SOCKETPAIR
4920/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004921 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004922 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004923
4924/*ARGSUSED*/
4925static PyObject *
4926socket_socketpair(PyObject *self, PyObject *args)
4927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 PySocketSockObject *s0 = NULL, *s1 = NULL;
4929 SOCKET_T sv[2];
4930 int family, type = SOCK_STREAM, proto = 0;
4931 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004932#ifdef SOCK_CLOEXEC
4933 int *atomic_flag_works = &sock_cloexec_works;
4934#else
4935 int *atomic_flag_works = NULL;
4936#endif
4937 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004938
4939#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004941#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004942 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4945 &family, &type, &proto))
4946 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004947
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004949 Py_BEGIN_ALLOW_THREADS
4950#ifdef SOCK_CLOEXEC
4951 if (sock_cloexec_works != 0) {
4952 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4953 if (sock_cloexec_works == -1) {
4954 if (ret >= 0) {
4955 sock_cloexec_works = 1;
4956 }
4957 else if (errno == EINVAL) {
4958 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4959 sock_cloexec_works = 0;
4960 ret = socketpair(family, type, proto, sv);
4961 }
4962 }
4963 }
4964 else
4965#endif
4966 {
4967 ret = socketpair(family, type, proto, sv);
4968 }
4969 Py_END_ALLOW_THREADS
4970
4971 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004973
4974 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4975 goto finally;
4976 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4977 goto finally;
4978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 s0 = new_sockobject(sv[0], family, type, proto);
4980 if (s0 == NULL)
4981 goto finally;
4982 s1 = new_sockobject(sv[1], family, type, proto);
4983 if (s1 == NULL)
4984 goto finally;
4985 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004986
4987finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004988 if (res == NULL) {
4989 if (s0 == NULL)
4990 SOCKETCLOSE(sv[0]);
4991 if (s1 == NULL)
4992 SOCKETCLOSE(sv[1]);
4993 }
4994 Py_XDECREF(s0);
4995 Py_XDECREF(s1);
4996 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004997}
4998
4999PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005000"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005001\n\
5002Create a pair of socket objects from the sockets returned by the platform\n\
5003socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005004The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005005AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005006
5007#endif /* HAVE_SOCKETPAIR */
5008
5009
Guido van Rossum006bf911996-06-12 04:04:55 +00005010static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005011socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005012{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5016 return NULL;
5017 }
5018 if (x1 < 0) {
5019 PyErr_SetString(PyExc_OverflowError,
5020 "can't convert negative number to unsigned long");
5021 return NULL;
5022 }
5023 x2 = (unsigned int)ntohs((unsigned short)x1);
5024 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005025}
5026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005027PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005028"ntohs(integer) -> integer\n\
5029\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005030Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005031
5032
Guido van Rossum006bf911996-06-12 04:04:55 +00005033static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005034socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005038 if (PyLong_Check(arg)) {
5039 x = PyLong_AsUnsignedLong(arg);
5040 if (x == (unsigned long) -1 && PyErr_Occurred())
5041 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005042#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 {
5044 unsigned long y;
5045 /* only want the trailing 32 bits */
5046 y = x & 0xFFFFFFFFUL;
5047 if (y ^ x)
5048 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005049 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005050 x = y;
5051 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005052#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005053 }
5054 else
5055 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005056 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005058 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005059}
5060
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005061PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005062"ntohl(integer) -> integer\n\
5063\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005064Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005065
5066
Guido van Rossum006bf911996-06-12 04:04:55 +00005067static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005068socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5073 return NULL;
5074 }
5075 if (x1 < 0) {
5076 PyErr_SetString(PyExc_OverflowError,
5077 "can't convert negative number to unsigned long");
5078 return NULL;
5079 }
5080 x2 = (unsigned int)htons((unsigned short)x1);
5081 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005082}
5083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005084PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005085"htons(integer) -> integer\n\
5086\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005087Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005088
5089
Guido van Rossum006bf911996-06-12 04:04:55 +00005090static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005091socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 if (PyLong_Check(arg)) {
5096 x = PyLong_AsUnsignedLong(arg);
5097 if (x == (unsigned long) -1 && PyErr_Occurred())
5098 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005099#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 {
5101 unsigned long y;
5102 /* only want the trailing 32 bits */
5103 y = x & 0xFFFFFFFFUL;
5104 if (y ^ x)
5105 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005106 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 x = y;
5108 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005109#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005110 }
5111 else
5112 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005113 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005114 Py_TYPE(arg)->tp_name);
5115 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005116}
5117
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005118PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005119"htonl(integer) -> integer\n\
5120\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005121Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005122
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005123/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005124
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005125PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005126"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005127\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005128Convert 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 +00005129binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005130
5131static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005132socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005133{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005134#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005136#endif
5137
5138#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005139#if (SIZEOF_INT != 4)
5140#error "Not sure if in_addr_t exists and int is not 32-bits."
5141#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005142 /* Have to use inet_addr() instead */
5143 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005144#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005145 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005147 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5148 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005149
Tim Peters1df9fdd2003-02-13 03:13:40 +00005150
5151#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005152
5153#ifdef USE_INET_ATON_WEAKLINK
5154 if (inet_aton != NULL) {
5155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005156 if (inet_aton(ip_addr, &buf))
5157 return PyBytes_FromStringAndSize((char *)(&buf),
5158 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005159
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005160 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 "illegal IP address string passed to inet_aton");
5162 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005163
Thomas Wouters477c8d52006-05-27 19:21:47 +00005164#ifdef USE_INET_ATON_WEAKLINK
5165 } else {
5166#endif
5167
5168#endif
5169
5170#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5171
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 /* special-case this address as inet_addr might return INADDR_NONE
5173 * for this */
5174 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005175 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005180 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005181 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005182 "illegal IP address string passed to inet_aton");
5183 return NULL;
5184 }
5185 }
5186 return PyBytes_FromStringAndSize((char *) &packed_addr,
5187 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005188
5189#ifdef USE_INET_ATON_WEAKLINK
5190 }
5191#endif
5192
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005193#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005194}
5195
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005196PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005197"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005198\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005199Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005200
5201static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005202socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005203{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005204 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005205 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005206
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005207 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005208 return NULL;
5209 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005210
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005211 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005212 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005213 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005214 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005215 return NULL;
5216 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005217
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005218 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5219 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005221 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005222}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005223
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005224#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005225
5226PyDoc_STRVAR(inet_pton_doc,
5227"inet_pton(af, ip) -> packed IP address string\n\
5228\n\
5229Convert an IP address from string format to a packed string suitable\n\
5230for use with low-level network functions.");
5231
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005232#endif
5233
5234#ifdef HAVE_INET_PTON
5235
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005236static PyObject *
5237socket_inet_pton(PyObject *self, PyObject *args)
5238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005239 int af;
5240 char* ip;
5241 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005242#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005243 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005244#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005245 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005246#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005247 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5248 return NULL;
5249 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005250
Martin v. Löwis04697e82004-06-02 12:35:29 +00005251#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005252 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005253 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 "can't use AF_INET6, IPv6 is disabled");
5255 return NULL;
5256 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005257#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 retval = inet_pton(af, ip, packed);
5260 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005261 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 return NULL;
5263 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005264 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 "illegal IP address string passed to inet_pton");
5266 return NULL;
5267 } else if (af == AF_INET) {
5268 return PyBytes_FromStringAndSize(packed,
5269 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005270#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005271 } else if (af == AF_INET6) {
5272 return PyBytes_FromStringAndSize(packed,
5273 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005274#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005276 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 return NULL;
5278 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005279}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005280#elif defined(MS_WINDOWS)
5281
5282static PyObject *
5283socket_inet_pton(PyObject *self, PyObject *args)
5284{
5285 int af;
5286 char* ip;
5287 struct sockaddr_in6 addr;
5288 INT ret, size;
5289
5290 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5291 return NULL;
5292 }
5293
Victor Stinnere990c6e2013-11-16 00:18:58 +01005294 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005295 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5296
5297 if (ret) {
5298 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5299 return NULL;
5300 } else if(af == AF_INET) {
5301 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005302 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005303 sizeof(addr4->sin_addr));
5304 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005305 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005306 sizeof(addr.sin6_addr));
5307 } else {
5308 PyErr_SetString(PyExc_OSError, "unknown address family");
5309 return NULL;
5310 }
5311}
5312
5313#endif
5314
5315#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005316
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005317PyDoc_STRVAR(inet_ntop_doc,
5318"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5319\n\
5320Convert a packed IP address of the given family to string format.");
5321
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005322#endif
5323
5324
5325#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005326static PyObject *
5327socket_inet_ntop(PyObject *self, PyObject *args)
5328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005329 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005330 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005331 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005332#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005333 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005334#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005335 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005336#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005338 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5339 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005340
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005341 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 return NULL;
5343 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005346 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 PyErr_SetString(PyExc_ValueError,
5348 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005349 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005350 return NULL;
5351 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005352#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005353 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005354 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005355 PyErr_SetString(PyExc_ValueError,
5356 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005357 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005358 return NULL;
5359 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005360#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005361 } else {
5362 PyErr_Format(PyExc_ValueError,
5363 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005364 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 return NULL;
5366 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005367
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005368 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5369 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005371 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005372 return NULL;
5373 } else {
5374 return PyUnicode_FromString(retval);
5375 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005377 /* NOTREACHED */
5378 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5379 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005380}
5381
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005382#elif defined(MS_WINDOWS)
5383
5384static PyObject *
5385socket_inet_ntop(PyObject *self, PyObject *args)
5386{
5387 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005388 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005389 struct sockaddr_in6 addr;
5390 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005391#ifdef ENABLE_IPV6
5392 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5393#else
5394 char ip[INET_ADDRSTRLEN + 1];
5395#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005396
5397 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5398 memset((void *) &ip[0], '\0', sizeof(ip));
5399
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005400 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005401 return NULL;
5402 }
5403
5404 if (af == AF_INET) {
5405 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5406
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005407 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005408 PyErr_SetString(PyExc_ValueError,
5409 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005410 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005411 return NULL;
5412 }
5413 memset(addr4, 0, sizeof(struct sockaddr_in));
5414 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005415 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005416 addrlen = sizeof(struct sockaddr_in);
5417 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005418 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005419 PyErr_SetString(PyExc_ValueError,
5420 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005421 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005422 return NULL;
5423 }
5424
5425 memset(&addr, 0, sizeof(addr));
5426 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005427 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005428 addrlen = sizeof(addr);
5429 } else {
5430 PyErr_Format(PyExc_ValueError,
5431 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005432 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005433 return NULL;
5434 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005435 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005436
5437 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005438 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005439 ip, &retlen);
5440
5441 if (ret) {
5442 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5443 return NULL;
5444 } else {
5445 return PyUnicode_FromString(ip);
5446 }
5447}
5448
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005449#endif /* HAVE_INET_PTON */
5450
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005451/* Python interface to getaddrinfo(host, port). */
5452
5453/*ARGSUSED*/
5454static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005455socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005456{
Victor Stinner77af1722011-05-26 14:05:59 +02005457 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005458 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005459 struct addrinfo hints, *res;
5460 struct addrinfo *res0 = NULL;
5461 PyObject *hobj = NULL;
5462 PyObject *pobj = (PyObject *)NULL;
5463 char pbuf[30];
5464 char *hptr, *pptr;
5465 int family, socktype, protocol, flags;
5466 int error;
5467 PyObject *all = (PyObject *)NULL;
5468 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005469
Georg Brandl6083a4b2013-10-14 06:51:46 +02005470 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005471 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005472 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005473 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 &protocol, &flags)) {
5475 return NULL;
5476 }
5477 if (hobj == Py_None) {
5478 hptr = NULL;
5479 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005480 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005481
5482 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 if (!idna)
5484 return NULL;
5485 assert(PyBytes_Check(idna));
5486 hptr = PyBytes_AS_STRING(idna);
5487 } else if (PyBytes_Check(hobj)) {
5488 hptr = PyBytes_AsString(hobj);
5489 } else {
5490 PyErr_SetString(PyExc_TypeError,
5491 "getaddrinfo() argument 1 must be string or None");
5492 return NULL;
5493 }
5494 if (PyLong_CheckExact(pobj)) {
5495 long value = PyLong_AsLong(pobj);
5496 if (value == -1 && PyErr_Occurred())
5497 goto err;
5498 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5499 pptr = pbuf;
5500 } else if (PyUnicode_Check(pobj)) {
5501 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005502 if (pptr == NULL)
5503 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005504 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005505 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005506 } else if (pobj == Py_None) {
5507 pptr = (char *)NULL;
5508 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005509 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 goto err;
5511 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005512#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005513 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5514 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005515 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5516 * This workaround avoids a segfault in libsystem.
5517 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005518 pptr = "00";
5519 }
5520#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 memset(&hints, 0, sizeof(hints));
5522 hints.ai_family = family;
5523 hints.ai_socktype = socktype;
5524 hints.ai_protocol = protocol;
5525 hints.ai_flags = flags;
5526 Py_BEGIN_ALLOW_THREADS
5527 ACQUIRE_GETADDRINFO_LOCK
5528 error = getaddrinfo(hptr, pptr, &hints, &res0);
5529 Py_END_ALLOW_THREADS
5530 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5531 if (error) {
5532 set_gaierror(error);
5533 goto err;
5534 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005535
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005536 all = PyList_New(0);
5537 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005538 goto err;
5539 for (res = res0; res; res = res->ai_next) {
5540 PyObject *single;
5541 PyObject *addr =
5542 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5543 if (addr == NULL)
5544 goto err;
5545 single = Py_BuildValue("iiisO", res->ai_family,
5546 res->ai_socktype, res->ai_protocol,
5547 res->ai_canonname ? res->ai_canonname : "",
5548 addr);
5549 Py_DECREF(addr);
5550 if (single == NULL)
5551 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005553 if (PyList_Append(all, single))
5554 goto err;
5555 Py_XDECREF(single);
5556 }
5557 Py_XDECREF(idna);
5558 if (res0)
5559 freeaddrinfo(res0);
5560 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005561 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005562 Py_XDECREF(all);
5563 Py_XDECREF(idna);
5564 if (res0)
5565 freeaddrinfo(res0);
5566 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005567}
5568
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005569PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005570"getaddrinfo(host, port [, family, type, proto, flags])\n\
5571 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005572\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005573Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005574
5575/* Python interface to getnameinfo(sa, flags). */
5576
5577/*ARGSUSED*/
5578static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005579socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005580{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 PyObject *sa = (PyObject *)NULL;
5582 int flags;
5583 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005584 int port;
5585 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005586 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5587 struct addrinfo hints, *res = NULL;
5588 int error;
5589 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 flags = flowinfo = scope_id = 0;
5592 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5593 return NULL;
5594 if (!PyTuple_Check(sa)) {
5595 PyErr_SetString(PyExc_TypeError,
5596 "getnameinfo() argument 1 must be a tuple");
5597 return NULL;
5598 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005599 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005600 &hostp, &port, &flowinfo, &scope_id))
5601 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005602 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005603 PyErr_SetString(PyExc_OverflowError,
5604 "getsockaddrarg: flowinfo must be 0-1048575.");
5605 return NULL;
5606 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005607 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5608 memset(&hints, 0, sizeof(hints));
5609 hints.ai_family = AF_UNSPEC;
5610 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005611 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 Py_BEGIN_ALLOW_THREADS
5613 ACQUIRE_GETADDRINFO_LOCK
5614 error = getaddrinfo(hostp, pbuf, &hints, &res);
5615 Py_END_ALLOW_THREADS
5616 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5617 if (error) {
5618 set_gaierror(error);
5619 goto fail;
5620 }
5621 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005622 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 "sockaddr resolved to multiple addresses");
5624 goto fail;
5625 }
5626 switch (res->ai_family) {
5627 case AF_INET:
5628 {
5629 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005630 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 "IPv4 sockaddr must be 2 tuple");
5632 goto fail;
5633 }
5634 break;
5635 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005636#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005637 case AF_INET6:
5638 {
5639 struct sockaddr_in6 *sin6;
5640 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005641 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005642 sin6->sin6_scope_id = scope_id;
5643 break;
5644 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005645#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005646 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005647 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005648 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5649 if (error) {
5650 set_gaierror(error);
5651 goto fail;
5652 }
5653 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005654
5655fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005656 if (res)
5657 freeaddrinfo(res);
5658 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005659}
5660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005661PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005662"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005663\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005664Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005665
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005666
5667/* Python API to getting and setting the default timeout value. */
5668
5669static PyObject *
5670socket_getdefaulttimeout(PyObject *self)
5671{
Victor Stinner71694d52015-03-28 01:18:54 +01005672 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005673 Py_INCREF(Py_None);
5674 return Py_None;
5675 }
Victor Stinner71694d52015-03-28 01:18:54 +01005676 else {
5677 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5678 return PyFloat_FromDouble(seconds);
5679 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005680}
5681
5682PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005683"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005684\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005685Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005686A value of None indicates that new socket objects have no timeout.\n\
5687When the socket module is first imported, the default is None.");
5688
5689static PyObject *
5690socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5691{
Victor Stinner71694d52015-03-28 01:18:54 +01005692 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005693
Victor Stinner71694d52015-03-28 01:18:54 +01005694 if (socket_parse_timeout(&timeout, arg) < 0)
5695 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005696
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005697 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005699 Py_INCREF(Py_None);
5700 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005701}
5702
5703PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005704"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005705\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005706Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005707A value of None indicates that new socket objects have no timeout.\n\
5708When the socket module is first imported, the default is None.");
5709
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005710#ifdef HAVE_IF_NAMEINDEX
5711/* Python API for getting interface indices and names */
5712
5713static PyObject *
5714socket_if_nameindex(PyObject *self, PyObject *arg)
5715{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005716 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005717 int i;
5718 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005719
Charles-François Natali60713592011-05-20 16:55:06 +02005720 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005721 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005722 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005723 return NULL;
5724 }
5725
5726 list = PyList_New(0);
5727 if (list == NULL) {
5728 if_freenameindex(ni);
5729 return NULL;
5730 }
5731
Charles-François Natali60713592011-05-20 16:55:06 +02005732 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5733 PyObject *ni_tuple = Py_BuildValue("IO&",
5734 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005735
5736 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5737 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005738 Py_DECREF(list);
5739 if_freenameindex(ni);
5740 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005741 }
5742 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005743 }
5744
5745 if_freenameindex(ni);
5746 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005747}
5748
5749PyDoc_STRVAR(if_nameindex_doc,
5750"if_nameindex()\n\
5751\n\
5752Returns a list of network interface information (index, name) tuples.");
5753
Charles-François Natali60713592011-05-20 16:55:06 +02005754static PyObject *
5755socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005756{
Charles-François Natali60713592011-05-20 16:55:06 +02005757 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005758 unsigned long index;
5759
Charles-François Natali60713592011-05-20 16:55:06 +02005760 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5761 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005762 return NULL;
5763
Charles-François Natali60713592011-05-20 16:55:06 +02005764 index = if_nametoindex(PyBytes_AS_STRING(oname));
5765 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005766 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005767 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005768 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005769 return NULL;
5770 }
5771
5772 return PyLong_FromUnsignedLong(index);
5773}
5774
5775PyDoc_STRVAR(if_nametoindex_doc,
5776"if_nametoindex(if_name)\n\
5777\n\
5778Returns the interface index corresponding to the interface name if_name.");
5779
Charles-François Natali60713592011-05-20 16:55:06 +02005780static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005781socket_if_indextoname(PyObject *self, PyObject *arg)
5782{
Charles-François Natali60713592011-05-20 16:55:06 +02005783 unsigned long index;
5784 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005785
Charles-François Natali60713592011-05-20 16:55:06 +02005786 index = PyLong_AsUnsignedLong(arg);
5787 if (index == (unsigned long) -1)
5788 return NULL;
5789
5790 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005791 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005792 return NULL;
5793 }
5794
Charles-François Natali60713592011-05-20 16:55:06 +02005795 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005796}
5797
5798PyDoc_STRVAR(if_indextoname_doc,
5799"if_indextoname(if_index)\n\
5800\n\
5801Returns the interface name corresponding to the interface index if_index.");
5802
5803#endif /* HAVE_IF_NAMEINDEX */
5804
5805
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005806#ifdef CMSG_LEN
5807/* Python interface to CMSG_LEN(length). */
5808
5809static PyObject *
5810socket_CMSG_LEN(PyObject *self, PyObject *args)
5811{
5812 Py_ssize_t length;
5813 size_t result;
5814
5815 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5816 return NULL;
5817 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5818 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5819 return NULL;
5820 }
5821 return PyLong_FromSize_t(result);
5822}
5823
5824PyDoc_STRVAR(CMSG_LEN_doc,
5825"CMSG_LEN(length) -> control message length\n\
5826\n\
5827Return the total length, without trailing padding, of an ancillary\n\
5828data item with associated data of the given length. This value can\n\
5829often be used as the buffer size for recvmsg() to receive a single\n\
5830item of ancillary data, but RFC 3542 requires portable applications to\n\
5831use CMSG_SPACE() and thus include space for padding, even when the\n\
5832item will be the last in the buffer. Raises OverflowError if length\n\
5833is outside the permissible range of values.");
5834
5835
5836#ifdef CMSG_SPACE
5837/* Python interface to CMSG_SPACE(length). */
5838
5839static PyObject *
5840socket_CMSG_SPACE(PyObject *self, PyObject *args)
5841{
5842 Py_ssize_t length;
5843 size_t result;
5844
5845 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5846 return NULL;
5847 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5848 PyErr_SetString(PyExc_OverflowError,
5849 "CMSG_SPACE() argument out of range");
5850 return NULL;
5851 }
5852 return PyLong_FromSize_t(result);
5853}
5854
5855PyDoc_STRVAR(CMSG_SPACE_doc,
5856"CMSG_SPACE(length) -> buffer size\n\
5857\n\
5858Return the buffer size needed for recvmsg() to receive an ancillary\n\
5859data item with associated data of the given length, along with any\n\
5860trailing padding. The buffer space needed to receive multiple items\n\
5861is the sum of the CMSG_SPACE() values for their associated data\n\
5862lengths. Raises OverflowError if length is outside the permissible\n\
5863range of values.");
5864#endif /* CMSG_SPACE */
5865#endif /* CMSG_LEN */
5866
5867
Guido van Rossum30a685f1991-06-27 15:51:29 +00005868/* List of functions exported by this module. */
5869
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005870static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005871 {"gethostbyname", socket_gethostbyname,
5872 METH_VARARGS, gethostbyname_doc},
5873 {"gethostbyname_ex", socket_gethostbyname_ex,
5874 METH_VARARGS, ghbn_ex_doc},
5875 {"gethostbyaddr", socket_gethostbyaddr,
5876 METH_VARARGS, gethostbyaddr_doc},
5877 {"gethostname", socket_gethostname,
5878 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005879#ifdef HAVE_SETHOSTNAME
5880 {"sethostname", socket_sethostname,
5881 METH_VARARGS, sethostname_doc},
5882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005883 {"getservbyname", socket_getservbyname,
5884 METH_VARARGS, getservbyname_doc},
5885 {"getservbyport", socket_getservbyport,
5886 METH_VARARGS, getservbyport_doc},
5887 {"getprotobyname", socket_getprotobyname,
5888 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005889#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005890 {"dup", socket_dup,
5891 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005892#endif
Dave Cole331708b2004-08-09 04:51:41 +00005893#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005894 {"socketpair", socket_socketpair,
5895 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005897 {"ntohs", socket_ntohs,
5898 METH_VARARGS, ntohs_doc},
5899 {"ntohl", socket_ntohl,
5900 METH_O, ntohl_doc},
5901 {"htons", socket_htons,
5902 METH_VARARGS, htons_doc},
5903 {"htonl", socket_htonl,
5904 METH_O, htonl_doc},
5905 {"inet_aton", socket_inet_aton,
5906 METH_VARARGS, inet_aton_doc},
5907 {"inet_ntoa", socket_inet_ntoa,
5908 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005909#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 {"inet_pton", socket_inet_pton,
5911 METH_VARARGS, inet_pton_doc},
5912 {"inet_ntop", socket_inet_ntop,
5913 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005914#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005915 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5916 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005917 {"getnameinfo", socket_getnameinfo,
5918 METH_VARARGS, getnameinfo_doc},
5919 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5920 METH_NOARGS, getdefaulttimeout_doc},
5921 {"setdefaulttimeout", socket_setdefaulttimeout,
5922 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005923#ifdef HAVE_IF_NAMEINDEX
5924 {"if_nameindex", socket_if_nameindex,
5925 METH_NOARGS, if_nameindex_doc},
5926 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005927 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005928 {"if_indextoname", socket_if_indextoname,
5929 METH_O, if_indextoname_doc},
5930#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005931#ifdef CMSG_LEN
5932 {"CMSG_LEN", socket_CMSG_LEN,
5933 METH_VARARGS, CMSG_LEN_doc},
5934#ifdef CMSG_SPACE
5935 {"CMSG_SPACE", socket_CMSG_SPACE,
5936 METH_VARARGS, CMSG_SPACE_doc},
5937#endif
5938#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005939 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005940};
5941
Guido van Rossum30a685f1991-06-27 15:51:29 +00005942
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005943#ifdef MS_WINDOWS
5944#define OS_INIT_DEFINED
5945
5946/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005947
5948static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005949os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005950{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005951 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005952}
5953
5954static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005955os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 WSADATA WSAData;
5958 int ret;
5959 ret = WSAStartup(0x0101, &WSAData);
5960 switch (ret) {
5961 case 0: /* No error */
5962 Py_AtExit(os_cleanup);
5963 return 1; /* Success */
5964 case WSASYSNOTREADY:
5965 PyErr_SetString(PyExc_ImportError,
5966 "WSAStartup failed: network not ready");
5967 break;
5968 case WSAVERNOTSUPPORTED:
5969 case WSAEINVAL:
5970 PyErr_SetString(
5971 PyExc_ImportError,
5972 "WSAStartup failed: requested version not supported");
5973 break;
5974 default:
5975 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5976 break;
5977 }
5978 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005979}
5980
Guido van Rossum8d665e61996-06-26 18:22:49 +00005981#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005982
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005983
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005984
5985#ifndef OS_INIT_DEFINED
5986static int
5987os_init(void)
5988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005990}
5991#endif
5992
5993
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005994/* C API table - always add new things to the end for binary
5995 compatibility. */
5996static
5997PySocketModule_APIObject PySocketModuleAPI =
5998{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005999 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006000 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006002};
6003
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006004
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006005/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006006
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006007 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006008 "socket.py" which implements some additional functionality.
6009 The import of "_socket" may fail with an ImportError exception if
6010 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006011 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006012 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006013*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006014
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006015PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006016"Implementation module for socket operations.\n\
6017\n\
6018See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006019
Martin v. Löwis1a214512008-06-11 05:26:20 +00006020static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006021 PyModuleDef_HEAD_INIT,
6022 PySocket_MODULE_NAME,
6023 socket_doc,
6024 -1,
6025 socket_methods,
6026 NULL,
6027 NULL,
6028 NULL,
6029 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006030};
6031
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006032PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006033PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006035 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006037 if (!os_init())
6038 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006039
Victor Stinnerdaf45552013-08-28 00:53:59 +02006040#ifdef MS_WINDOWS
6041 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006042#if defined(_MSC_VER) && _MSC_VER >= 1800
6043 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6044#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006045 DWORD version = GetVersion();
6046 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6047 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6048 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006049 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6050#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006051 }
6052#endif
6053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 Py_TYPE(&sock_type) = &PyType_Type;
6055 m = PyModule_Create(&socketmodule);
6056 if (m == NULL)
6057 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006058
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006059 Py_INCREF(PyExc_OSError);
6060 PySocketModuleAPI.error = PyExc_OSError;
6061 Py_INCREF(PyExc_OSError);
6062 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006063 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006064 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 if (socket_herror == NULL)
6066 return NULL;
6067 Py_INCREF(socket_herror);
6068 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006069 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 NULL);
6071 if (socket_gaierror == NULL)
6072 return NULL;
6073 Py_INCREF(socket_gaierror);
6074 PyModule_AddObject(m, "gaierror", socket_gaierror);
6075 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006076 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006077 if (socket_timeout == NULL)
6078 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006079 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 Py_INCREF(socket_timeout);
6081 PyModule_AddObject(m, "timeout", socket_timeout);
6082 Py_INCREF((PyObject *)&sock_type);
6083 if (PyModule_AddObject(m, "SocketType",
6084 (PyObject *)&sock_type) != 0)
6085 return NULL;
6086 Py_INCREF((PyObject *)&sock_type);
6087 if (PyModule_AddObject(m, "socket",
6088 (PyObject *)&sock_type) != 0)
6089 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006090
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006091#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006093#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006096 Py_INCREF(has_ipv6);
6097 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006098
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006099 /* Export C API */
6100 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6101 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6102 ) != 0)
6103 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006105 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006106#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006107 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006108#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006109 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006110#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006111 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006112#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006113#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006114 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006115#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006116#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006117 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006118 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006119#endif
6120#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006121 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006122#endif
6123#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006124 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006125 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006126#endif
6127#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006129 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006130#endif
6131#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006134#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006135#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006136 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006137 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006138#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006139#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006140 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006141 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006142#endif
6143#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006146#endif
6147#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006148 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006149#endif
6150#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006151 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006152 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006153#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006154#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006156 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006157#endif
6158#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006161#endif
6162#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006164 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006165#endif
6166#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006167 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006168 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006169#endif
6170#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006171 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, AF_NETLINK);
6173 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006174#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006176#endif
6177#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006179#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006180 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6181 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006182#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006184#endif
6185#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006186 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006187#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006188#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006190#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006191#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006192 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006193#endif
6194#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006196#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006198#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006200#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006201#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006202 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006203#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006204#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006205#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006206 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006208#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006209#ifdef AF_LINK
6210 PyModule_AddIntMacro(m, AF_LINK);
6211#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006212#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006215#endif
6216#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006219#endif
6220#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006223#endif
6224#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006226 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006227#endif
6228#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006231#endif
6232#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006235#endif
6236#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006237 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006239#endif
6240#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006241 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006242 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006243#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006244
Hye-Shik Chang81268602004-02-02 06:05:24 +00006245#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006246 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6247 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6248 PyModule_AddIntMacro(m, BTPROTO_HCI);
6249 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006250#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006251 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006252#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006253#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006254#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006255 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006256#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6258 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006259#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006261 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6262 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006263#endif
6264
Charles-François Natali47413c12011-10-06 19:47:44 +02006265#ifdef AF_CAN
6266 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006267 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006268#endif
6269#ifdef PF_CAN
6270 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006272#endif
6273
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006274/* Reliable Datagram Sockets */
6275#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006277#endif
6278#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006279 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006280#endif
6281
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006282/* Kernel event messages */
6283#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006284 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006285#endif
6286#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006287 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006288#endif
6289
Antoine Pitroub156a462010-10-27 20:13:57 +00006290#ifdef AF_PACKET
6291 PyModule_AddIntMacro(m, AF_PACKET);
6292#endif
6293#ifdef PF_PACKET
6294 PyModule_AddIntMacro(m, PF_PACKET);
6295#endif
6296#ifdef PACKET_HOST
6297 PyModule_AddIntMacro(m, PACKET_HOST);
6298#endif
6299#ifdef PACKET_BROADCAST
6300 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6301#endif
6302#ifdef PACKET_MULTICAST
6303 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6304#endif
6305#ifdef PACKET_OTHERHOST
6306 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6307#endif
6308#ifdef PACKET_OUTGOING
6309 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6310#endif
6311#ifdef PACKET_LOOPBACK
6312 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6313#endif
6314#ifdef PACKET_FASTROUTE
6315 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006316#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006317
Christian Heimes043d6f62008-01-07 17:19:16 +00006318#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006319 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006321 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006322 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6323 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6324 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006325
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6327 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6328 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006329
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006330 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006331 PyModule_AddIntMacro(m, SOL_TIPC);
6332 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6333 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6334 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6335 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006336
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6338 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6339 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6340 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006341
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006342 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006343 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6344 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006345#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006348#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006349 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6350 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6351 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6352 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6353 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6354 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006355#endif
6356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006357 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006358 PyModule_AddIntMacro(m, SOCK_STREAM);
6359 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006360/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006361 PyModule_AddIntMacro(m, SOCK_RAW);
6362 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006363#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006364 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006365#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006366#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006367 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006368#endif
6369#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006370 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006371#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006373#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006374 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006375#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006376#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006378#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006380 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006381#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006382#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006384#endif
6385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006386#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006387 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006388#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006389#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006390 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006393 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006396 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006399 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006400#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006402 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006403#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006406#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006407#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006408 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006409#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006410#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006411 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006412#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006413#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006414 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006416#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006417 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006418#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006419#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006420 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006421#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006422#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006423 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006424#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006425#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006426 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006427#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006428#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006429 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006430#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006433#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006434#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006435 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006436#endif
6437#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006439#endif
6440#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006442#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006443#ifdef SO_BINDTODEVICE
6444 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6445#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006446#ifdef SO_PRIORITY
6447 PyModule_AddIntMacro(m, SO_PRIORITY);
6448#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006449#ifdef SO_MARK
6450 PyModule_AddIntMacro(m, SO_MARK);
6451#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453 /* Maximum number of connections for "listen" */
6454#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006455 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006456#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006458#endif
6459
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006460 /* Ancilliary message types */
6461#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006463#endif
6464#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006465 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006466#endif
6467#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006468 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006469#endif
6470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471 /* Flags for send, recv */
6472#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006486#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006488 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006489#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006490#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006491 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006492#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006493#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006494 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006495#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006496#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006497 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006498#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006500 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006501#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006502#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006503 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006504#endif
6505#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006506 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006507#endif
6508#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006509 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006510#endif
6511#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006513#endif
6514#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006515 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006516#endif
6517#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006518 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006519#endif
6520#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006521 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006522#endif
6523#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006524 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006525#endif
6526#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006527 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006528#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006529#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006530 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006531#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533 /* Protocol level and numbers, usable for [gs]etsockopt */
6534#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006539#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006564#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006566#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006567#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006569#endif
6570#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6572 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006573#endif
6574#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6576 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6577 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006578
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6580 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6581 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006582#endif
6583#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006584 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6585 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6586 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6587 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006588#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006589#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006590 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006591 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6592 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6593 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6594 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6595 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6596 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6597 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6598 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6599 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6600 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6601 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6602 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6603#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006604#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006605 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006606#endif
6607#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006608 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006609#endif
6610#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006612#endif
6613#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006615#endif
6616#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006618#endif
6619#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006621#endif
6622#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006624#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006625#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006627#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006628 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006629#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006630#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006631 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006632#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006633#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006634 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006635#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006636 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006655#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006657#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006658#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006660#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006661#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006663#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006664#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006666#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006667 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006668#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006669#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006671#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006672#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006690#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006708#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006711#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006719#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006721 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006722#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006724 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006725#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006726#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006727 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006728#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006729#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006730 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006731#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006732#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006733 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006734#endif
6735/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006738#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006740#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006741#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006742 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006743#endif
6744
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006745#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006747#endif
6748
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006749 /* Some port configuration */
6750#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006751 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006752#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006753 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006754#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006756 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006757#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006758 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006759#endif
6760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006761 /* Some reserved IP v.4 addresses */
6762#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006764#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006765 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006766#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006767#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006768 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006769#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006770 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006774#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006779#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006781#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006782#ifdef INADDR_ALLHOSTS_GROUP
6783 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6784 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006785#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006787#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006788#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006789 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006790#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006791 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006795#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006797#endif
6798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799 /* IPv4 [gs]etsockopt options */
6800#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006802#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006803#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006805#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006806#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006809#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006811#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006812#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006814#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006815#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006818#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006821#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006823#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006824#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006827#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006829#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006830#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006833#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006835#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006836#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006838#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006839#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006841#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006842#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006844#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006845#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006847#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006848#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006850#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006851
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6853#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006854 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006855#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006856#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006857 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006858#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006872#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006873 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006874#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006875 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006876#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006878#endif
6879#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006881#endif
6882#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006884#endif
6885#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006887#endif
6888#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006890#endif
6891#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006893#endif
6894#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006896#endif
6897#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006899#endif
6900#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006902#endif
6903#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006905#endif
6906#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006908#endif
6909#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006911#endif
6912#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006913 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006914#endif
6915#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006916 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006917#endif
6918#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006919 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006920#endif
6921#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006922 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006923#endif
6924#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006925 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006926#endif
6927#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006928 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006929#endif
6930#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006931 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006932#endif
6933#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006935#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006937 /* TCP options */
6938#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006941#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006943#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006944#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006945 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006946#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006947#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006948 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006949#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006950#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006951 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006952#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006953#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006954 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006955#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006956#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006957 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006958#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006959#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006960 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006962#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006963 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006965#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006966 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006967#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006968#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006969 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006970#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006971#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006972 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006973#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006974#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006975 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006976#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006978 /* IPX options */
6979#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006981#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006982
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006983/* Reliable Datagram Sockets */
6984#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006985 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006986#endif
6987#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006988 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006989#endif
6990#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006991 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006992#endif
6993#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006994 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006995#endif
6996#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006997 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006998#endif
6999#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007001#endif
7002#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007004#endif
7005#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007007#endif
7008#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007010#endif
7011#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007013#endif
7014#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007016#endif
7017#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007019#endif
7020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007021 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007022#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007023 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007024#endif
7025#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007026 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007027#endif
7028#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007029 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007030#endif
7031#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007032 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007033#endif
7034#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007035 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007036#endif
7037#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007038 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007039#endif
7040#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007042#endif
7043#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007044 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007045#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007046#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007047 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007048#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007049#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007050 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007051#endif
7052#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007053 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007054#endif
7055#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007057#endif
7058#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007060#endif
7061#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007062 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007063#endif
7064#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007065 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007066#endif
7067#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007068 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007069#endif
7070#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007071 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007072#endif
7073#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007074 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007075#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007076#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007077 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007078#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007079#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007081#endif
7082#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007084#endif
7085#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007087#endif
7088#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007089 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007090#endif
7091#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007092 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007093#endif
7094#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007095 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007096#endif
7097#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007098 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007099#endif
7100#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007101 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007102#endif
7103#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007104 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007105#endif
7106#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007107 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007108#endif
7109#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007110 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007111#endif
7112#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007113 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007114#endif
7115#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007116 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007117#endif
7118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007119 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007120#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007121 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007122#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007123 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007124#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007126#endif
7127#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007128 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007129#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007130 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007131#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007132 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007133#endif
7134#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007136#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007137 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007138#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007139 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007140#endif
7141
Christian Heimesfaf2f632008-01-06 16:59:19 +00007142#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007143 {
7144 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7145 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7146 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007147 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007148 PyObject *tmp;
7149 tmp = PyLong_FromUnsignedLong(codes[i]);
7150 if (tmp == NULL)
7151 return NULL;
7152 PyModule_AddObject(m, names[i], tmp);
7153 }
7154 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007155 PyModule_AddIntMacro(m, RCVALL_OFF);
7156 PyModule_AddIntMacro(m, RCVALL_ON);
7157 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007158#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007160#endif
7161#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007163#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007164#endif /* _MSTCPIP_ */
7165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007166 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007167#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007168 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007169#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007170 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007171}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007172
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007173
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007174#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007175#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007176
7177/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007178/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007179
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007180int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007181inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007182{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007183 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007184#if (SIZEOF_INT != 4)
7185#error "Not sure if in_addr_t exists and int is not 32-bits."
7186#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007187 unsigned int packed_addr;
7188 packed_addr = inet_addr(src);
7189 if (packed_addr == INADDR_NONE)
7190 return 0;
7191 memcpy(dst, &packed_addr, 4);
7192 return 1;
7193 }
7194 /* Should set errno to EAFNOSUPPORT */
7195 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007196}
7197
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007198const char *
7199inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007200{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007201 if (af == AF_INET) {
7202 struct in_addr packed_addr;
7203 if (size < 16)
7204 /* Should set errno to ENOSPC. */
7205 return NULL;
7206 memcpy(&packed_addr, src, sizeof(packed_addr));
7207 return strncpy(dst, inet_ntoa(packed_addr), size);
7208 }
7209 /* Should set errno to EAFNOSUPPORT */
7210 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007211}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007212
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007213#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007214#endif