blob: a33c12740c1843714de7893baeac4d1c7221cf4a [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Steve Dower65e4cb12014-11-22 12:54:57 -0800287#if defined(_MSC_VER) && _MSC_VER >= 1800
288/* Provides the IsWindows7SP1OrGreater() function */
289#include <VersionHelpers.h>
290#endif
291
Jeremy Hylton22308652001-02-02 03:23:09 +0000292#endif
293
Skip Montanaro7befb992004-02-10 16:50:21 +0000294#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000295
Neal Norwitz39d22e52002-11-02 19:55:21 +0000296#ifndef O_NONBLOCK
297# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
299
Trent Micka708d6e2004-09-07 17:48:26 +0000300/* include Python's addrinfo.h unless it causes trouble */
301#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
302 /* Do not include addinfo.h on some newer IRIX versions.
303 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
304 * for example, but not by 6.5.10.
305 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000307 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
308 * EAI_* constants are defined in (the already included) ws2tcpip.h.
309 */
310#else
311# include "addrinfo.h"
312#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000313
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000314#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000315#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000316int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000317const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000318#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000319#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000321#ifdef __APPLE__
322/* On OS X, getaddrinfo returns no error indication of lookup
323 failure, so we must use the emulation instead of the libinfo
324 implementation. Unfortunately, performing an autoconf test
325 for this bug would require DNS access for the machine performing
326 the configuration, which is not acceptable. Therefore, we
327 determine the bug just by checking for __APPLE__. If this bug
328 gets ever fixed, perhaps checking for sys/version.h would be
329 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#ifndef HAVE_GETNAMEINFO
331/* This bug seems to be fixed in Jaguar. Ths easiest way I could
332 Find to check for Jaguar is that it has getnameinfo(), which
333 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
337#ifdef HAVE_INET_ATON
338#define USE_INET_ATON_WEAKLINK
339#endif
340
Jack Jansen84262fb2002-07-02 14:40:42 +0000341#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000343/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345/* avoid clashes with the C library definition of the symbol. */
346#define getaddrinfo fake_getaddrinfo
347#define gai_strerror fake_gai_strerror
348#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349#include "getaddrinfo.c"
350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getnameinfo.c"
354#endif
355
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000356#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358#endif
359
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000360#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000361#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000362#define EAFNOSUPPORT WSAEAFNOSUPPORT
363#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000365
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#ifndef SOCKETCLOSE
367#define SOCKETCLOSE close
368#endif
369
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000370#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#define USE_BLUETOOTH 1
372#if defined(__FreeBSD__)
373#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
374#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376#define SOL_HCI SOL_HCI_RAW
377#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#define sockaddr_l2 sockaddr_l2cap
379#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
382#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000383#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385#define sockaddr_l2 sockaddr_bt
386#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#define SOL_HCI BTPROTO_HCI
390#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
400#endif
401#endif
402
Charles-François Natali8b759652011-12-23 16:44:51 +0100403/* Convert "sock_addr_t *" to "struct sockaddr *". */
404#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405
Martin v. Löwise9416172003-05-03 10:12:45 +0000406/*
407 * Constants for getnameinfo()
408 */
409#if !defined(NI_MAXHOST)
410#define NI_MAXHOST 1025
411#endif
412#if !defined(NI_MAXSERV)
413#define NI_MAXSERV 32
414#endif
415
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000416#ifndef INVALID_SOCKET /* MS defines this */
417#define INVALID_SOCKET (-1)
418#endif
419
Charles-François Natali0cc86852013-09-13 19:53:08 +0200420#ifndef INADDR_NONE
421#define INADDR_NONE (-1)
422#endif
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* XXX There's a problem here: *static* functions are not supposed to have
425 a Py prefix (or use CapitalizedWords). Later... */
426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* Global variable holding the exception type for errors detected
428 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429static PyObject *socket_herror;
430static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000431static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432
Tim Peters643a7fc2002-02-17 04:13:21 +0000433/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 The sock_type variable contains pointers to various functions,
435 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000436 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000437static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#if defined(HAVE_POLL_H)
440#include <poll.h>
441#elif defined(HAVE_SYS_POLL_H)
442#include <sys/poll.h>
443#endif
444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445/* Largest value to try to store in a socklen_t (used when handling
446 ancillary data). POSIX requires socklen_t to hold at least
447 (2**31)-1 and recommends against storing larger values, but
448 socklen_t was originally int in the BSD interface, so to be on the
449 safe side we use the smaller of (2**31)-1 and INT_MAX. */
450#if INT_MAX > 0x7fffffff
451#define SOCKLEN_T_LIMIT 0x7fffffff
452#else
453#define SOCKLEN_T_LIMIT INT_MAX
454#endif
455
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457/* Instead of select(), we'll use poll() since poll() works on any fd. */
458#define IS_SELECTABLE(s) 1
459/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000460#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461/* If there's no timeout left, we don't have to call select, so it's a safe,
462 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000465
466static PyObject*
467select_error(void)
468{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471}
472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000473#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000474#ifndef WSAEAGAIN
475#define WSAEAGAIN WSAEWOULDBLOCK
476#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#define CHECK_ERRNO(expected) \
478 (WSAGetLastError() == WSA ## expected)
479#else
480#define CHECK_ERRNO(expected) \
481 (errno == expected)
482#endif
483
Victor Stinnerdaf45552013-08-28 00:53:59 +0200484#ifdef MS_WINDOWS
485/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
486static int support_wsa_no_inherit = -1;
487#endif
488
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489/* Convenience function to raise an error according to errno
490 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491
Guido van Rossum73624e91994-10-10 17:59:00 +0000492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000493set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000495#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 int err_no = WSAGetLastError();
497 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
498 recognizes the error codes used by both GetLastError() and
499 WSAGetLastError */
500 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200501 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000502#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000503
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200504 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505}
506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512
513#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (v != NULL) {
519 PyErr_SetObject(socket_herror, v);
520 Py_DECREF(v);
521 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524}
525
526
527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531
Martin v. Löwis272cb402002-03-01 08:31:07 +0000532#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 /* EAI_SYSTEM is not available on Windows XP. */
534 if (error == EAI_SYSTEM)
535 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000536#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000538#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 if (v != NULL) {
544 PyErr_SetObject(socket_gaierror, v);
545 Py_DECREF(v);
546 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549}
550
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000551/* Function to perform the setting of socket blocking mode
552 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000553static int
554internal_setblocking(PySocketSockObject *s, int block)
555{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200556#ifdef MS_WINDOWS
557 u_long arg;
558#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100559#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100560 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100561 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000562#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000563#ifdef SOCK_NONBLOCK
564 if (block)
565 s->sock_type &= (~SOCK_NONBLOCK);
566 else
567 s->sock_type |= SOCK_NONBLOCK;
568#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100572#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 block = !block;
574 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
577 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100578 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 else
Victor Stinner9a954832013-12-04 00:41:24 +0100580 new_delay_flag = delay_flag | O_NONBLOCK;
581 if (new_delay_flag != delay_flag)
582 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
583#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585 arg = !block;
586 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Since these don't return anything */
591 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592}
593
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000594static int
Victor Stinner416f2e62015-03-31 13:56:29 +0200595internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval,
596 int error)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100599#ifdef HAVE_POLL
600 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200601 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100602#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200603 fd_set fds, efds;
Victor Stinner71694d52015-03-28 01:18:54 +0100604 struct timeval tv;
605#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000606
Victor Stinnerb7df3142015-03-27 22:59:32 +0100607#ifdef WITH_THREAD
608 /* must be called with the GIL held */
609 assert(PyGILState_Check());
610#endif
611
Victor Stinner416f2e62015-03-31 13:56:29 +0200612 /* Error condition is for output only */
613 assert(!(error && !writing));
614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner71694d52015-03-28 01:18:54 +0100616 if (s->sock_timeout <= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Guard against closed socket */
620 if (s->sock_fd < 0)
621 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000622
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000623 /* Handling this condition here simplifies the select loops */
Victor Stinner71694d52015-03-28 01:18:54 +0100624 if (interval < 0)
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000625 return 1;
626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* Prefer poll, if available, since you can poll() any fd
628 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000629#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100630 pollfd.fd = s->sock_fd;
631 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner416f2e62015-03-31 13:56:29 +0200632 if (error)
633 pollfd.events |= POLLERR;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634
Victor Stinner71694d52015-03-28 01:18:54 +0100635 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinnere6951c62015-03-31 13:50:44 +0200636 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
637 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000638
Victor Stinner71694d52015-03-28 01:18:54 +0100639 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200640 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100641 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000642#else
Victor Stinner869e1772015-03-30 03:49:14 +0200643 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000644
Victor Stinner71694d52015-03-28 01:18:54 +0100645 FD_ZERO(&fds);
646 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200647 FD_ZERO(&efds);
648 if (error)
649 FD_SET(s->sock_fd, &efds);
Victor Stinner71694d52015-03-28 01:18:54 +0100650
651 /* See if the socket is ready */
652 Py_BEGIN_ALLOW_THREADS;
653 if (writing)
654 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200655 NULL, &fds, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100656 else
657 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200658 &fds, NULL, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100659 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 if (n < 0)
663 return -1;
664 if (n == 0)
665 return 1;
666 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667}
668
Victor Stinnere6951c62015-03-31 13:50:44 +0200669/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
670 The argument writing indicates the direction.
671 This does not raise an exception; we'll let our caller do that
672 after they've reacquired the interpreter lock.
673 Returns 1 on timeout, -1 on error, 0 otherwise. */
674static int
675internal_select(PySocketSockObject *s, int writing, _PyTime_t interval)
676{
Victor Stinner416f2e62015-03-31 13:56:29 +0200677 return internal_select_impl(s, writing, interval, 0);
Victor Stinnere6951c62015-03-31 13:50:44 +0200678}
679
680static int
681internal_connect_select(PySocketSockObject *s)
682{
Victor Stinnerdd83bd22015-03-31 14:24:47 +0200683 return internal_select_impl(s, 1, s->sock_timeout, 1);
Victor Stinnere6951c62015-03-31 13:50:44 +0200684}
685
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000686/*
687 Two macros for automatic retry of select() in case of false positives
688 (for example, select() could indicate a socket is ready for reading
689 but the data then discarded by the OS because of a wrong checksum).
690 Here is an example of use:
691
692 BEGIN_SELECT_LOOP(s)
Victor Stinnerb7df3142015-03-27 22:59:32 +0100693
Victor Stinner391fa712015-03-31 13:15:31 +0200694 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +0100695
696 if (!timeout) {
697 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000698 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinnerb7df3142015-03-27 22:59:32 +0100699 Py_END_ALLOW_THREADS
700 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000701 if (timeout == 1) {
702 PyErr_SetString(socket_timeout, "timed out");
703 return -1;
704 }
705 END_SELECT_LOOP(s)
706*/
707
708#define BEGIN_SELECT_LOOP(s) \
709 { \
Victor Stinner71694d52015-03-28 01:18:54 +0100710 _PyTime_t deadline = 0; \
711 _PyTime_t interval = s->sock_timeout; \
712 int has_timeout = (s->sock_timeout > 0); \
713 if (has_timeout) \
714 deadline = _PyTime_GetMonotonicClock() + interval; \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000715 while (1) { \
716 errno = 0; \
717
718#define END_SELECT_LOOP(s) \
719 if (!has_timeout || \
720 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
721 break; \
Victor Stinner71694d52015-03-28 01:18:54 +0100722 interval = deadline - _PyTime_GetMonotonicClock(); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000723 } \
724 } \
725
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000726/* Initialize a new socket object. */
727
Victor Stinner71694d52015-03-28 01:18:54 +0100728static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000729
Martin v. Löwis1a214512008-06-11 05:26:20 +0000730static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000731init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 s->sock_fd = fd;
735 s->sock_family = family;
736 s->sock_type = type;
737 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000740#ifdef SOCK_NONBLOCK
741 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100742 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000743 else
744#endif
745 {
746 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100747 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000748 internal_setblocking(s, 0);
749 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000750
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000751}
752
753
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754/* Create a new socket object.
755 This just creates the object and initializes it.
756 If the creation fails, return NULL and set an exception (implicit
757 in NEWOBJ()). */
758
Guido van Rossum73624e91994-10-10 17:59:00 +0000759static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000760new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 PySocketSockObject *s;
763 s = (PySocketSockObject *)
764 PyType_GenericNew(&sock_type, NULL, NULL);
765 if (s != NULL)
766 init_sockobject(s, fd, family, type, proto);
767 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768}
769
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770
Guido van Rossum48a680c2001-03-02 06:34:14 +0000771/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000772 thread to be in gethostbyname or getaddrinfo */
773#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200774static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000775#endif
776
777
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778/* Convert a string specifying a host name or one of a few symbolic
779 names to a numeric IP address. This usually calls gethostbyname()
780 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782 an error occurred; then an exception is raised. */
783
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000784static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000785setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 struct addrinfo hints, *res;
788 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
791 if (name[0] == '\0') {
792 int siz;
793 memset(&hints, 0, sizeof(hints));
794 hints.ai_family = af;
795 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
796 hints.ai_flags = AI_PASSIVE;
797 Py_BEGIN_ALLOW_THREADS
798 ACQUIRE_GETADDRINFO_LOCK
799 error = getaddrinfo(NULL, "0", &hints, &res);
800 Py_END_ALLOW_THREADS
801 /* We assume that those thread-unsafe getaddrinfo() versions
802 *are* safe regarding their return value, ie. that a
803 subsequent call to getaddrinfo() does not destroy the
804 outcome of the first call. */
805 RELEASE_GETADDRINFO_LOCK
806 if (error) {
807 set_gaierror(error);
808 return -1;
809 }
810 switch (res->ai_family) {
811 case AF_INET:
812 siz = 4;
813 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000814#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 case AF_INET6:
816 siz = 16;
817 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 default:
820 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200821 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 "unsupported address family");
823 return -1;
824 }
825 if (res->ai_next) {
826 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200827 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 "wildcard resolved to multiple address");
829 return -1;
830 }
831 if (res->ai_addrlen < addr_ret_size)
832 addr_ret_size = res->ai_addrlen;
833 memcpy(addr_ret, res->ai_addr, addr_ret_size);
834 freeaddrinfo(res);
835 return siz;
836 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200837 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100838 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200839 if (strcmp(name, "255.255.255.255") == 0 ||
840 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 struct sockaddr_in *sin;
842 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200843 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 "address family mismatched");
845 return -1;
846 }
847 sin = (struct sockaddr_in *)addr_ret;
848 memset((void *) sin, '\0', sizeof(*sin));
849 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 sin->sin_addr.s_addr = INADDR_BROADCAST;
854 return sizeof(sin->sin_addr);
855 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200856
857 /* avoid a name resolution in case of numeric address */
858#ifdef HAVE_INET_PTON
859 /* check for an IPv4 address */
860 if (af == AF_UNSPEC || af == AF_INET) {
861 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
862 memset(sin, 0, sizeof(*sin));
863 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
864 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000865#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200866 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000867#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200868 return 4;
869 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200871#ifdef ENABLE_IPV6
872 /* check for an IPv6 address - if the address contains a scope ID, we
873 * fallback to getaddrinfo(), which can handle translation from interface
874 * name to interface index */
875 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
876 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
877 memset(sin, 0, sizeof(*sin));
878 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
879 sin->sin6_family = AF_INET6;
880#ifdef HAVE_SOCKADDR_SA_LEN
881 sin->sin6_len = sizeof(*sin);
882#endif
883 return 16;
884 }
885 }
886#endif /* ENABLE_IPV6 */
887#else /* HAVE_INET_PTON */
888 /* check for an IPv4 address */
889 if (af == AF_INET || af == AF_UNSPEC) {
890 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
891 memset(sin, 0, sizeof(*sin));
892 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
893 sin->sin_family = AF_INET;
894#ifdef HAVE_SOCKADDR_SA_LEN
895 sin->sin_len = sizeof(*sin);
896#endif
897 return 4;
898 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100899 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200900#endif /* HAVE_INET_PTON */
901
902 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 memset(&hints, 0, sizeof(hints));
904 hints.ai_family = af;
905 Py_BEGIN_ALLOW_THREADS
906 ACQUIRE_GETADDRINFO_LOCK
907 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000908#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 if (error == EAI_NONAME && af == AF_UNSPEC) {
910 /* On Tru64 V5.1, numeric-to-addr conversion fails
911 if no address family is given. Assume IPv4 for now.*/
912 hints.ai_family = AF_INET;
913 error = getaddrinfo(name, NULL, &hints, &res);
914 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 Py_END_ALLOW_THREADS
917 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
918 if (error) {
919 set_gaierror(error);
920 return -1;
921 }
922 if (res->ai_addrlen < addr_ret_size)
923 addr_ret_size = res->ai_addrlen;
924 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
925 freeaddrinfo(res);
926 switch (addr_ret->sa_family) {
927 case AF_INET:
928 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000929#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 case AF_INET6:
931 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200934 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 return -1;
936 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937}
938
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940/* Create a string object representing an IP address.
941 This is always a string of the form 'dd.dd.dd.dd' (with variable
942 size numbers). */
943
Guido van Rossum73624e91994-10-10 17:59:00 +0000944static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000945makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 char buf[NI_MAXHOST];
948 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
951 NI_NUMERICHOST);
952 if (error) {
953 set_gaierror(error);
954 return NULL;
955 }
956 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957}
958
959
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000960#ifdef USE_BLUETOOTH
961/* Convert a string representation of a Bluetooth address into a numeric
962 address. Returns the length (6), or raises an exception and returns -1 if
963 an error occurred. */
964
965static int
966setbdaddr(char *name, bdaddr_t *bdaddr)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 unsigned int b0, b1, b2, b3, b4, b5;
969 char ch;
970 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
973 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
974 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
975 bdaddr->b[0] = b0;
976 bdaddr->b[1] = b1;
977 bdaddr->b[2] = b2;
978 bdaddr->b[3] = b3;
979 bdaddr->b[4] = b4;
980 bdaddr->b[5] = b5;
981 return 6;
982 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200983 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 return -1;
985 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000986}
987
988/* Create a string representation of the Bluetooth address. This is always a
989 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
990 value (zero padded if necessary). */
991
992static PyObject *
993makebdaddr(bdaddr_t *bdaddr)
994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
998 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
999 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1000 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001001}
1002#endif
1003
1004
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005/* Create an object representing the given socket address,
1006 suitable for passing it back to bind(), connect() etc.
1007 The family field of the sockaddr structure is inspected
1008 to determine what kind of address it really is. */
1009
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001012makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 if (addrlen == 0) {
1015 /* No address -- may be recvfrom() from known socket */
1016 Py_INCREF(Py_None);
1017 return Py_None;
1018 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 case AF_INET:
1023 {
1024 struct sockaddr_in *a;
1025 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1026 PyObject *ret = NULL;
1027 if (addrobj) {
1028 a = (struct sockaddr_in *)addr;
1029 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1030 Py_DECREF(addrobj);
1031 }
1032 return ret;
1033 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001035#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 case AF_UNIX:
1037 {
1038 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001039#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1041 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001042 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 }
1044 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001045#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 {
1047 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001048 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 }
1050 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001051#endif /* AF_UNIX */
1052
Martin v. Löwis11017b12006-01-14 18:12:57 +00001053#if defined(AF_NETLINK)
1054 case AF_NETLINK:
1055 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1057 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001058 }
1059#endif /* AF_NETLINK */
1060
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001061#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 case AF_INET6:
1063 {
1064 struct sockaddr_in6 *a;
1065 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1066 PyObject *ret = NULL;
1067 if (addrobj) {
1068 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001069 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 addrobj,
1071 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001072 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 a->sin6_scope_id);
1074 Py_DECREF(addrobj);
1075 }
1076 return ret;
1077 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001078#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001080#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 case AF_BLUETOOTH:
1082 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 case BTPROTO_L2CAP:
1085 {
1086 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1087 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1088 PyObject *ret = NULL;
1089 if (addrobj) {
1090 ret = Py_BuildValue("Oi",
1091 addrobj,
1092 _BT_L2_MEMB(a, psm));
1093 Py_DECREF(addrobj);
1094 }
1095 return ret;
1096 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case BTPROTO_RFCOMM:
1099 {
1100 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1101 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1102 PyObject *ret = NULL;
1103 if (addrobj) {
1104 ret = Py_BuildValue("Oi",
1105 addrobj,
1106 _BT_RC_MEMB(a, channel));
1107 Py_DECREF(addrobj);
1108 }
1109 return ret;
1110 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 case BTPROTO_HCI:
1113 {
1114 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001115#if defined(__NetBSD__) || defined(__DragonFly__)
1116 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 PyObject *ret = NULL;
1119 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1120 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001123
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001124#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 case BTPROTO_SCO:
1126 {
1127 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1128 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1129 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130#endif
1131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 default:
1133 PyErr_SetString(PyExc_ValueError,
1134 "Unknown Bluetooth protocol");
1135 return NULL;
1136 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137#endif
1138
Antoine Pitroub156a462010-10-27 20:13:57 +00001139#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 case AF_PACKET:
1141 {
1142 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1143 char *ifname = "";
1144 struct ifreq ifr;
1145 /* need to look up interface name give index */
1146 if (a->sll_ifindex) {
1147 ifr.ifr_ifindex = a->sll_ifindex;
1148 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1149 ifname = ifr.ifr_name;
1150 }
1151 return Py_BuildValue("shbhy#",
1152 ifname,
1153 ntohs(a->sll_protocol),
1154 a->sll_pkttype,
1155 a->sll_hatype,
1156 a->sll_addr,
1157 a->sll_halen);
1158 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001159#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001160
Christian Heimes043d6f62008-01-07 17:19:16 +00001161#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 case AF_TIPC:
1163 {
1164 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1165 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1166 return Py_BuildValue("IIIII",
1167 a->addrtype,
1168 a->addr.nameseq.type,
1169 a->addr.nameseq.lower,
1170 a->addr.nameseq.upper,
1171 a->scope);
1172 } else if (a->addrtype == TIPC_ADDR_NAME) {
1173 return Py_BuildValue("IIIII",
1174 a->addrtype,
1175 a->addr.name.name.type,
1176 a->addr.name.name.instance,
1177 a->addr.name.name.instance,
1178 a->scope);
1179 } else if (a->addrtype == TIPC_ADDR_ID) {
1180 return Py_BuildValue("IIIII",
1181 a->addrtype,
1182 a->addr.id.node,
1183 a->addr.id.ref,
1184 0,
1185 a->scope);
1186 } else {
1187 PyErr_SetString(PyExc_ValueError,
1188 "Invalid address type");
1189 return NULL;
1190 }
1191 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001192#endif
1193
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001194#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001195 case AF_CAN:
1196 {
1197 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1198 char *ifname = "";
1199 struct ifreq ifr;
1200 /* need to look up interface name given index */
1201 if (a->can_ifindex) {
1202 ifr.ifr_ifindex = a->can_ifindex;
1203 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1204 ifname = ifr.ifr_name;
1205 }
1206
1207 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1208 ifname,
1209 a->can_family);
1210 }
1211#endif
1212
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001213#ifdef PF_SYSTEM
1214 case PF_SYSTEM:
1215 switch(proto) {
1216#ifdef SYSPROTO_CONTROL
1217 case SYSPROTO_CONTROL:
1218 {
1219 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1220 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1221 }
1222#endif
1223 default:
1224 PyErr_SetString(PyExc_ValueError,
1225 "Invalid address type");
1226 return 0;
1227 }
1228#endif
1229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 default:
1233 /* If we don't know the address family, don't raise an
1234 exception -- return it as an (int, bytes) tuple. */
1235 return Py_BuildValue("iy#",
1236 addr->sa_family,
1237 addr->sa_data,
1238 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001241}
1242
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001243/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1244 (in particular, numeric IP addresses). */
1245struct maybe_idna {
1246 PyObject *obj;
1247 char *buf;
1248};
1249
1250static void
1251idna_cleanup(struct maybe_idna *data)
1252{
1253 Py_CLEAR(data->obj);
1254}
1255
1256static int
1257idna_converter(PyObject *obj, struct maybe_idna *data)
1258{
1259 size_t len;
1260 PyObject *obj2, *obj3;
1261 if (obj == NULL) {
1262 idna_cleanup(data);
1263 return 1;
1264 }
1265 data->obj = NULL;
1266 len = -1;
1267 if (PyBytes_Check(obj)) {
1268 data->buf = PyBytes_AsString(obj);
1269 len = PyBytes_Size(obj);
1270 }
1271 else if (PyByteArray_Check(obj)) {
1272 data->buf = PyByteArray_AsString(obj);
1273 len = PyByteArray_Size(obj);
1274 }
1275 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1276 data->buf = PyUnicode_DATA(obj);
1277 len = PyUnicode_GET_LENGTH(obj);
1278 }
1279 else {
1280 obj2 = PyUnicode_FromObject(obj);
1281 if (!obj2) {
1282 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1283 obj->ob_type->tp_name);
1284 return 0;
1285 }
1286 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1287 Py_DECREF(obj2);
1288 if (!obj3) {
1289 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1290 return 0;
1291 }
1292 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001293 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001294 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1295 return 0;
1296 }
1297 data->obj = obj3;
1298 data->buf = PyBytes_AS_STRING(obj3);
1299 len = PyBytes_GET_SIZE(obj3);
1300 }
1301 if (strlen(data->buf) != len) {
1302 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001303 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001304 return 0;
1305 }
1306 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001307}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308
1309/* Parse a socket address argument according to the socket object's
1310 address family. Return 1 if the address was in the proper format,
1311 0 of not. The address is returned through addr_ret, its length
1312 through len_ret. */
1313
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001314static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001315getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001319
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001320#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case AF_UNIX:
1322 {
1323 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001324 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001325 int retval = 0;
1326
1327 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1328 allow embedded nulls on Linux. */
1329 if (PyUnicode_Check(args)) {
1330 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1331 return 0;
1332 }
1333 else
1334 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001335 if (!PyArg_Parse(args, "y*", &path)) {
1336 Py_DECREF(args);
1337 return retval;
1338 }
1339 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001342#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001343 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001345 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001346 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001348 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 }
1350 }
1351 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001352#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 {
1354 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001355 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001356 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001358 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001360 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 }
1362 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001363 memcpy(addr->sun_path, path.buf, path.len);
1364 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001365 retval = 1;
1366 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001367 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001368 Py_DECREF(args);
1369 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001371#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372
Martin v. Löwis11017b12006-01-14 18:12:57 +00001373#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 case AF_NETLINK:
1375 {
1376 struct sockaddr_nl* addr;
1377 int pid, groups;
1378 addr = (struct sockaddr_nl *)addr_ret;
1379 if (!PyTuple_Check(args)) {
1380 PyErr_Format(
1381 PyExc_TypeError,
1382 "getsockaddrarg: "
1383 "AF_NETLINK address must be tuple, not %.500s",
1384 Py_TYPE(args)->tp_name);
1385 return 0;
1386 }
1387 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1388 return 0;
1389 addr->nl_family = AF_NETLINK;
1390 addr->nl_pid = pid;
1391 addr->nl_groups = groups;
1392 *len_ret = sizeof(*addr);
1393 return 1;
1394 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001395#endif
1396
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001397#ifdef AF_RDS
1398 case AF_RDS:
1399 /* RDS sockets use sockaddr_in: fall-through */
1400#endif
1401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 case AF_INET:
1403 {
1404 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001405 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 int port, result;
1407 if (!PyTuple_Check(args)) {
1408 PyErr_Format(
1409 PyExc_TypeError,
1410 "getsockaddrarg: "
1411 "AF_INET address must be tuple, not %.500s",
1412 Py_TYPE(args)->tp_name);
1413 return 0;
1414 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001415 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1416 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 return 0;
1418 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001419 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001421 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 if (result < 0)
1423 return 0;
1424 if (port < 0 || port > 0xffff) {
1425 PyErr_SetString(
1426 PyExc_OverflowError,
1427 "getsockaddrarg: port must be 0-65535.");
1428 return 0;
1429 }
1430 addr->sin_family = AF_INET;
1431 addr->sin_port = htons((short)port);
1432 *len_ret = sizeof *addr;
1433 return 1;
1434 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001436#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 case AF_INET6:
1438 {
1439 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001440 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001441 int port, result;
1442 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 flowinfo = scope_id = 0;
1444 if (!PyTuple_Check(args)) {
1445 PyErr_Format(
1446 PyExc_TypeError,
1447 "getsockaddrarg: "
1448 "AF_INET6 address must be tuple, not %.500s",
1449 Py_TYPE(args)->tp_name);
1450 return 0;
1451 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001452 if (!PyArg_ParseTuple(args, "O&i|II",
1453 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 &scope_id)) {
1455 return 0;
1456 }
1457 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001458 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001460 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 if (result < 0)
1462 return 0;
1463 if (port < 0 || port > 0xffff) {
1464 PyErr_SetString(
1465 PyExc_OverflowError,
1466 "getsockaddrarg: port must be 0-65535.");
1467 return 0;
1468 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001469 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001470 PyErr_SetString(
1471 PyExc_OverflowError,
1472 "getsockaddrarg: flowinfo must be 0-1048575.");
1473 return 0;
1474 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 addr->sin6_family = s->sock_family;
1476 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001477 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 addr->sin6_scope_id = scope_id;
1479 *len_ret = sizeof *addr;
1480 return 1;
1481 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001482#endif
1483
Hye-Shik Chang81268602004-02-02 06:05:24 +00001484#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 case AF_BLUETOOTH:
1486 {
1487 switch (s->sock_proto) {
1488 case BTPROTO_L2CAP:
1489 {
1490 struct sockaddr_l2 *addr;
1491 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 addr = (struct sockaddr_l2 *)addr_ret;
1494 memset(addr, 0, sizeof(struct sockaddr_l2));
1495 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1496 if (!PyArg_ParseTuple(args, "si", &straddr,
1497 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001498 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 "wrong format");
1500 return 0;
1501 }
1502 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1503 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 *len_ret = sizeof *addr;
1506 return 1;
1507 }
1508 case BTPROTO_RFCOMM:
1509 {
1510 struct sockaddr_rc *addr;
1511 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 addr = (struct sockaddr_rc *)addr_ret;
1514 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1515 if (!PyArg_ParseTuple(args, "si", &straddr,
1516 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001517 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 "wrong format");
1519 return 0;
1520 }
1521 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1522 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 *len_ret = sizeof *addr;
1525 return 1;
1526 }
1527 case BTPROTO_HCI:
1528 {
1529 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001530#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001531 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001532
Alexander Belopolskye239d232010-12-08 23:31:48 +00001533 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001534 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001535 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001536 "wrong format");
1537 return 0;
1538 }
1539 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1540 return 0;
1541#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1543 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001544 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 "wrong format");
1546 return 0;
1547 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 *len_ret = sizeof *addr;
1550 return 1;
1551 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001552#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 case BTPROTO_SCO:
1554 {
1555 struct sockaddr_sco *addr;
1556 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 addr = (struct sockaddr_sco *)addr_ret;
1559 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1560 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001561 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 "wrong format");
1563 return 0;
1564 }
1565 straddr = PyBytes_AS_STRING(args);
1566 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1567 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 *len_ret = sizeof *addr;
1570 return 1;
1571 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001574 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 return 0;
1576 }
1577 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001578#endif
1579
Antoine Pitroub156a462010-10-27 20:13:57 +00001580#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 case AF_PACKET:
1582 {
1583 struct sockaddr_ll* addr;
1584 struct ifreq ifr;
1585 char *interfaceName;
1586 int protoNumber;
1587 int hatype = 0;
1588 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001589 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (!PyTuple_Check(args)) {
1592 PyErr_Format(
1593 PyExc_TypeError,
1594 "getsockaddrarg: "
1595 "AF_PACKET address must be tuple, not %.500s",
1596 Py_TYPE(args)->tp_name);
1597 return 0;
1598 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001599 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001601 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 return 0;
1603 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1604 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1605 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1606 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001607 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 return 0;
1609 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001610 if (haddr.buf && haddr.len > 8) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "Hardware address must be 8 bytes or less");
1613 PyBuffer_Release(&haddr);
1614 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 }
1616 if (protoNumber < 0 || protoNumber > 0xffff) {
1617 PyErr_SetString(
1618 PyExc_OverflowError,
1619 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001620 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 return 0;
1622 }
1623 addr = (struct sockaddr_ll*)addr_ret;
1624 addr->sll_family = AF_PACKET;
1625 addr->sll_protocol = htons((short)protoNumber);
1626 addr->sll_ifindex = ifr.ifr_ifindex;
1627 addr->sll_pkttype = pkttype;
1628 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001629 if (haddr.buf) {
1630 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1631 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001633 else
1634 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001636 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 return 1;
1638 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001639#endif
1640
Christian Heimes043d6f62008-01-07 17:19:16 +00001641#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 case AF_TIPC:
1643 {
1644 unsigned int atype, v1, v2, v3;
1645 unsigned int scope = TIPC_CLUSTER_SCOPE;
1646 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 if (!PyTuple_Check(args)) {
1649 PyErr_Format(
1650 PyExc_TypeError,
1651 "getsockaddrarg: "
1652 "AF_TIPC address must be tuple, not %.500s",
1653 Py_TYPE(args)->tp_name);
1654 return 0;
1655 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 if (!PyArg_ParseTuple(args,
1658 "IIII|I;Invalid TIPC address format",
1659 &atype, &v1, &v2, &v3, &scope))
1660 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 addr = (struct sockaddr_tipc *) addr_ret;
1663 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 addr->family = AF_TIPC;
1666 addr->scope = scope;
1667 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (atype == TIPC_ADDR_NAMESEQ) {
1670 addr->addr.nameseq.type = v1;
1671 addr->addr.nameseq.lower = v2;
1672 addr->addr.nameseq.upper = v3;
1673 } else if (atype == TIPC_ADDR_NAME) {
1674 addr->addr.name.name.type = v1;
1675 addr->addr.name.name.instance = v2;
1676 } else if (atype == TIPC_ADDR_ID) {
1677 addr->addr.id.node = v1;
1678 addr->addr.id.ref = v2;
1679 } else {
1680 /* Shouldn't happen */
1681 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1682 return 0;
1683 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 return 1;
1688 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001689#endif
1690
Vinay Sajiped6783f2014-03-21 11:44:32 +00001691#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001692 case AF_CAN:
1693 switch (s->sock_proto) {
1694 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001695 /* fall-through */
1696 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001697 {
1698 struct sockaddr_can *addr;
1699 PyObject *interfaceName;
1700 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001701 Py_ssize_t len;
1702
Benjamin Peterson18b71912013-05-16 15:29:44 -05001703 addr = (struct sockaddr_can *)addr_ret;
1704
Charles-François Natali47413c12011-10-06 19:47:44 +02001705 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1706 &interfaceName))
1707 return 0;
1708
1709 len = PyBytes_GET_SIZE(interfaceName);
1710
1711 if (len == 0) {
1712 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001713 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001714 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1715 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001716 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1717 s->errorhandler();
1718 Py_DECREF(interfaceName);
1719 return 0;
1720 }
1721 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001722 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001723 "AF_CAN interface name too long");
1724 Py_DECREF(interfaceName);
1725 return 0;
1726 }
1727
1728 addr->can_family = AF_CAN;
1729 addr->can_ifindex = ifr.ifr_ifindex;
1730
1731 *len_ret = sizeof(*addr);
1732 Py_DECREF(interfaceName);
1733 return 1;
1734 }
1735 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001736 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001737 "getsockaddrarg: unsupported CAN protocol");
1738 return 0;
1739 }
1740#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001741
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001742#ifdef PF_SYSTEM
1743 case PF_SYSTEM:
1744 switch (s->sock_proto) {
1745#ifdef SYSPROTO_CONTROL
1746 case SYSPROTO_CONTROL:
1747 {
1748 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001749
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001750 addr = (struct sockaddr_ctl *)addr_ret;
1751 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001752 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001753
1754 if (PyUnicode_Check(args)) {
1755 struct ctl_info info;
1756 PyObject *ctl_name;
1757
1758 if (!PyArg_Parse(args, "O&",
1759 PyUnicode_FSConverter, &ctl_name)) {
1760 return 0;
1761 }
1762
Victor Stinnerf50e1872015-03-20 11:32:24 +01001763 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001764 PyErr_SetString(PyExc_ValueError,
1765 "provided string is too long");
1766 Py_DECREF(ctl_name);
1767 return 0;
1768 }
1769 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1770 sizeof(info.ctl_name));
1771 Py_DECREF(ctl_name);
1772
1773 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1774 PyErr_SetString(PyExc_OSError,
1775 "cannot find kernel control with provided name");
1776 return 0;
1777 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001778
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001779 addr->sc_id = info.ctl_id;
1780 addr->sc_unit = 0;
1781 } else if (!PyArg_ParseTuple(args, "II",
1782 &(addr->sc_id), &(addr->sc_unit))) {
1783 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1784 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001785
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001786 return 0;
1787 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001788
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001789 *len_ret = sizeof(*addr);
1790 return 1;
1791 }
1792#endif
1793 default:
1794 PyErr_SetString(PyExc_OSError,
1795 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1796 return 0;
1797 }
1798#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001803 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001807}
1808
Guido van Rossum30a685f1991-06-27 15:51:29 +00001809
Guido van Rossum48a680c2001-03-02 06:34:14 +00001810/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001811 Return 1 if the family is known, 0 otherwise. The length is returned
1812 through len_ret. */
1813
1814static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001815getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001818
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001819#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 case AF_UNIX:
1821 {
1822 *len_ret = sizeof (struct sockaddr_un);
1823 return 1;
1824 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001825#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001826#if defined(AF_NETLINK)
1827 case AF_NETLINK:
1828 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 *len_ret = sizeof (struct sockaddr_nl);
1830 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001831 }
1832#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001833
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001834#ifdef AF_RDS
1835 case AF_RDS:
1836 /* RDS sockets use sockaddr_in: fall-through */
1837#endif
1838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 case AF_INET:
1840 {
1841 *len_ret = sizeof (struct sockaddr_in);
1842 return 1;
1843 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001844
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001845#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 case AF_INET6:
1847 {
1848 *len_ret = sizeof (struct sockaddr_in6);
1849 return 1;
1850 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001851#endif
1852
Hye-Shik Chang81268602004-02-02 06:05:24 +00001853#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 case AF_BLUETOOTH:
1855 {
1856 switch(s->sock_proto)
1857 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 case BTPROTO_L2CAP:
1860 *len_ret = sizeof (struct sockaddr_l2);
1861 return 1;
1862 case BTPROTO_RFCOMM:
1863 *len_ret = sizeof (struct sockaddr_rc);
1864 return 1;
1865 case BTPROTO_HCI:
1866 *len_ret = sizeof (struct sockaddr_hci);
1867 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001868#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 case BTPROTO_SCO:
1870 *len_ret = sizeof (struct sockaddr_sco);
1871 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001874 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 "unknown BT protocol");
1876 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 }
1879 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001880#endif
1881
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001882#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 case AF_PACKET:
1884 {
1885 *len_ret = sizeof (struct sockaddr_ll);
1886 return 1;
1887 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001888#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001889
Christian Heimes043d6f62008-01-07 17:19:16 +00001890#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 case AF_TIPC:
1892 {
1893 *len_ret = sizeof (struct sockaddr_tipc);
1894 return 1;
1895 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001896#endif
1897
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001898#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001899 case AF_CAN:
1900 {
1901 *len_ret = sizeof (struct sockaddr_can);
1902 return 1;
1903 }
1904#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001905
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001906#ifdef PF_SYSTEM
1907 case PF_SYSTEM:
1908 switch(s->sock_proto) {
1909#ifdef SYSPROTO_CONTROL
1910 case SYSPROTO_CONTROL:
1911 *len_ret = sizeof (struct sockaddr_ctl);
1912 return 1;
1913#endif
1914 default:
1915 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1916 "unknown PF_SYSTEM protocol");
1917 return 0;
1918 }
1919#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001924 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001928}
1929
1930
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001931/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1932 Currently, these methods are only compiled if the RFC 2292/3542
1933 CMSG_LEN() macro is available. Older systems seem to have used
1934 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1935 it may be possible to define CMSG_LEN() that way if it's not
1936 provided. Some architectures might need extra padding after the
1937 cmsghdr, however, and CMSG_LEN() would have to take account of
1938 this. */
1939#ifdef CMSG_LEN
1940/* If length is in range, set *result to CMSG_LEN(length) and return
1941 true; otherwise, return false. */
1942static int
1943get_CMSG_LEN(size_t length, size_t *result)
1944{
1945 size_t tmp;
1946
1947 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1948 return 0;
1949 tmp = CMSG_LEN(length);
1950 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1951 return 0;
1952 *result = tmp;
1953 return 1;
1954}
1955
1956#ifdef CMSG_SPACE
1957/* If length is in range, set *result to CMSG_SPACE(length) and return
1958 true; otherwise, return false. */
1959static int
1960get_CMSG_SPACE(size_t length, size_t *result)
1961{
1962 size_t tmp;
1963
1964 /* Use CMSG_SPACE(1) here in order to take account of the padding
1965 necessary before *and* after the data. */
1966 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1967 return 0;
1968 tmp = CMSG_SPACE(length);
1969 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1970 return 0;
1971 *result = tmp;
1972 return 1;
1973}
1974#endif
1975
1976/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1977 pointer in msg->msg_control with at least "space" bytes after it,
1978 and its cmsg_len member inside the buffer. */
1979static int
1980cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1981{
1982 size_t cmsg_offset;
1983 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1984 sizeof(cmsgh->cmsg_len));
1985
Charles-François Natali466517d2011-08-28 18:23:43 +02001986 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001987 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001988 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001989 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1990 annoying under OS X as it's unsigned there and so it triggers a
1991 tautological comparison warning under Clang when compared against 0.
1992 Since the check is valid on other platforms, silence the warning under
1993 Clang. */
1994 #ifdef __clang__
1995 #pragma clang diagnostic push
1996 #pragma clang diagnostic ignored "-Wtautological-compare"
1997 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02001998 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02001999 #pragma GCC diagnostic push
2000 #pragma GCC diagnostic ignored "-Wtype-limits"
2001 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002002 if (msg->msg_controllen < 0)
2003 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002004 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002005 #pragma GCC diagnostic pop
2006 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002007 #ifdef __clang__
2008 #pragma clang diagnostic pop
2009 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002010 if (space < cmsg_len_end)
2011 space = cmsg_len_end;
2012 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2013 return (cmsg_offset <= (size_t)-1 - space &&
2014 cmsg_offset + space <= msg->msg_controllen);
2015}
2016
2017/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2018 *space to number of bytes following it in the buffer and return
2019 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2020 msg->msg_controllen are valid. */
2021static int
2022get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2023{
2024 size_t data_offset;
2025 char *data_ptr;
2026
2027 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2028 return 0;
2029 data_offset = data_ptr - (char *)msg->msg_control;
2030 if (data_offset > msg->msg_controllen)
2031 return 0;
2032 *space = msg->msg_controllen - data_offset;
2033 return 1;
2034}
2035
2036/* If cmsgh is invalid or not contained in the buffer pointed to by
2037 msg->msg_control, return -1. If cmsgh is valid and its associated
2038 data is entirely contained in the buffer, set *data_len to the
2039 length of the associated data and return 0. If only part of the
2040 associated data is contained in the buffer but cmsgh is otherwise
2041 valid, set *data_len to the length contained in the buffer and
2042 return 1. */
2043static int
2044get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2045{
2046 size_t space, cmsg_data_len;
2047
2048 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2049 cmsgh->cmsg_len < CMSG_LEN(0))
2050 return -1;
2051 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2052 if (!get_cmsg_data_space(msg, cmsgh, &space))
2053 return -1;
2054 if (space >= cmsg_data_len) {
2055 *data_len = cmsg_data_len;
2056 return 0;
2057 }
2058 *data_len = space;
2059 return 1;
2060}
2061#endif /* CMSG_LEN */
2062
2063
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002064/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065
Guido van Rossum73624e91994-10-10 17:59:00 +00002066static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002067sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 sock_addr_t addrbuf;
2070 SOCKET_T newfd = INVALID_SOCKET;
2071 socklen_t addrlen;
2072 PyObject *sock = NULL;
2073 PyObject *addr = NULL;
2074 PyObject *res = NULL;
2075 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002076 int async_err = 0;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002077#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2078 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2079 static int accept4_works = -1;
2080#endif
2081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 if (!getsockaddrlen(s, &addrlen))
2083 return NULL;
2084 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 if (!IS_SELECTABLE(s))
2087 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002088
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002089 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002090 do {
Victor Stinner391fa712015-03-31 13:15:31 +02002091 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002092
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002093 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002094 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02002095#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002096 if (accept4_works != 0) {
2097 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2098 SOCK_CLOEXEC);
2099 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2100 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2101 accept4_works = (errno != ENOSYS);
2102 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002103 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002104 if (accept4_works == 0)
2105 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002106#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002107 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002108#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002109 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002110 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002111 } while (newfd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 if (timeout == 1) {
2113 PyErr_SetString(socket_timeout, "timed out");
2114 return NULL;
2115 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002116 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (newfd == INVALID_SOCKET)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002119 return (!async_err) ? s->errorhandler() : NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00002120
Victor Stinnerdaf45552013-08-28 00:53:59 +02002121#ifdef MS_WINDOWS
2122 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2123 PyErr_SetFromWindowsErr(0);
2124 SOCKETCLOSE(newfd);
2125 goto finally;
2126 }
2127#else
2128
2129#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2130 if (!accept4_works)
2131#endif
2132 {
2133 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2134 SOCKETCLOSE(newfd);
2135 goto finally;
2136 }
2137 }
2138#endif
2139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 sock = PyLong_FromSocket_t(newfd);
2141 if (sock == NULL) {
2142 SOCKETCLOSE(newfd);
2143 goto finally;
2144 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2147 addrlen, s->sock_proto);
2148 if (addr == NULL)
2149 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002152
Guido van Rossum67f7a382002-06-06 21:08:16 +00002153finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 Py_XDECREF(sock);
2155 Py_XDECREF(addr);
2156 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002157}
2158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002159PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002160"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002161\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002162Wait for an incoming connection. Return a new socket file descriptor\n\
2163representing the connection, and the address of the client.\n\
2164For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002165
Guido van Rossum11ba0942002-06-13 15:07:44 +00002166/* s.setblocking(flag) method. Argument:
2167 False -- non-blocking mode; same as settimeout(0)
2168 True -- blocking mode; same as settimeout(None)
2169*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002170
Guido van Rossum73624e91994-10-10 17:59:00 +00002171static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002172sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002173{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002174 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 block = PyLong_AsLong(arg);
2177 if (block == -1 && PyErr_Occurred())
2178 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002179
Victor Stinner71694d52015-03-28 01:18:54 +01002180 s->sock_timeout = block ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 Py_INCREF(Py_None);
2184 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002185}
Guido van Rossume4485b01994-09-07 14:32:49 +00002186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188"setblocking(flag)\n\
2189\n\
2190Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002191setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Victor Stinner71694d52015-03-28 01:18:54 +01002194static int
2195socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2196{
2197#ifdef MS_WINDOWS
2198 struct timeval tv;
2199#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002200#ifndef HAVE_POLL
2201 _PyTime_t ms;
2202#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002203 int overflow = 0;
2204
2205 if (timeout_obj == Py_None) {
2206 *timeout = -1;
2207 return 0;
2208 }
2209
Victor Stinner869e1772015-03-30 03:49:14 +02002210 if (_PyTime_FromSecondsObject(timeout,
2211 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002212 return -1;
2213
2214 if (*timeout < 0) {
2215 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2216 return -1;
2217 }
2218
2219#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002220 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002221#endif
2222#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002223 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2224 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002225#endif
2226 if (overflow) {
2227 PyErr_SetString(PyExc_OverflowError,
2228 "timeout doesn't fit into C timeval");
2229 return -1;
2230 }
2231
2232 return 0;
2233}
2234
Guido van Rossum11ba0942002-06-13 15:07:44 +00002235/* s.settimeout(timeout) method. Argument:
2236 None -- no timeout, blocking mode; same as setblocking(True)
2237 0.0 -- non-blocking mode; same as setblocking(False)
2238 > 0 -- timeout mode; operations time out after timeout seconds
2239 < 0 -- illegal; raises an exception
2240*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002241static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002242sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002243{
Victor Stinner71694d52015-03-28 01:18:54 +01002244 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002245
Victor Stinner71694d52015-03-28 01:18:54 +01002246 if (socket_parse_timeout(&timeout, arg) < 0)
2247 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002250 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002252 Py_INCREF(Py_None);
2253 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002254}
2255
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002256PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002257"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002258\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002259Set a timeout on socket operations. 'timeout' can be a float,\n\
2260giving in seconds, or None. Setting a timeout of None disables\n\
2261the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002262Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002264/* s.gettimeout() method.
2265 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002266static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002267sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002268{
Victor Stinner71694d52015-03-28 01:18:54 +01002269 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002270 Py_INCREF(Py_None);
2271 return Py_None;
2272 }
Victor Stinner71694d52015-03-28 01:18:54 +01002273 else {
2274 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2275 return PyFloat_FromDouble(seconds);
2276 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002277}
2278
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002279PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002280"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002281\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002282Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002283operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002284operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002285
Guido van Rossumaee08791992-09-08 09:05:33 +00002286/* s.setsockopt() method.
2287 With an integer third argument, sets an integer option.
2288 With a string third argument, sets an option from a buffer;
2289 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002290
Guido van Rossum73624e91994-10-10 17:59:00 +00002291static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002292sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002294 int level;
2295 int optname;
2296 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002297 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 if (PyArg_ParseTuple(args, "iii:setsockopt",
2301 &level, &optname, &flag)) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002302 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002303 }
2304 else {
2305 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002306 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2307 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002309 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2310 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002311 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 if (res < 0)
2313 return s->errorhandler();
2314 Py_INCREF(Py_None);
2315 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002316}
2317
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002318PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002319"setsockopt(level, option, value)\n\
2320\n\
2321Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002322The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002323
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002324
Guido van Rossumaee08791992-09-08 09:05:33 +00002325/* s.getsockopt() method.
2326 With two arguments, retrieves an integer option.
2327 With a third integer argument, retrieves a string buffer of that size;
2328 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002329
Guido van Rossum73624e91994-10-10 17:59:00 +00002330static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002331sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002332{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002333 int level;
2334 int optname;
2335 int res;
2336 PyObject *buf;
2337 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002339 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2340 &level, &optname, &buflen))
2341 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002343 if (buflen == 0) {
2344 int flag = 0;
2345 socklen_t flagsize = sizeof flag;
2346 res = getsockopt(s->sock_fd, level, optname,
2347 (void *)&flag, &flagsize);
2348 if (res < 0)
2349 return s->errorhandler();
2350 return PyLong_FromLong(flag);
2351 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002352 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002353 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002354 "getsockopt buflen out of range");
2355 return NULL;
2356 }
2357 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2358 if (buf == NULL)
2359 return NULL;
2360 res = getsockopt(s->sock_fd, level, optname,
2361 (void *)PyBytes_AS_STRING(buf), &buflen);
2362 if (res < 0) {
2363 Py_DECREF(buf);
2364 return s->errorhandler();
2365 }
2366 _PyBytes_Resize(&buf, buflen);
2367 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002368}
2369
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002370PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002371"getsockopt(level, option[, buffersize]) -> value\n\
2372\n\
2373Get a socket option. See the Unix manual for level and option.\n\
2374If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002375string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002376
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002377
Fred Drake728819a2000-07-01 03:40:12 +00002378/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002379
Guido van Rossum73624e91994-10-10 17:59:00 +00002380static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002381sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002383 sock_addr_t addrbuf;
2384 int addrlen;
2385 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002386
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002387 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2388 return NULL;
2389 Py_BEGIN_ALLOW_THREADS
2390 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2391 Py_END_ALLOW_THREADS
2392 if (res < 0)
2393 return s->errorhandler();
2394 Py_INCREF(Py_None);
2395 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002396}
2397
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002398PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002399"bind(address)\n\
2400\n\
2401Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002402pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002403sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002404
Guido van Rossum30a685f1991-06-27 15:51:29 +00002405
2406/* s.close() method.
2407 Set the file descriptor to -1 so operations tried subsequently
2408 will surely fail. */
2409
Guido van Rossum73624e91994-10-10 17:59:00 +00002410static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002411sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002412{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002413 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002414
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002415 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2416 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2417 * for more details.
2418 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002419 if ((fd = s->sock_fd) != -1) {
2420 s->sock_fd = -1;
2421 Py_BEGIN_ALLOW_THREADS
2422 (void) SOCKETCLOSE(fd);
2423 Py_END_ALLOW_THREADS
2424 }
2425 Py_INCREF(Py_None);
2426 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002427}
2428
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002430"close()\n\
2431\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002432Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002433
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002434static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002435sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002436{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002437 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002438 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002439 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002440}
2441
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002442PyDoc_STRVAR(detach_doc,
2443"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002444\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002445Close the socket object without closing the underlying file descriptor.\n\
2446The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002447can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002448
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002449static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002450internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002452{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002453 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 timeout = 0;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002456
2457 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002458 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002459 Py_END_ALLOW_THREADS
2460
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002461#ifdef MS_WINDOWS
2462
Victor Stinner71694d52015-03-28 01:18:54 +01002463 if (s->sock_timeout > 0
Victor Stinnerb7df3142015-03-27 22:59:32 +01002464 && res < 0 && WSAGetLastError() == WSAEWOULDBLOCK
2465 && IS_SELECTABLE(s)) {
2466 /* This is a mess. Best solution: trust select */
2467 fd_set fds;
2468 fd_set fds_exc;
2469 struct timeval tv;
Victor Stinner71694d52015-03-28 01:18:54 +01002470 int conv;
2471
Victor Stinner869e1772015-03-30 03:49:14 +02002472 _PyTime_AsTimeval_noraise(s->sock_timeout, &tv, _PyTime_ROUND_CEILING);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002473
2474 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb7df3142015-03-27 22:59:32 +01002475 FD_ZERO(&fds);
2476 FD_SET(s->sock_fd, &fds);
2477 FD_ZERO(&fds_exc);
2478 FD_SET(s->sock_fd, &fds_exc);
2479 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2480 NULL, &fds, &fds_exc, &tv);
2481 Py_END_ALLOW_THREADS
2482
2483 if (res == 0) {
2484 res = WSAEWOULDBLOCK;
2485 timeout = 1;
2486 } else if (res > 0) {
2487 if (FD_ISSET(s->sock_fd, &fds))
2488 /* The socket is in the writable set - this
2489 means connected */
2490 res = 0;
2491 else {
2492 /* As per MS docs, we need to call getsockopt()
2493 to get the underlying error */
2494 int res_size = sizeof res;
2495 /* It must be in the exception set */
2496 assert(FD_ISSET(s->sock_fd, &fds_exc));
2497 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2498 (char *)&res, &res_size))
2499 /* getsockopt also clears WSAGetLastError,
2500 so reset it back. */
2501 WSASetLastError(res);
2502 else
2503 res = WSAGetLastError();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002505 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01002506 /* else if (res < 0) an error occurred */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002508
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 if (res < 0)
2510 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002511
2512#else
2513
Victor Stinner71694d52015-03-28 01:18:54 +01002514 if (s->sock_timeout > 0
Victor Stinnerb7df3142015-03-27 22:59:32 +01002515 && res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2516
Victor Stinnere6951c62015-03-31 13:50:44 +02002517 timeout = internal_connect_select(s);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002518
2519 if (timeout == 0) {
2520 /* Bug #1019808: in case of an EINPROGRESS,
2521 use getsockopt(SO_ERROR) to get the real
2522 error. */
2523 socklen_t res_size = sizeof res;
2524 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2525 SO_ERROR, &res, &res_size);
2526 if (res == EISCONN)
2527 res = 0;
2528 errno = res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01002530 else if (timeout == -1) {
2531 res = errno; /* had error */
2532 }
2533 else
2534 res = EWOULDBLOCK; /* timed out */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002535 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002536
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002537 if (res < 0)
2538 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002539
2540#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002542
Victor Stinner71694d52015-03-28 01:18:54 +01002543 assert(res >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002545}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002546
Fred Drake728819a2000-07-01 03:40:12 +00002547/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002548
Guido van Rossum73624e91994-10-10 17:59:00 +00002549static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002550sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002551{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002552 sock_addr_t addrbuf;
2553 int addrlen;
2554 int res;
2555 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2558 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002562 if (timeout == 1) {
2563 PyErr_SetString(socket_timeout, "timed out");
2564 return NULL;
2565 }
Victor Stinner71694d52015-03-28 01:18:54 +01002566 if (res < 0)
2567 return NULL;
2568 if (res != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002569 return s->errorhandler();
Victor Stinner71694d52015-03-28 01:18:54 +01002570 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 Py_INCREF(Py_None);
2572 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002573}
2574
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002575PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002576"connect(address)\n\
2577\n\
2578Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002579is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002580
Guido van Rossum30a685f1991-06-27 15:51:29 +00002581
Fred Drake728819a2000-07-01 03:40:12 +00002582/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002583
2584static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002585sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 sock_addr_t addrbuf;
2588 int addrlen;
2589 int res;
2590 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2593 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002595 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002596
Victor Stinner71694d52015-03-28 01:18:54 +01002597 if (res < 0)
2598 return NULL;
2599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 /* Signals are not errors (though they may raise exceptions). Adapted
2601 from PyErr_SetFromErrnoWithFilenameObject(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 if (res == EINTR && PyErr_CheckSignals())
2603 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002606}
2607
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002608PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002609"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610\n\
2611This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002612instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002613
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002614
Guido van Rossumed233a51992-06-23 09:07:03 +00002615/* s.fileno() method */
2616
Guido van Rossum73624e91994-10-10 17:59:00 +00002617static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002618sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002619{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002620 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002621}
2622
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002623PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002624"fileno() -> integer\n\
2625\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002626Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002627
Guido van Rossumed233a51992-06-23 09:07:03 +00002628
Guido van Rossumc89705d1992-11-26 08:54:07 +00002629/* s.getsockname() method */
2630
Guido van Rossum73624e91994-10-10 17:59:00 +00002631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002632sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002634 sock_addr_t addrbuf;
2635 int res;
2636 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 if (!getsockaddrlen(s, &addrlen))
2639 return NULL;
2640 memset(&addrbuf, 0, addrlen);
2641 Py_BEGIN_ALLOW_THREADS
2642 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2643 Py_END_ALLOW_THREADS
2644 if (res < 0)
2645 return s->errorhandler();
2646 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2647 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002648}
2649
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002650PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002651"getsockname() -> address info\n\
2652\n\
2653Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002654info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002655
Guido van Rossumc89705d1992-11-26 08:54:07 +00002656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002658/* s.getpeername() method */
2659
Guido van Rossum73624e91994-10-10 17:59:00 +00002660static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002661sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002662{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002663 sock_addr_t addrbuf;
2664 int res;
2665 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002666
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002667 if (!getsockaddrlen(s, &addrlen))
2668 return NULL;
2669 memset(&addrbuf, 0, addrlen);
2670 Py_BEGIN_ALLOW_THREADS
2671 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2672 Py_END_ALLOW_THREADS
2673 if (res < 0)
2674 return s->errorhandler();
2675 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2676 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002677}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002679PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002680"getpeername() -> address info\n\
2681\n\
2682Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002683info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002684
Guido van Rossumb6775db1994-08-01 11:34:53 +00002685#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002686
2687
Guido van Rossum30a685f1991-06-27 15:51:29 +00002688/* s.listen(n) method */
2689
Guido van Rossum73624e91994-10-10 17:59:00 +00002690static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002691sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002692{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002693 /* We try to choose a default backlog high enough to avoid connection drops
2694 * for common workloads, yet not too high to limit resource usage. */
2695 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002697
Charles-François Natali644b8f52014-05-22 19:45:39 +01002698 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002702 /* To avoid problems on systems that don't allow a negative backlog
2703 * (which doesn't make sense anyway) we force a minimum value of 0. */
2704 if (backlog < 0)
2705 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002706 res = listen(s->sock_fd, backlog);
2707 Py_END_ALLOW_THREADS
2708 if (res < 0)
2709 return s->errorhandler();
2710 Py_INCREF(Py_None);
2711 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002712}
2713
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002714PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002715"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002716\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002717Enable a server to accept connections. If backlog is specified, it must be\n\
2718at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002719unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002720connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002721
2722
Thomas Wouters477c8d52006-05-27 19:21:47 +00002723/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002724 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002725 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002726 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002727 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002728 * also possible that we return a number of bytes smaller than the request
2729 * bytes.
2730 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002731
Antoine Pitrou19467d22010-08-17 19:33:30 +00002732static Py_ssize_t
2733sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002734{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002735 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002737 int async_err = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002739 if (!IS_SELECTABLE(s)) {
2740 select_error();
2741 return -1;
2742 }
2743 if (len == 0) {
2744 /* If 0 bytes were requested, do nothing. */
2745 return 0;
2746 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002747
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002748 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002749 do {
Victor Stinner391fa712015-03-31 13:15:31 +02002750 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002751
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002752 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002753 Py_BEGIN_ALLOW_THREADS
Victor Stinner14b9b112013-06-25 00:37:25 +02002754#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002755 if (len > INT_MAX)
2756 len = INT_MAX;
2757 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002758#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002759 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002760#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002761 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002762 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002763 } while (outlen < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Thomas Wouters477c8d52006-05-27 19:21:47 +00002764
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 if (timeout == 1) {
2766 PyErr_SetString(socket_timeout, "timed out");
2767 return -1;
2768 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002769 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 if (outlen < 0) {
2771 /* Note: the call to errorhandler() ALWAYS indirectly returned
2772 NULL, so ignore its return value */
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002773 if (!async_err)
2774 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 return -1;
2776 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002777 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002778}
2779
Guido van Rossum48a680c2001-03-02 06:34:14 +00002780
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002781/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002782
Guido van Rossum73624e91994-10-10 17:59:00 +00002783static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002784sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002785{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002786 Py_ssize_t recvlen, outlen;
2787 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002789
Antoine Pitrou19467d22010-08-17 19:33:30 +00002790 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002791 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002792
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002793 if (recvlen < 0) {
2794 PyErr_SetString(PyExc_ValueError,
2795 "negative buffersize in recv");
2796 return NULL;
2797 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002798
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 /* Allocate a new string. */
2800 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2801 if (buf == NULL)
2802 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 /* Call the guts */
2805 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2806 if (outlen < 0) {
2807 /* An error occurred, release the string and return an
2808 error. */
2809 Py_DECREF(buf);
2810 return NULL;
2811 }
2812 if (outlen != recvlen) {
2813 /* We did not read as many bytes as we anticipated, resize the
2814 string if possible and be successful. */
2815 _PyBytes_Resize(&buf, outlen);
2816 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002817
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002818 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002819}
2820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002821PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002822"recv(buffersize[, flags]) -> data\n\
2823\n\
2824Receive up to buffersize bytes from the socket. For the optional flags\n\
2825argument, see the Unix manual. When no data is available, block until\n\
2826at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002827the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002828
Guido van Rossum30a685f1991-06-27 15:51:29 +00002829
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002830/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002831
Thomas Wouters477c8d52006-05-27 19:21:47 +00002832static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002833sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002834{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002836
Antoine Pitrou19467d22010-08-17 19:33:30 +00002837 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002838 Py_buffer pbuf;
2839 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002840 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002843 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002844 &pbuf, &recvlen, &flags))
2845 return NULL;
2846 buf = pbuf.buf;
2847 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002849 if (recvlen < 0) {
2850 PyBuffer_Release(&pbuf);
2851 PyErr_SetString(PyExc_ValueError,
2852 "negative buffersize in recv_into");
2853 return NULL;
2854 }
2855 if (recvlen == 0) {
2856 /* If nbytes was not specified, use the buffer's length */
2857 recvlen = buflen;
2858 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002860 /* Check if the buffer is large enough */
2861 if (buflen < recvlen) {
2862 PyBuffer_Release(&pbuf);
2863 PyErr_SetString(PyExc_ValueError,
2864 "buffer too small for requested bytes");
2865 return NULL;
2866 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 /* Call the guts */
2869 readlen = sock_recv_guts(s, buf, recvlen, flags);
2870 if (readlen < 0) {
2871 /* Return an error. */
2872 PyBuffer_Release(&pbuf);
2873 return NULL;
2874 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002876 PyBuffer_Release(&pbuf);
2877 /* Return the number of bytes read. Note that we do not do anything
2878 special here in the case that readlen < recvlen. */
2879 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002880}
2881
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002882PyDoc_STRVAR(recv_into_doc,
2883"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002884\n\
2885A version of recv() that stores its data into a buffer rather than creating \n\
2886a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2887is not specified (or 0), receive up to the size available in the given buffer.\n\
2888\n\
2889See recv() for documentation about the flags.");
2890
2891
2892/*
Christian Heimes99170a52007-12-19 02:07:34 +00002893 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2894 * into a char buffer. If you have any inc/def ref to do to the objects that
2895 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002896 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002897 * that it is also possible that we return a number of bytes smaller than the
2898 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002899 *
2900 * 'addr' is a return value for the address object. Note that you must decref
2901 * it yourself.
2902 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002903static Py_ssize_t
2904sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002905 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002906{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 sock_addr_t addrbuf;
2908 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002909 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 socklen_t addrlen;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002911 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002913 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 if (!getsockaddrlen(s, &addrlen))
2916 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 if (!IS_SELECTABLE(s)) {
2919 select_error();
2920 return -1;
2921 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002922
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002923 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002924 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002925 memset(&addrbuf, 0, addrlen);
Victor Stinner391fa712015-03-31 13:15:31 +02002926 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002927
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002928 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002929 Py_BEGIN_ALLOW_THREADS
Victor Stinnere990c6e2013-11-16 00:18:58 +01002930#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002931 if (len > INT_MAX)
2932 len = INT_MAX;
2933 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
2934 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002935#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002936 n = recvfrom(s->sock_fd, cbuf, len, flags,
2937 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002938#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002939 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002940 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002941 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002942
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002943 if (timeout == 1) {
2944 PyErr_SetString(socket_timeout, "timed out");
2945 return -1;
2946 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002947 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 if (n < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002949 if (!async_err)
2950 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 return -1;
2952 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002953
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002954 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2955 addrlen, s->sock_proto)))
2956 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002958 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002959}
2960
2961/* s.recvfrom(nbytes [,flags]) method */
2962
2963static PyObject *
2964sock_recvfrom(PySocketSockObject *s, PyObject *args)
2965{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002966 PyObject *buf = NULL;
2967 PyObject *addr = NULL;
2968 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002969 int flags = 0;
2970 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002971
Antoine Pitrou19467d22010-08-17 19:33:30 +00002972 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002973 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002975 if (recvlen < 0) {
2976 PyErr_SetString(PyExc_ValueError,
2977 "negative buffersize in recvfrom");
2978 return NULL;
2979 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002981 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2982 if (buf == NULL)
2983 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002984
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002985 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2986 recvlen, flags, &addr);
2987 if (outlen < 0) {
2988 goto finally;
2989 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002990
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 if (outlen != recvlen) {
2992 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002993 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002994 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002995 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 goto finally;
2997 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002998
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003000
3001finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003002 Py_XDECREF(buf);
3003 Py_XDECREF(addr);
3004 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003005}
3006
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003007PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003008"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3009\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003010Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003011
Thomas Wouters477c8d52006-05-27 19:21:47 +00003012
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003013/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003014
3015static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003016sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003019
Antoine Pitrou19467d22010-08-17 19:33:30 +00003020 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003021 Py_buffer pbuf;
3022 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003023 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003026
Antoine Pitrou19467d22010-08-17 19:33:30 +00003027 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003028 kwlist, &pbuf,
3029 &recvlen, &flags))
3030 return NULL;
3031 buf = pbuf.buf;
3032 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003034 if (recvlen < 0) {
3035 PyBuffer_Release(&pbuf);
3036 PyErr_SetString(PyExc_ValueError,
3037 "negative buffersize in recvfrom_into");
3038 return NULL;
3039 }
3040 if (recvlen == 0) {
3041 /* If nbytes was not specified, use the buffer's length */
3042 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003043 } else if (recvlen > buflen) {
3044 PyBuffer_Release(&pbuf);
3045 PyErr_SetString(PyExc_ValueError,
3046 "nbytes is greater than the length of the buffer");
3047 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003048 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003049
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003050 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3051 if (readlen < 0) {
3052 PyBuffer_Release(&pbuf);
3053 /* Return an error */
3054 Py_XDECREF(addr);
3055 return NULL;
3056 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003058 PyBuffer_Release(&pbuf);
3059 /* Return the number of bytes read and the address. Note that we do
3060 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003061 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003062}
3063
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003064PyDoc_STRVAR(recvfrom_into_doc,
3065"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003066\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003067Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003068
3069
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003070/* The sendmsg() and recvmsg[_into]() methods require a working
3071 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3072#ifdef CMSG_LEN
3073/*
3074 * Call recvmsg() with the supplied iovec structures, flags, and
3075 * ancillary data buffer size (controllen). Returns the tuple return
3076 * value for recvmsg() or recvmsg_into(), with the first item provided
3077 * by the supplied makeval() function. makeval() will be called with
3078 * the length read and makeval_data as arguments, and must return a
3079 * new reference (which will be decrefed if there is a subsequent
3080 * error). On error, closes any file descriptors received via
3081 * SCM_RIGHTS.
3082 */
3083static PyObject *
3084sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3085 int flags, Py_ssize_t controllen,
3086 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3087{
3088 ssize_t bytes_received = -1;
3089 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003090 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003091 sock_addr_t addrbuf;
3092 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003093 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003094 PyObject *cmsg_list = NULL, *retval = NULL;
3095 void *controlbuf = NULL;
3096 struct cmsghdr *cmsgh;
3097 size_t cmsgdatalen = 0;
3098 int cmsg_status;
3099
3100 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3101 ignored" when the socket is connected (Linux fills them in
3102 anyway for AF_UNIX sockets at least). Normally msg_namelen
3103 seems to be set to 0 if there's no address, but try to
3104 initialize msg_name to something that won't be mistaken for a
3105 real address if that doesn't happen. */
3106 if (!getsockaddrlen(s, &addrbuflen))
3107 return NULL;
3108 memset(&addrbuf, 0, addrbuflen);
3109 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3110
3111 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3112 PyErr_SetString(PyExc_ValueError,
3113 "invalid ancillary data buffer length");
3114 return NULL;
3115 }
3116 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3117 return PyErr_NoMemory();
3118
3119 /* Make the system call. */
3120 if (!IS_SELECTABLE(s)) {
3121 select_error();
3122 goto finally;
3123 }
3124
3125 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003126 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003127 msg.msg_name = SAS2SA(&addrbuf);
3128 msg.msg_namelen = addrbuflen;
3129 msg.msg_iov = iov;
3130 msg.msg_iovlen = iovlen;
3131 msg.msg_control = controlbuf;
3132 msg.msg_controllen = controllen;
Victor Stinner391fa712015-03-31 13:15:31 +02003133 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003134
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003135 if (timeout == 1) {
3136 PyErr_SetString(socket_timeout, "timed out");
3137 goto finally;
3138 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01003139
3140 if (!timeout) {
3141 Py_BEGIN_ALLOW_THREADS;
3142 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3143 Py_END_ALLOW_THREADS;
3144 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003145 } while (bytes_received < 0 && errno == EINTR &&
3146 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003147 END_SELECT_LOOP(s)
3148
3149 if (bytes_received < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003150 if (!async_err)
3151 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003152 goto finally;
3153 }
3154
3155 /* Make list of (level, type, data) tuples from control messages. */
3156 if ((cmsg_list = PyList_New(0)) == NULL)
3157 goto err_closefds;
3158 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3159 implementations didn't do so. */
3160 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3161 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3162 PyObject *bytes, *tuple;
3163 int tmp;
3164
3165 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3166 if (cmsg_status != 0) {
3167 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3168 "received malformed or improperly-truncated "
3169 "ancillary data", 1) == -1)
3170 goto err_closefds;
3171 }
3172 if (cmsg_status < 0)
3173 break;
3174 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003175 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003176 goto err_closefds;
3177 }
3178
3179 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3180 cmsgdatalen);
3181 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3182 (int)cmsgh->cmsg_type, bytes);
3183 if (tuple == NULL)
3184 goto err_closefds;
3185 tmp = PyList_Append(cmsg_list, tuple);
3186 Py_DECREF(tuple);
3187 if (tmp != 0)
3188 goto err_closefds;
3189
3190 if (cmsg_status != 0)
3191 break;
3192 }
3193
3194 retval = Py_BuildValue("NOiN",
3195 (*makeval)(bytes_received, makeval_data),
3196 cmsg_list,
3197 (int)msg.msg_flags,
3198 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3199 ((msg.msg_namelen > addrbuflen) ?
3200 addrbuflen : msg.msg_namelen),
3201 s->sock_proto));
3202 if (retval == NULL)
3203 goto err_closefds;
3204
3205finally:
3206 Py_XDECREF(cmsg_list);
3207 PyMem_Free(controlbuf);
3208 return retval;
3209
3210err_closefds:
3211#ifdef SCM_RIGHTS
3212 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3213 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3214 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3215 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3216 if (cmsg_status < 0)
3217 break;
3218 if (cmsgh->cmsg_level == SOL_SOCKET &&
3219 cmsgh->cmsg_type == SCM_RIGHTS) {
3220 size_t numfds;
3221 int *fdp;
3222
3223 numfds = cmsgdatalen / sizeof(int);
3224 fdp = (int *)CMSG_DATA(cmsgh);
3225 while (numfds-- > 0)
3226 close(*fdp++);
3227 }
3228 if (cmsg_status != 0)
3229 break;
3230 }
3231#endif /* SCM_RIGHTS */
3232 goto finally;
3233}
3234
3235
3236static PyObject *
3237makeval_recvmsg(ssize_t received, void *data)
3238{
3239 PyObject **buf = data;
3240
3241 if (received < PyBytes_GET_SIZE(*buf))
3242 _PyBytes_Resize(buf, received);
3243 Py_XINCREF(*buf);
3244 return *buf;
3245}
3246
3247/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3248
3249static PyObject *
3250sock_recvmsg(PySocketSockObject *s, PyObject *args)
3251{
3252 Py_ssize_t bufsize, ancbufsize = 0;
3253 int flags = 0;
3254 struct iovec iov;
3255 PyObject *buf = NULL, *retval = NULL;
3256
3257 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3258 return NULL;
3259
3260 if (bufsize < 0) {
3261 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3262 return NULL;
3263 }
3264 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3265 return NULL;
3266 iov.iov_base = PyBytes_AS_STRING(buf);
3267 iov.iov_len = bufsize;
3268
3269 /* Note that we're passing a pointer to *our pointer* to the bytes
3270 object here (&buf); makeval_recvmsg() may incref the object, or
3271 deallocate it and set our pointer to NULL. */
3272 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3273 &makeval_recvmsg, &buf);
3274 Py_XDECREF(buf);
3275 return retval;
3276}
3277
3278PyDoc_STRVAR(recvmsg_doc,
3279"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3280\n\
3281Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3282socket. The ancbufsize argument sets the size in bytes of the\n\
3283internal buffer used to receive the ancillary data; it defaults to 0,\n\
3284meaning that no ancillary data will be received. Appropriate buffer\n\
3285sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3286CMSG_LEN(), and items which do not fit into the buffer might be\n\
3287truncated or discarded. The flags argument defaults to 0 and has the\n\
3288same meaning as for recv().\n\
3289\n\
3290The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3291The data item is a bytes object holding the non-ancillary data\n\
3292received. The ancdata item is a list of zero or more tuples\n\
3293(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3294(control messages) received: cmsg_level and cmsg_type are integers\n\
3295specifying the protocol level and protocol-specific type respectively,\n\
3296and cmsg_data is a bytes object holding the associated data. The\n\
3297msg_flags item is the bitwise OR of various flags indicating\n\
3298conditions on the received message; see your system documentation for\n\
3299details. If the receiving socket is unconnected, address is the\n\
3300address of the sending socket, if available; otherwise, its value is\n\
3301unspecified.\n\
3302\n\
3303If recvmsg() raises an exception after the system call returns, it\n\
3304will first attempt to close any file descriptors received via the\n\
3305SCM_RIGHTS mechanism.");
3306
3307
3308static PyObject *
3309makeval_recvmsg_into(ssize_t received, void *data)
3310{
3311 return PyLong_FromSsize_t(received);
3312}
3313
3314/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3315
3316static PyObject *
3317sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3318{
3319 Py_ssize_t ancbufsize = 0;
3320 int flags = 0;
3321 struct iovec *iovs = NULL;
3322 Py_ssize_t i, nitems, nbufs = 0;
3323 Py_buffer *bufs = NULL;
3324 PyObject *buffers_arg, *fast, *retval = NULL;
3325
3326 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3327 &buffers_arg, &ancbufsize, &flags))
3328 return NULL;
3329
3330 if ((fast = PySequence_Fast(buffers_arg,
3331 "recvmsg_into() argument 1 must be an "
3332 "iterable")) == NULL)
3333 return NULL;
3334 nitems = PySequence_Fast_GET_SIZE(fast);
3335 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003336 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003337 goto finally;
3338 }
3339
3340 /* Fill in an iovec for each item, and save the Py_buffer
3341 structs to release afterwards. */
3342 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3343 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3344 PyErr_NoMemory();
3345 goto finally;
3346 }
3347 for (; nbufs < nitems; nbufs++) {
3348 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3349 "w*;recvmsg_into() argument 1 must be an iterable "
3350 "of single-segment read-write buffers",
3351 &bufs[nbufs]))
3352 goto finally;
3353 iovs[nbufs].iov_base = bufs[nbufs].buf;
3354 iovs[nbufs].iov_len = bufs[nbufs].len;
3355 }
3356
3357 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3358 &makeval_recvmsg_into, NULL);
3359finally:
3360 for (i = 0; i < nbufs; i++)
3361 PyBuffer_Release(&bufs[i]);
3362 PyMem_Free(bufs);
3363 PyMem_Free(iovs);
3364 Py_DECREF(fast);
3365 return retval;
3366}
3367
3368PyDoc_STRVAR(recvmsg_into_doc,
3369"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3370\n\
3371Receive normal data and ancillary data from the socket, scattering the\n\
3372non-ancillary data into a series of buffers. The buffers argument\n\
3373must be an iterable of objects that export writable buffers\n\
3374(e.g. bytearray objects); these will be filled with successive chunks\n\
3375of the non-ancillary data until it has all been written or there are\n\
3376no more buffers. The ancbufsize argument sets the size in bytes of\n\
3377the internal buffer used to receive the ancillary data; it defaults to\n\
33780, meaning that no ancillary data will be received. Appropriate\n\
3379buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3380or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3381truncated or discarded. The flags argument defaults to 0 and has the\n\
3382same meaning as for recv().\n\
3383\n\
3384The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3385The nbytes item is the total number of bytes of non-ancillary data\n\
3386written into the buffers. The ancdata item is a list of zero or more\n\
3387tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3388data (control messages) received: cmsg_level and cmsg_type are\n\
3389integers specifying the protocol level and protocol-specific type\n\
3390respectively, and cmsg_data is a bytes object holding the associated\n\
3391data. The msg_flags item is the bitwise OR of various flags\n\
3392indicating conditions on the received message; see your system\n\
3393documentation for details. If the receiving socket is unconnected,\n\
3394address is the address of the sending socket, if available; otherwise,\n\
3395its value is unspecified.\n\
3396\n\
3397If recvmsg_into() raises an exception after the system call returns,\n\
3398it will first attempt to close any file descriptors received via the\n\
3399SCM_RIGHTS mechanism.");
3400#endif /* CMSG_LEN */
3401
3402
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003403/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003404
Guido van Rossum73624e91994-10-10 17:59:00 +00003405static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003406sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003407{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003408 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003409 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003410 int async_err = 0;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003411 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003412 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3415 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003417 if (!IS_SELECTABLE(s)) {
3418 PyBuffer_Release(&pbuf);
3419 return select_error();
3420 }
3421 buf = pbuf.buf;
3422 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003423
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003424 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003425 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003426 timeout = internal_select(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003427
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003428 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003429 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003430#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003431 if (len > INT_MAX)
3432 len = INT_MAX;
3433 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003434#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003435 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003436#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003437 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003438 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003439 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003441 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 PyErr_SetString(socket_timeout, "timed out");
3443 return NULL;
3444 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003445 END_SELECT_LOOP(s)
3446
3447 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003448 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003449 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003450 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003451}
3452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003453PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003454"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003455\n\
3456Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003457argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003458sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003459
3460
3461/* s.sendall(data [,flags]) method */
3462
3463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003464sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003466 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003467 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003468 int async_err = 0;
3469 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003470 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003472 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3473 return NULL;
3474 buf = pbuf.buf;
3475 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003477 if (!IS_SELECTABLE(s)) {
3478 PyBuffer_Release(&pbuf);
3479 return select_error();
3480 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003483 timeout = internal_select(s, 1, s->sock_timeout);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003484
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003485 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003486 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003487 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003488#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003489 if (len > INT_MAX)
3490 len = INT_MAX;
3491 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003492#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003493 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003494#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003495 Py_END_ALLOW_THREADS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003496 }
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003497 if (timeout == 1) {
3498 PyBuffer_Release(&pbuf);
3499 PyErr_SetString(socket_timeout, "timed out");
3500 return NULL;
3501 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003502 if (n >= 0) {
3503 buf += n;
3504 len -= n;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003505 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003506 } while (len > 0 && (n >= 0 || errno == EINTR) &&
3507 !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003508 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003509
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003510 if (n < 0 || async_err)
3511 return (!async_err) ? s->errorhandler() : NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003513 Py_INCREF(Py_None);
3514 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003515}
3516
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003517PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003518"sendall(data[, flags])\n\
3519\n\
3520Send a data string to the socket. For the optional flags\n\
3521argument, see the Unix manual. This calls send() repeatedly\n\
3522until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003523to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003524
Guido van Rossum30a685f1991-06-27 15:51:29 +00003525
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003526/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003527
Guido van Rossum73624e91994-10-10 17:59:00 +00003528static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003529sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003531 Py_buffer pbuf;
3532 PyObject *addro;
3533 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003534 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 sock_addr_t addrbuf;
3536 int addrlen, n = -1, flags, timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003537 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003539 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003540 arglen = PyTuple_Size(args);
3541 switch (arglen) {
3542 case 2:
3543 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3544 break;
3545 case 3:
3546 PyArg_ParseTuple(args, "y*iO:sendto",
3547 &pbuf, &flags, &addro);
3548 break;
3549 default:
3550 PyErr_Format(PyExc_TypeError,
3551 "sendto() takes 2 or 3 arguments (%d given)",
3552 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003553 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003554 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003555 if (PyErr_Occurred())
3556 return NULL;
3557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 buf = pbuf.buf;
3559 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003561 if (!IS_SELECTABLE(s)) {
3562 PyBuffer_Release(&pbuf);
3563 return select_error();
3564 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003566 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3567 PyBuffer_Release(&pbuf);
3568 return NULL;
3569 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003570
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003571 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003572 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003573 timeout = internal_select(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003574
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003575 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003576 Py_BEGIN_ALLOW_THREADS
Victor Stinner14b9b112013-06-25 00:37:25 +02003577#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003578 if (len > INT_MAX)
3579 len = INT_MAX;
3580 n = sendto(s->sock_fd, buf, (int)len, flags,
3581 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003582#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003583 n = sendto(s->sock_fd, buf, len, flags,
3584 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003585#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003586 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003587 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003588 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003590 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003591 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003592 PyErr_SetString(socket_timeout, "timed out");
3593 return NULL;
3594 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003595 END_SELECT_LOOP(s)
3596 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003597 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003598 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003599 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003600}
3601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003602PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003603"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003604\n\
3605Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003606For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003607
Guido van Rossum30a685f1991-06-27 15:51:29 +00003608
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003609/* The sendmsg() and recvmsg[_into]() methods require a working
3610 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3611#ifdef CMSG_LEN
3612/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3613
3614static PyObject *
3615sock_sendmsg(PySocketSockObject *s, PyObject *args)
3616{
3617 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3618 Py_buffer *databufs = NULL;
3619 struct iovec *iovs = NULL;
3620 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003621 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003622 struct cmsginfo {
3623 int level;
3624 int type;
3625 Py_buffer data;
3626 } *cmsgs = NULL;
3627 void *controlbuf = NULL;
3628 size_t controllen, controllen_last;
3629 ssize_t bytes_sent = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003630 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003631 int addrlen, timeout, flags = 0;
3632 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3633 *cmsg_fast = NULL, *retval = NULL;
3634
3635 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3636 &data_arg, &cmsg_arg, &flags, &addr_arg))
3637 return NULL;
3638
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003639 /* Parse destination address. */
3640 if (addr_arg != NULL && addr_arg != Py_None) {
3641 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3642 goto finally;
3643 msg.msg_name = &addrbuf;
3644 msg.msg_namelen = addrlen;
3645 }
3646
3647 /* Fill in an iovec for each message part, and save the Py_buffer
3648 structs to release afterwards. */
3649 if ((data_fast = PySequence_Fast(data_arg,
3650 "sendmsg() argument 1 must be an "
3651 "iterable")) == NULL)
3652 goto finally;
3653 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3654 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003655 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003656 goto finally;
3657 }
3658 msg.msg_iovlen = ndataparts;
3659 if (ndataparts > 0 &&
3660 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3661 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3662 PyErr_NoMemory();
3663 goto finally;
3664 }
3665 for (; ndatabufs < ndataparts; ndatabufs++) {
3666 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3667 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003668 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003669 &databufs[ndatabufs]))
3670 goto finally;
3671 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3672 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3673 }
3674
3675 if (cmsg_arg == NULL)
3676 ncmsgs = 0;
3677 else {
3678 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3679 "sendmsg() argument 2 must be an "
3680 "iterable")) == NULL)
3681 goto finally;
3682 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3683 }
3684
3685#ifndef CMSG_SPACE
3686 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003687 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003688 "sending multiple control messages is not supported "
3689 "on this system");
3690 goto finally;
3691 }
3692#endif
3693 /* Save level, type and Py_buffer for each control message,
3694 and calculate total size. */
3695 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3696 PyErr_NoMemory();
3697 goto finally;
3698 }
3699 controllen = controllen_last = 0;
3700 while (ncmsgbufs < ncmsgs) {
3701 size_t bufsize, space;
3702
3703 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3704 "(iiy*):[sendmsg() ancillary data items]",
3705 &cmsgs[ncmsgbufs].level,
3706 &cmsgs[ncmsgbufs].type,
3707 &cmsgs[ncmsgbufs].data))
3708 goto finally;
3709 bufsize = cmsgs[ncmsgbufs++].data.len;
3710
3711#ifdef CMSG_SPACE
3712 if (!get_CMSG_SPACE(bufsize, &space)) {
3713#else
3714 if (!get_CMSG_LEN(bufsize, &space)) {
3715#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003716 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003717 goto finally;
3718 }
3719 controllen += space;
3720 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003721 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003722 goto finally;
3723 }
3724 controllen_last = controllen;
3725 }
3726
3727 /* Construct ancillary data block from control message info. */
3728 if (ncmsgbufs > 0) {
3729 struct cmsghdr *cmsgh = NULL;
3730
3731 if ((msg.msg_control = controlbuf =
3732 PyMem_Malloc(controllen)) == NULL) {
3733 PyErr_NoMemory();
3734 goto finally;
3735 }
3736 msg.msg_controllen = controllen;
3737
3738 /* Need to zero out the buffer as a workaround for glibc's
3739 CMSG_NXTHDR() implementation. After getting the pointer to
3740 the next header, it checks its (uninitialized) cmsg_len
3741 member to see if the "message" fits in the buffer, and
3742 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003743 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003744 memset(controlbuf, 0, controllen);
3745
3746 for (i = 0; i < ncmsgbufs; i++) {
3747 size_t msg_len, data_len = cmsgs[i].data.len;
3748 int enough_space = 0;
3749
3750 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3751 if (cmsgh == NULL) {
3752 PyErr_Format(PyExc_RuntimeError,
3753 "unexpected NULL result from %s()",
3754 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3755 goto finally;
3756 }
3757 if (!get_CMSG_LEN(data_len, &msg_len)) {
3758 PyErr_SetString(PyExc_RuntimeError,
3759 "item size out of range for CMSG_LEN()");
3760 goto finally;
3761 }
3762 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3763 size_t space;
3764
3765 cmsgh->cmsg_len = msg_len;
3766 if (get_cmsg_data_space(&msg, cmsgh, &space))
3767 enough_space = (space >= data_len);
3768 }
3769 if (!enough_space) {
3770 PyErr_SetString(PyExc_RuntimeError,
3771 "ancillary data does not fit in calculated "
3772 "space");
3773 goto finally;
3774 }
3775 cmsgh->cmsg_level = cmsgs[i].level;
3776 cmsgh->cmsg_type = cmsgs[i].type;
3777 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3778 }
3779 }
3780
3781 /* Make the system call. */
3782 if (!IS_SELECTABLE(s)) {
3783 select_error();
3784 goto finally;
3785 }
3786
3787 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003788 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003789 timeout = internal_select(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003790
3791 if (!timeout) {
3792 Py_BEGIN_ALLOW_THREADS;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003793 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003794 Py_END_ALLOW_THREADS;
3795 }
3796
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003797 if (timeout == 1) {
3798 PyErr_SetString(socket_timeout, "timed out");
3799 goto finally;
3800 }
3801 } while (bytes_sent < 0 && errno == EINTR &&
3802 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003803 END_SELECT_LOOP(s)
3804
3805 if (bytes_sent < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003806 if (!async_err)
3807 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003808 goto finally;
3809 }
3810 retval = PyLong_FromSsize_t(bytes_sent);
3811
3812finally:
3813 PyMem_Free(controlbuf);
3814 for (i = 0; i < ncmsgbufs; i++)
3815 PyBuffer_Release(&cmsgs[i].data);
3816 PyMem_Free(cmsgs);
3817 Py_XDECREF(cmsg_fast);
3818 for (i = 0; i < ndatabufs; i++)
3819 PyBuffer_Release(&databufs[i]);
3820 PyMem_Free(databufs);
3821 PyMem_Free(iovs);
3822 Py_XDECREF(data_fast);
3823 return retval;
3824}
3825
3826PyDoc_STRVAR(sendmsg_doc,
3827"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3828\n\
3829Send normal and ancillary data to the socket, gathering the\n\
3830non-ancillary data from a series of buffers and concatenating it into\n\
3831a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003832data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003833The ancdata argument specifies the ancillary data (control messages)\n\
3834as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3835cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3836protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003837is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003838argument defaults to 0 and has the same meaning as for send(). If\n\
3839address is supplied and not None, it sets a destination address for\n\
3840the message. The return value is the number of bytes of non-ancillary\n\
3841data sent.");
3842#endif /* CMSG_LEN */
3843
3844
Guido van Rossum30a685f1991-06-27 15:51:29 +00003845/* s.shutdown(how) method */
3846
Guido van Rossum73624e91994-10-10 17:59:00 +00003847static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003848sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003850 int how;
3851 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003852
Serhiy Storchaka78980432013-01-15 01:12:17 +02003853 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 if (how == -1 && PyErr_Occurred())
3855 return NULL;
3856 Py_BEGIN_ALLOW_THREADS
3857 res = shutdown(s->sock_fd, how);
3858 Py_END_ALLOW_THREADS
3859 if (res < 0)
3860 return s->errorhandler();
3861 Py_INCREF(Py_None);
3862 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003863}
3864
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003865PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003866"shutdown(flag)\n\
3867\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003868Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3869of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003870
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003871#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003872static PyObject*
3873sock_ioctl(PySocketSockObject *s, PyObject *arg)
3874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003875 unsigned long cmd = SIO_RCVALL;
3876 PyObject *argO;
3877 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3880 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003881
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003882 switch (cmd) {
3883 case SIO_RCVALL: {
3884 unsigned int option = RCVALL_ON;
3885 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3886 return NULL;
3887 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3888 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3889 return set_error();
3890 }
3891 return PyLong_FromUnsignedLong(recv); }
3892 case SIO_KEEPALIVE_VALS: {
3893 struct tcp_keepalive ka;
3894 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3895 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3896 return NULL;
3897 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3898 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3899 return set_error();
3900 }
3901 return PyLong_FromUnsignedLong(recv); }
3902 default:
3903 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3904 return NULL;
3905 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003906}
3907PyDoc_STRVAR(sock_ioctl_doc,
3908"ioctl(cmd, option) -> long\n\
3909\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003910Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3911SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3912SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003913#endif
3914
3915#if defined(MS_WINDOWS)
3916static PyObject*
3917sock_share(PySocketSockObject *s, PyObject *arg)
3918{
3919 WSAPROTOCOL_INFO info;
3920 DWORD processId;
3921 int result;
3922
3923 if (!PyArg_ParseTuple(arg, "I", &processId))
3924 return NULL;
3925
3926 Py_BEGIN_ALLOW_THREADS
3927 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3928 Py_END_ALLOW_THREADS
3929 if (result == SOCKET_ERROR)
3930 return set_error();
3931 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3932}
3933PyDoc_STRVAR(sock_share_doc,
3934"share(process_id) -> bytes\n\
3935\n\
3936Share the socket with another process. The target process id\n\
3937must be provided and the resulting bytes object passed to the target\n\
3938process. There the shared socket can be instantiated by calling\n\
3939socket.fromshare().");
3940
Christian Heimesfaf2f632008-01-06 16:59:19 +00003941
3942#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003943
3944/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003945
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003946static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3948 accept_doc},
3949 {"bind", (PyCFunction)sock_bind, METH_O,
3950 bind_doc},
3951 {"close", (PyCFunction)sock_close, METH_NOARGS,
3952 close_doc},
3953 {"connect", (PyCFunction)sock_connect, METH_O,
3954 connect_doc},
3955 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3956 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003957 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3958 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3960 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003961#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 {"getpeername", (PyCFunction)sock_getpeername,
3963 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003964#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003965 {"getsockname", (PyCFunction)sock_getsockname,
3966 METH_NOARGS, getsockname_doc},
3967 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3968 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003969#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003970 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3971 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003972#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003973#if defined(MS_WINDOWS)
3974 {"share", (PyCFunction)sock_share, METH_VARARGS,
3975 sock_share_doc},
3976#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003977 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003978 listen_doc},
3979 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3980 recv_doc},
3981 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3982 recv_into_doc},
3983 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3984 recvfrom_doc},
3985 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3986 recvfrom_into_doc},
3987 {"send", (PyCFunction)sock_send, METH_VARARGS,
3988 send_doc},
3989 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3990 sendall_doc},
3991 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3992 sendto_doc},
3993 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3994 setblocking_doc},
3995 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3996 settimeout_doc},
3997 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3998 gettimeout_doc},
3999 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4000 setsockopt_doc},
4001 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4002 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004003#ifdef CMSG_LEN
4004 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4005 recvmsg_doc},
4006 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4007 recvmsg_into_doc,},
4008 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4009 sendmsg_doc},
4010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004012};
4013
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004014/* SockObject members */
4015static PyMemberDef sock_memberlist[] = {
4016 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4017 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4018 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004019 {0},
4020};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004021
Victor Stinner71694d52015-03-28 01:18:54 +01004022static PyGetSetDef sock_getsetlist[] = {
4023 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4024 {NULL} /* sentinel */
4025};
4026
Guido van Rossum73624e91994-10-10 17:59:00 +00004027/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004028 First close the file description. */
4029
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004030static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004031sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004032{
Antoine Pitroue033e062010-10-29 10:38:18 +00004033 if (s->sock_fd != -1) {
4034 PyObject *exc, *val, *tb;
4035 Py_ssize_t old_refcount = Py_REFCNT(s);
4036 ++Py_REFCNT(s);
4037 PyErr_Fetch(&exc, &val, &tb);
4038 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4039 "unclosed %R", s))
4040 /* Spurious errors can appear at shutdown */
4041 if (PyErr_ExceptionMatches(PyExc_Warning))
4042 PyErr_WriteUnraisable((PyObject *) s);
4043 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004045 Py_REFCNT(s) = old_refcount;
4046 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004047 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004048}
4049
Guido van Rossum30a685f1991-06-27 15:51:29 +00004050
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004051static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004052sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004053{
Victor Stinnere254e532014-07-26 14:36:55 +02004054 long sock_fd;
4055 /* On Windows, this test is needed because SOCKET_T is unsigned */
4056 if (s->sock_fd == INVALID_SOCKET) {
4057 sock_fd = -1;
4058 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004059#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004060 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004061 /* this can occur on Win64, and actually there is a special
4062 ugly printf formatter for decimal pointer length integer
4063 printing, only bother if necessary*/
4064 PyErr_SetString(PyExc_OverflowError,
4065 "no printf formatter to display "
4066 "the socket descriptor in decimal");
4067 return NULL;
4068 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004069#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004070 else
4071 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 return PyUnicode_FromFormat(
4073 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004074 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 s->sock_type,
4076 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004077}
4078
4079
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004080/* Create a new, uninitialized socket object. */
4081
4082static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004083sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004084{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004085 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 new = type->tp_alloc(type, 0);
4088 if (new != NULL) {
4089 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner71694d52015-03-28 01:18:54 +01004090 ((PySocketSockObject *)new)->sock_timeout = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 ((PySocketSockObject *)new)->errorhandler = &set_error;
4092 }
4093 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004094}
4095
4096
4097/* Initialize a new socket object. */
4098
Victor Stinnerdaf45552013-08-28 00:53:59 +02004099#ifdef SOCK_CLOEXEC
4100/* socket() and socketpair() fail with EINVAL on Linux kernel older
4101 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4102static int sock_cloexec_works = -1;
4103#endif
4104
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004105/*ARGSUSED*/
4106static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004107sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004108{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004109 PySocketSockObject *s = (PySocketSockObject *)self;
4110 PyObject *fdobj = NULL;
4111 SOCKET_T fd = INVALID_SOCKET;
4112 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4113 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004114#ifndef MS_WINDOWS
4115#ifdef SOCK_CLOEXEC
4116 int *atomic_flag_works = &sock_cloexec_works;
4117#else
4118 int *atomic_flag_works = NULL;
4119#endif
4120#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004122 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4123 "|iiiO:socket", keywords,
4124 &family, &type, &proto, &fdobj))
4125 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004127 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004128#ifdef MS_WINDOWS
4129 /* recreate a socket that was duplicated */
4130 if (PyBytes_Check(fdobj)) {
4131 WSAPROTOCOL_INFO info;
4132 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4133 PyErr_Format(PyExc_ValueError,
4134 "socket descriptor string has wrong size, "
4135 "should be %zu bytes.", sizeof(info));
4136 return -1;
4137 }
4138 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4139 Py_BEGIN_ALLOW_THREADS
4140 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4141 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4142 Py_END_ALLOW_THREADS
4143 if (fd == INVALID_SOCKET) {
4144 set_error();
4145 return -1;
4146 }
4147 family = info.iAddressFamily;
4148 type = info.iSocketType;
4149 proto = info.iProtocol;
4150 }
4151 else
4152#endif
4153 {
4154 fd = PyLong_AsSocket_t(fdobj);
4155 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4156 return -1;
4157 if (fd == INVALID_SOCKET) {
4158 PyErr_SetString(PyExc_ValueError,
4159 "can't use invalid socket value");
4160 return -1;
4161 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004162 }
4163 }
4164 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004165#ifdef MS_WINDOWS
4166 /* Windows implementation */
4167#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4168#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4169#endif
4170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004172 if (support_wsa_no_inherit) {
4173 fd = WSASocket(family, type, proto,
4174 NULL, 0,
4175 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4176 if (fd == INVALID_SOCKET) {
4177 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4178 support_wsa_no_inherit = 0;
4179 fd = socket(family, type, proto);
4180 }
4181 }
4182 else {
4183 fd = socket(family, type, proto);
4184 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004187 if (fd == INVALID_SOCKET) {
4188 set_error();
4189 return -1;
4190 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004191
4192 if (!support_wsa_no_inherit) {
4193 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4194 closesocket(fd);
4195 PyErr_SetFromWindowsErr(0);
4196 return -1;
4197 }
4198 }
4199#else
4200 /* UNIX */
4201 Py_BEGIN_ALLOW_THREADS
4202#ifdef SOCK_CLOEXEC
4203 if (sock_cloexec_works != 0) {
4204 fd = socket(family, type | SOCK_CLOEXEC, proto);
4205 if (sock_cloexec_works == -1) {
4206 if (fd >= 0) {
4207 sock_cloexec_works = 1;
4208 }
4209 else if (errno == EINVAL) {
4210 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4211 sock_cloexec_works = 0;
4212 fd = socket(family, type, proto);
4213 }
4214 }
4215 }
4216 else
4217#endif
4218 {
4219 fd = socket(family, type, proto);
4220 }
4221 Py_END_ALLOW_THREADS
4222
4223 if (fd == INVALID_SOCKET) {
4224 set_error();
4225 return -1;
4226 }
4227
4228 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4229 SOCKETCLOSE(fd);
4230 return -1;
4231 }
4232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 }
4234 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004236 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004237
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004238}
4239
4240
Guido van Rossumb6775db1994-08-01 11:34:53 +00004241/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004242
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004243static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4245 "_socket.socket", /* tp_name */
4246 sizeof(PySocketSockObject), /* tp_basicsize */
4247 0, /* tp_itemsize */
4248 (destructor)sock_dealloc, /* tp_dealloc */
4249 0, /* tp_print */
4250 0, /* tp_getattr */
4251 0, /* tp_setattr */
4252 0, /* tp_reserved */
4253 (reprfunc)sock_repr, /* tp_repr */
4254 0, /* tp_as_number */
4255 0, /* tp_as_sequence */
4256 0, /* tp_as_mapping */
4257 0, /* tp_hash */
4258 0, /* tp_call */
4259 0, /* tp_str */
4260 PyObject_GenericGetAttr, /* tp_getattro */
4261 0, /* tp_setattro */
4262 0, /* tp_as_buffer */
4263 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4264 sock_doc, /* tp_doc */
4265 0, /* tp_traverse */
4266 0, /* tp_clear */
4267 0, /* tp_richcompare */
4268 0, /* tp_weaklistoffset */
4269 0, /* tp_iter */
4270 0, /* tp_iternext */
4271 sock_methods, /* tp_methods */
4272 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004273 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004274 0, /* tp_base */
4275 0, /* tp_dict */
4276 0, /* tp_descr_get */
4277 0, /* tp_descr_set */
4278 0, /* tp_dictoffset */
4279 sock_initobj, /* tp_init */
4280 PyType_GenericAlloc, /* tp_alloc */
4281 sock_new, /* tp_new */
4282 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004283};
4284
Guido van Rossum30a685f1991-06-27 15:51:29 +00004285
Guido van Rossum81194471991-07-27 21:42:02 +00004286/* Python interface to gethostname(). */
4287
4288/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004289static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004290socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004291{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004292#ifdef MS_WINDOWS
4293 /* Don't use winsock's gethostname, as this returns the ANSI
4294 version of the hostname, whereas we need a Unicode string.
4295 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004296 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004297 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004298 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004299 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004300
4301 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004302 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004303
4304 if (GetLastError() != ERROR_MORE_DATA)
4305 return PyErr_SetFromWindowsErr(0);
4306
4307 if (size == 0)
4308 return PyUnicode_New(0, 0);
4309
4310 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4311 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004312 name = PyMem_New(wchar_t, size);
4313 if (!name) {
4314 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004315 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004316 }
Victor Stinner74168972011-11-17 01:11:36 +01004317 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4318 name,
4319 &size))
4320 {
4321 PyMem_Free(name);
4322 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004323 }
Victor Stinner74168972011-11-17 01:11:36 +01004324
4325 result = PyUnicode_FromWideChar(name, size);
4326 PyMem_Free(name);
4327 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004328#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 char buf[1024];
4330 int res;
4331 Py_BEGIN_ALLOW_THREADS
4332 res = gethostname(buf, (int) sizeof buf - 1);
4333 Py_END_ALLOW_THREADS
4334 if (res < 0)
4335 return set_error();
4336 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004337 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004338#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004339}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004341PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004342"gethostname() -> string\n\
4343\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004344Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004345
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004346#ifdef HAVE_SETHOSTNAME
4347PyDoc_STRVAR(sethostname_doc,
4348"sethostname(name)\n\n\
4349Sets the hostname to name.");
4350
4351static PyObject *
4352socket_sethostname(PyObject *self, PyObject *args)
4353{
4354 PyObject *hnobj;
4355 Py_buffer buf;
4356 int res, flag = 0;
4357
Christian Heimesd2774c72013-06-19 02:06:29 +02004358#ifdef _AIX
4359/* issue #18259, not declared in any useful header file */
4360extern int sethostname(const char *, size_t);
4361#endif
4362
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004363 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4364 PyErr_Clear();
4365 if (!PyArg_ParseTuple(args, "O&:sethostname",
4366 PyUnicode_FSConverter, &hnobj))
4367 return NULL;
4368 flag = 1;
4369 }
4370 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4371 if (!res) {
4372 res = sethostname(buf.buf, buf.len);
4373 PyBuffer_Release(&buf);
4374 }
4375 if (flag)
4376 Py_DECREF(hnobj);
4377 if (res)
4378 return set_error();
4379 Py_RETURN_NONE;
4380}
4381#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004382
Guido van Rossum30a685f1991-06-27 15:51:29 +00004383/* Python interface to gethostbyname(name). */
4384
4385/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004386static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004387socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004388{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 char *name;
4390 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004391 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004392
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004393 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004394 return NULL;
4395 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004396 goto finally;
4397 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4398finally:
4399 PyMem_Free(name);
4400 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004401}
4402
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004403PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004404"gethostbyname(host) -> address\n\
4405\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004406Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004407
4408
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004409/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4410
4411static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004412gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004413{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 char **pch;
4415 PyObject *rtn_tuple = (PyObject *)NULL;
4416 PyObject *name_list = (PyObject *)NULL;
4417 PyObject *addr_list = (PyObject *)NULL;
4418 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 if (h == NULL) {
4421 /* Let's get real error message to return */
4422 set_herror(h_errno);
4423 return NULL;
4424 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004426 if (h->h_addrtype != af) {
4427 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004428 errno = EAFNOSUPPORT;
4429 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 return NULL;
4431 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004433 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004434
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004435 case AF_INET:
4436 if (alen < sizeof(struct sockaddr_in))
4437 return NULL;
4438 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004439
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004440#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004441 case AF_INET6:
4442 if (alen < sizeof(struct sockaddr_in6))
4443 return NULL;
4444 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004445#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004446
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004447 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 if ((name_list = PyList_New(0)) == NULL)
4450 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 if ((addr_list = PyList_New(0)) == NULL)
4453 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004454
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004455 /* SF #1511317: h_aliases can be NULL */
4456 if (h->h_aliases) {
4457 for (pch = h->h_aliases; *pch != NULL; pch++) {
4458 int status;
4459 tmp = PyUnicode_FromString(*pch);
4460 if (tmp == NULL)
4461 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 status = PyList_Append(name_list, tmp);
4464 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004466 if (status)
4467 goto err;
4468 }
4469 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4472 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004474 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 case AF_INET:
4477 {
4478 struct sockaddr_in sin;
4479 memset(&sin, 0, sizeof(sin));
4480 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004481#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004482 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004483#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4485 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004487 if (pch == h->h_addr_list && alen >= sizeof(sin))
4488 memcpy((char *) addr, &sin, sizeof(sin));
4489 break;
4490 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004491
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004492#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004493 case AF_INET6:
4494 {
4495 struct sockaddr_in6 sin6;
4496 memset(&sin6, 0, sizeof(sin6));
4497 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004498#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004501 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4502 tmp = makeipaddr((struct sockaddr *)&sin6,
4503 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004505 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4506 memcpy((char *) addr, &sin6, sizeof(sin6));
4507 break;
4508 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004509#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004511 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004512 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004513 "unsupported address family");
4514 return NULL;
4515 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 if (tmp == NULL)
4518 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 status = PyList_Append(addr_list, tmp);
4521 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004523 if (status)
4524 goto err;
4525 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004526
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004528
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004529 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004530 Py_XDECREF(name_list);
4531 Py_XDECREF(addr_list);
4532 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004533}
4534
4535
4536/* Python interface to gethostbyname_ex(name). */
4537
4538/*ARGSUSED*/
4539static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004540socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 char *name;
4543 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004544 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004546 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004547#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004548 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004549#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004550 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004551#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004552 char buf[16384];
4553 int buf_len = (sizeof buf) - 1;
4554 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004555#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004556#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004558#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004559#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004560
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004561 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004563 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004564 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004565 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004566#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004567#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004568 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004569 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004570#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004571 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004572#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004573 memset((void *) &data, '\0', sizeof(data));
4574 result = gethostbyname_r(name, &hp_allocated, &data);
4575 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004576#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004577#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004578#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004580#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004581 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004582#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004583 Py_END_ALLOW_THREADS
4584 /* Some C libraries would require addr.__ss_family instead of
4585 addr.ss_family.
4586 Therefore, we cast the sockaddr_storage into sockaddr to
4587 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004588 sa = SAS2SA(&addr);
4589 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004591#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004592 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004593#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004594finally:
4595 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004596 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004597}
4598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004599PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004600"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4601\n\
4602Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004603for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004604
4605
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004606/* Python interface to gethostbyaddr(IP). */
4607
4608/*ARGSUSED*/
4609static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004610socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004611{
Charles-François Natali8b759652011-12-23 16:44:51 +01004612 sock_addr_t addr;
4613 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 char *ip_num;
4615 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004616 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004617#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004619#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004621#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 /* glibcs up to 2.10 assume that the buf argument to
4623 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4624 does not ensure. The attribute below instructs the compiler
4625 to maintain this alignment. */
4626 char buf[16384] Py_ALIGNED(8);
4627 int buf_len = (sizeof buf) - 1;
4628 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004629#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004630#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004632#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004633#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004634 char *ap;
4635 int al;
4636 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004637
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004638 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 return NULL;
4640 af = AF_UNSPEC;
4641 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004642 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 af = sa->sa_family;
4644 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004645 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004646 switch (af) {
4647 case AF_INET:
4648 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4649 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4650 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004651#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004652 case AF_INET6:
4653 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4654 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4655 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004656#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004658 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004659 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 }
4661 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004662#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004663#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004664 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 &hp_allocated, buf, buf_len,
4666 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004667#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 h = gethostbyaddr_r(ap, al, af,
4669 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004670#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 memset((void *) &data, '\0', sizeof(data));
4672 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4673 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004674#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004675#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004676#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004677 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004680#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004682 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004683#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004684 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004685#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004686finally:
4687 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004688 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004689}
4690
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004691PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004692"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4693\n\
4694Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004695for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004696
Guido van Rossum30a685f1991-06-27 15:51:29 +00004697
4698/* Python interface to getservbyname(name).
4699 This only returns the port number, since the other info is already
4700 known or not useful (like the list of aliases). */
4701
4702/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004703static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004704socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004705{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004706 char *name, *proto=NULL;
4707 struct servent *sp;
4708 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4709 return NULL;
4710 Py_BEGIN_ALLOW_THREADS
4711 sp = getservbyname(name, proto);
4712 Py_END_ALLOW_THREADS
4713 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004714 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 return NULL;
4716 }
4717 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004718}
4719
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004720PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004721"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004722\n\
4723Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004724The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4725otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004726
Guido van Rossum30a685f1991-06-27 15:51:29 +00004727
Barry Warsaw11b91a02004-06-28 00:50:43 +00004728/* Python interface to getservbyport(port).
4729 This only returns the service name, since the other info is already
4730 known or not useful (like the list of aliases). */
4731
4732/*ARGSUSED*/
4733static PyObject *
4734socket_getservbyport(PyObject *self, PyObject *args)
4735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004736 int port;
4737 char *proto=NULL;
4738 struct servent *sp;
4739 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4740 return NULL;
4741 if (port < 0 || port > 0xffff) {
4742 PyErr_SetString(
4743 PyExc_OverflowError,
4744 "getservbyport: port must be 0-65535.");
4745 return NULL;
4746 }
4747 Py_BEGIN_ALLOW_THREADS
4748 sp = getservbyport(htons((short)port), proto);
4749 Py_END_ALLOW_THREADS
4750 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004751 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 return NULL;
4753 }
4754 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004755}
4756
4757PyDoc_STRVAR(getservbyport_doc,
4758"getservbyport(port[, protocolname]) -> string\n\
4759\n\
4760Return the service name from a port number and protocol name.\n\
4761The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4762otherwise any protocol will match.");
4763
Guido van Rossum3901d851996-12-19 16:35:04 +00004764/* Python interface to getprotobyname(name).
4765 This only returns the protocol number, since the other info is
4766 already known or not useful (like the list of aliases). */
4767
4768/*ARGSUSED*/
4769static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004770socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004771{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004772 char *name;
4773 struct protoent *sp;
4774 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4775 return NULL;
4776 Py_BEGIN_ALLOW_THREADS
4777 sp = getprotobyname(name);
4778 Py_END_ALLOW_THREADS
4779 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004780 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 return NULL;
4782 }
4783 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004784}
4785
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004786PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004787"getprotobyname(name) -> integer\n\
4788\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004789Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004790
Guido van Rossum3901d851996-12-19 16:35:04 +00004791
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004792#ifndef NO_DUP
4793/* dup() function for socket fds */
4794
4795static PyObject *
4796socket_dup(PyObject *self, PyObject *fdobj)
4797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 SOCKET_T fd, newfd;
4799 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004800#ifdef MS_WINDOWS
4801 WSAPROTOCOL_INFO info;
4802#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004804 fd = PyLong_AsSocket_t(fdobj);
4805 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4806 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004807
Victor Stinnerdaf45552013-08-28 00:53:59 +02004808#ifdef MS_WINDOWS
4809 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4810 return set_error();
4811
4812 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4813 FROM_PROTOCOL_INFO,
4814 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 if (newfd == INVALID_SOCKET)
4816 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004817
Victor Stinnerdaf45552013-08-28 00:53:59 +02004818 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4819 closesocket(newfd);
4820 PyErr_SetFromWindowsErr(0);
4821 return NULL;
4822 }
4823#else
4824 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4825 newfd = _Py_dup(fd);
4826 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004827 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004828#endif
4829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004830 newfdobj = PyLong_FromSocket_t(newfd);
4831 if (newfdobj == NULL)
4832 SOCKETCLOSE(newfd);
4833 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004834}
4835
4836PyDoc_STRVAR(dup_doc,
4837"dup(integer) -> integer\n\
4838\n\
4839Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4840sockets; on some platforms os.dup() won't work for socket file descriptors.");
4841#endif
4842
4843
Dave Cole331708b2004-08-09 04:51:41 +00004844#ifdef HAVE_SOCKETPAIR
4845/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004846 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004847 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004848
4849/*ARGSUSED*/
4850static PyObject *
4851socket_socketpair(PyObject *self, PyObject *args)
4852{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 PySocketSockObject *s0 = NULL, *s1 = NULL;
4854 SOCKET_T sv[2];
4855 int family, type = SOCK_STREAM, proto = 0;
4856 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004857#ifdef SOCK_CLOEXEC
4858 int *atomic_flag_works = &sock_cloexec_works;
4859#else
4860 int *atomic_flag_works = NULL;
4861#endif
4862 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004863
4864#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004865 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004866#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004868#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004869 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4870 &family, &type, &proto))
4871 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004874 Py_BEGIN_ALLOW_THREADS
4875#ifdef SOCK_CLOEXEC
4876 if (sock_cloexec_works != 0) {
4877 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4878 if (sock_cloexec_works == -1) {
4879 if (ret >= 0) {
4880 sock_cloexec_works = 1;
4881 }
4882 else if (errno == EINVAL) {
4883 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4884 sock_cloexec_works = 0;
4885 ret = socketpair(family, type, proto, sv);
4886 }
4887 }
4888 }
4889 else
4890#endif
4891 {
4892 ret = socketpair(family, type, proto, sv);
4893 }
4894 Py_END_ALLOW_THREADS
4895
4896 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004897 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004898
4899 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4900 goto finally;
4901 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4902 goto finally;
4903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 s0 = new_sockobject(sv[0], family, type, proto);
4905 if (s0 == NULL)
4906 goto finally;
4907 s1 = new_sockobject(sv[1], family, type, proto);
4908 if (s1 == NULL)
4909 goto finally;
4910 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004911
4912finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 if (res == NULL) {
4914 if (s0 == NULL)
4915 SOCKETCLOSE(sv[0]);
4916 if (s1 == NULL)
4917 SOCKETCLOSE(sv[1]);
4918 }
4919 Py_XDECREF(s0);
4920 Py_XDECREF(s1);
4921 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004922}
4923
4924PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004925"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004926\n\
4927Create a pair of socket objects from the sockets returned by the platform\n\
4928socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004929The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004930AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004931
4932#endif /* HAVE_SOCKETPAIR */
4933
4934
Guido van Rossum006bf911996-06-12 04:04:55 +00004935static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004936socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004937{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004938 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004940 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4941 return NULL;
4942 }
4943 if (x1 < 0) {
4944 PyErr_SetString(PyExc_OverflowError,
4945 "can't convert negative number to unsigned long");
4946 return NULL;
4947 }
4948 x2 = (unsigned int)ntohs((unsigned short)x1);
4949 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004950}
4951
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004952PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004953"ntohs(integer) -> integer\n\
4954\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004955Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004956
4957
Guido van Rossum006bf911996-06-12 04:04:55 +00004958static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004959socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004960{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 if (PyLong_Check(arg)) {
4964 x = PyLong_AsUnsignedLong(arg);
4965 if (x == (unsigned long) -1 && PyErr_Occurred())
4966 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004967#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004968 {
4969 unsigned long y;
4970 /* only want the trailing 32 bits */
4971 y = x & 0xFFFFFFFFUL;
4972 if (y ^ x)
4973 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004974 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 x = y;
4976 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004977#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004978 }
4979 else
4980 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004981 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004982 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004984}
4985
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004986PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004987"ntohl(integer) -> integer\n\
4988\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004989Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004990
4991
Guido van Rossum006bf911996-06-12 04:04:55 +00004992static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004993socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4998 return NULL;
4999 }
5000 if (x1 < 0) {
5001 PyErr_SetString(PyExc_OverflowError,
5002 "can't convert negative number to unsigned long");
5003 return NULL;
5004 }
5005 x2 = (unsigned int)htons((unsigned short)x1);
5006 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005007}
5008
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005009PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005010"htons(integer) -> integer\n\
5011\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005012Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005013
5014
Guido van Rossum006bf911996-06-12 04:04:55 +00005015static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005016socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005018 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005020 if (PyLong_Check(arg)) {
5021 x = PyLong_AsUnsignedLong(arg);
5022 if (x == (unsigned long) -1 && PyErr_Occurred())
5023 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005024#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005025 {
5026 unsigned long y;
5027 /* only want the trailing 32 bits */
5028 y = x & 0xFFFFFFFFUL;
5029 if (y ^ x)
5030 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005031 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 x = y;
5033 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005034#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005035 }
5036 else
5037 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005038 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005039 Py_TYPE(arg)->tp_name);
5040 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005041}
5042
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005043PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005044"htonl(integer) -> integer\n\
5045\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005046Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005047
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005048/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005049
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005050PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005051"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005052\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005053Convert 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 +00005054binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005055
5056static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005057socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005058{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005059#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005060 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005061#endif
5062
5063#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005064#if (SIZEOF_INT != 4)
5065#error "Not sure if in_addr_t exists and int is not 32-bits."
5066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 /* Have to use inet_addr() instead */
5068 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005069#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005072 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5073 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005074
Tim Peters1df9fdd2003-02-13 03:13:40 +00005075
5076#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005077
5078#ifdef USE_INET_ATON_WEAKLINK
5079 if (inet_aton != NULL) {
5080#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 if (inet_aton(ip_addr, &buf))
5082 return PyBytes_FromStringAndSize((char *)(&buf),
5083 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005084
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005085 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005086 "illegal IP address string passed to inet_aton");
5087 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005088
Thomas Wouters477c8d52006-05-27 19:21:47 +00005089#ifdef USE_INET_ATON_WEAKLINK
5090 } else {
5091#endif
5092
5093#endif
5094
5095#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005097 /* special-case this address as inet_addr might return INADDR_NONE
5098 * for this */
5099 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005100 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005101 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005103 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005104
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005106 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005107 "illegal IP address string passed to inet_aton");
5108 return NULL;
5109 }
5110 }
5111 return PyBytes_FromStringAndSize((char *) &packed_addr,
5112 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005113
5114#ifdef USE_INET_ATON_WEAKLINK
5115 }
5116#endif
5117
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005118#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005119}
5120
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005121PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005122"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005123\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005124Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005125
5126static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005127socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005128{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005129 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005131
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005132 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005133 return NULL;
5134 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005135
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005136 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005137 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005138 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005139 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005140 return NULL;
5141 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005142
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005143 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5144 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005146 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005147}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005148
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005149#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005150
5151PyDoc_STRVAR(inet_pton_doc,
5152"inet_pton(af, ip) -> packed IP address string\n\
5153\n\
5154Convert an IP address from string format to a packed string suitable\n\
5155for use with low-level network functions.");
5156
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005157#endif
5158
5159#ifdef HAVE_INET_PTON
5160
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005161static PyObject *
5162socket_inet_pton(PyObject *self, PyObject *args)
5163{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005164 int af;
5165 char* ip;
5166 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005167#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005168 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005169#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005170 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005171#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005172 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5173 return NULL;
5174 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005175
Martin v. Löwis04697e82004-06-02 12:35:29 +00005176#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005177 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005178 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005179 "can't use AF_INET6, IPv6 is disabled");
5180 return NULL;
5181 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005182#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 retval = inet_pton(af, ip, packed);
5185 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005186 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 return NULL;
5188 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005189 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 "illegal IP address string passed to inet_pton");
5191 return NULL;
5192 } else if (af == AF_INET) {
5193 return PyBytes_FromStringAndSize(packed,
5194 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005195#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 } else if (af == AF_INET6) {
5197 return PyBytes_FromStringAndSize(packed,
5198 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005201 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 return NULL;
5203 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005204}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005205#elif defined(MS_WINDOWS)
5206
5207static PyObject *
5208socket_inet_pton(PyObject *self, PyObject *args)
5209{
5210 int af;
5211 char* ip;
5212 struct sockaddr_in6 addr;
5213 INT ret, size;
5214
5215 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5216 return NULL;
5217 }
5218
Victor Stinnere990c6e2013-11-16 00:18:58 +01005219 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005220 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5221
5222 if (ret) {
5223 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5224 return NULL;
5225 } else if(af == AF_INET) {
5226 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005227 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005228 sizeof(addr4->sin_addr));
5229 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005230 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005231 sizeof(addr.sin6_addr));
5232 } else {
5233 PyErr_SetString(PyExc_OSError, "unknown address family");
5234 return NULL;
5235 }
5236}
5237
5238#endif
5239
5240#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005241
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005242PyDoc_STRVAR(inet_ntop_doc,
5243"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5244\n\
5245Convert a packed IP address of the given family to string format.");
5246
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005247#endif
5248
5249
5250#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005251static PyObject *
5252socket_inet_ntop(PyObject *self, PyObject *args)
5253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005255 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005256 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005257#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005258 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005259#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005261#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5264 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005265
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005266 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 return NULL;
5268 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005271 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 PyErr_SetString(PyExc_ValueError,
5273 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005274 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 return NULL;
5276 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005277#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005278 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005279 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 PyErr_SetString(PyExc_ValueError,
5281 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005282 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 return NULL;
5284 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005285#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 } else {
5287 PyErr_Format(PyExc_ValueError,
5288 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005289 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005290 return NULL;
5291 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005292
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005293 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5294 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005295 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005296 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005297 return NULL;
5298 } else {
5299 return PyUnicode_FromString(retval);
5300 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 /* NOTREACHED */
5303 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5304 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005305}
5306
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005307#elif defined(MS_WINDOWS)
5308
5309static PyObject *
5310socket_inet_ntop(PyObject *self, PyObject *args)
5311{
5312 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005313 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005314 struct sockaddr_in6 addr;
5315 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005316#ifdef ENABLE_IPV6
5317 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5318#else
5319 char ip[INET_ADDRSTRLEN + 1];
5320#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005321
5322 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5323 memset((void *) &ip[0], '\0', sizeof(ip));
5324
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005325 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005326 return NULL;
5327 }
5328
5329 if (af == AF_INET) {
5330 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5331
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005332 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005333 PyErr_SetString(PyExc_ValueError,
5334 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005335 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005336 return NULL;
5337 }
5338 memset(addr4, 0, sizeof(struct sockaddr_in));
5339 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005340 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005341 addrlen = sizeof(struct sockaddr_in);
5342 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005343 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005344 PyErr_SetString(PyExc_ValueError,
5345 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005346 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005347 return NULL;
5348 }
5349
5350 memset(&addr, 0, sizeof(addr));
5351 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005352 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005353 addrlen = sizeof(addr);
5354 } else {
5355 PyErr_Format(PyExc_ValueError,
5356 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005357 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005358 return NULL;
5359 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005360 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005361
5362 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005363 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005364 ip, &retlen);
5365
5366 if (ret) {
5367 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5368 return NULL;
5369 } else {
5370 return PyUnicode_FromString(ip);
5371 }
5372}
5373
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005374#endif /* HAVE_INET_PTON */
5375
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005376/* Python interface to getaddrinfo(host, port). */
5377
5378/*ARGSUSED*/
5379static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005380socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005381{
Victor Stinner77af1722011-05-26 14:05:59 +02005382 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005383 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 struct addrinfo hints, *res;
5385 struct addrinfo *res0 = NULL;
5386 PyObject *hobj = NULL;
5387 PyObject *pobj = (PyObject *)NULL;
5388 char pbuf[30];
5389 char *hptr, *pptr;
5390 int family, socktype, protocol, flags;
5391 int error;
5392 PyObject *all = (PyObject *)NULL;
5393 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005394
Georg Brandl6083a4b2013-10-14 06:51:46 +02005395 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005397 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005398 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005399 &protocol, &flags)) {
5400 return NULL;
5401 }
5402 if (hobj == Py_None) {
5403 hptr = NULL;
5404 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005405 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005406
5407 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 if (!idna)
5409 return NULL;
5410 assert(PyBytes_Check(idna));
5411 hptr = PyBytes_AS_STRING(idna);
5412 } else if (PyBytes_Check(hobj)) {
5413 hptr = PyBytes_AsString(hobj);
5414 } else {
5415 PyErr_SetString(PyExc_TypeError,
5416 "getaddrinfo() argument 1 must be string or None");
5417 return NULL;
5418 }
5419 if (PyLong_CheckExact(pobj)) {
5420 long value = PyLong_AsLong(pobj);
5421 if (value == -1 && PyErr_Occurred())
5422 goto err;
5423 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5424 pptr = pbuf;
5425 } else if (PyUnicode_Check(pobj)) {
5426 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005427 if (pptr == NULL)
5428 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005429 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005430 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005431 } else if (pobj == Py_None) {
5432 pptr = (char *)NULL;
5433 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005434 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005435 goto err;
5436 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005437#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005438 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5439 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005440 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5441 * This workaround avoids a segfault in libsystem.
5442 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005443 pptr = "00";
5444 }
5445#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005446 memset(&hints, 0, sizeof(hints));
5447 hints.ai_family = family;
5448 hints.ai_socktype = socktype;
5449 hints.ai_protocol = protocol;
5450 hints.ai_flags = flags;
5451 Py_BEGIN_ALLOW_THREADS
5452 ACQUIRE_GETADDRINFO_LOCK
5453 error = getaddrinfo(hptr, pptr, &hints, &res0);
5454 Py_END_ALLOW_THREADS
5455 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5456 if (error) {
5457 set_gaierror(error);
5458 goto err;
5459 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005461 if ((all = PyList_New(0)) == NULL)
5462 goto err;
5463 for (res = res0; res; res = res->ai_next) {
5464 PyObject *single;
5465 PyObject *addr =
5466 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5467 if (addr == NULL)
5468 goto err;
5469 single = Py_BuildValue("iiisO", res->ai_family,
5470 res->ai_socktype, res->ai_protocol,
5471 res->ai_canonname ? res->ai_canonname : "",
5472 addr);
5473 Py_DECREF(addr);
5474 if (single == NULL)
5475 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005476
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005477 if (PyList_Append(all, single))
5478 goto err;
5479 Py_XDECREF(single);
5480 }
5481 Py_XDECREF(idna);
5482 if (res0)
5483 freeaddrinfo(res0);
5484 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005485 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005486 Py_XDECREF(all);
5487 Py_XDECREF(idna);
5488 if (res0)
5489 freeaddrinfo(res0);
5490 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005491}
5492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005493PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005494"getaddrinfo(host, port [, family, type, proto, flags])\n\
5495 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005496\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005497Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005498
5499/* Python interface to getnameinfo(sa, flags). */
5500
5501/*ARGSUSED*/
5502static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005503socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005504{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005505 PyObject *sa = (PyObject *)NULL;
5506 int flags;
5507 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005508 int port;
5509 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005510 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5511 struct addrinfo hints, *res = NULL;
5512 int error;
5513 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005515 flags = flowinfo = scope_id = 0;
5516 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5517 return NULL;
5518 if (!PyTuple_Check(sa)) {
5519 PyErr_SetString(PyExc_TypeError,
5520 "getnameinfo() argument 1 must be a tuple");
5521 return NULL;
5522 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005523 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005524 &hostp, &port, &flowinfo, &scope_id))
5525 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005526 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005527 PyErr_SetString(PyExc_OverflowError,
5528 "getsockaddrarg: flowinfo must be 0-1048575.");
5529 return NULL;
5530 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005531 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5532 memset(&hints, 0, sizeof(hints));
5533 hints.ai_family = AF_UNSPEC;
5534 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005535 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 Py_BEGIN_ALLOW_THREADS
5537 ACQUIRE_GETADDRINFO_LOCK
5538 error = getaddrinfo(hostp, pbuf, &hints, &res);
5539 Py_END_ALLOW_THREADS
5540 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5541 if (error) {
5542 set_gaierror(error);
5543 goto fail;
5544 }
5545 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005546 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005547 "sockaddr resolved to multiple addresses");
5548 goto fail;
5549 }
5550 switch (res->ai_family) {
5551 case AF_INET:
5552 {
5553 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005554 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005555 "IPv4 sockaddr must be 2 tuple");
5556 goto fail;
5557 }
5558 break;
5559 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005560#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005561 case AF_INET6:
5562 {
5563 struct sockaddr_in6 *sin6;
5564 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005565 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005566 sin6->sin6_scope_id = scope_id;
5567 break;
5568 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005570 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005571 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005572 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5573 if (error) {
5574 set_gaierror(error);
5575 goto fail;
5576 }
5577 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005578
5579fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005580 if (res)
5581 freeaddrinfo(res);
5582 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005583}
5584
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005585PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005586"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005587\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005588Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005589
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005590
5591/* Python API to getting and setting the default timeout value. */
5592
5593static PyObject *
5594socket_getdefaulttimeout(PyObject *self)
5595{
Victor Stinner71694d52015-03-28 01:18:54 +01005596 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005597 Py_INCREF(Py_None);
5598 return Py_None;
5599 }
Victor Stinner71694d52015-03-28 01:18:54 +01005600 else {
5601 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5602 return PyFloat_FromDouble(seconds);
5603 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005604}
5605
5606PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005607"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005608\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005609Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005610A value of None indicates that new socket objects have no timeout.\n\
5611When the socket module is first imported, the default is None.");
5612
5613static PyObject *
5614socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5615{
Victor Stinner71694d52015-03-28 01:18:54 +01005616 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005617
Victor Stinner71694d52015-03-28 01:18:54 +01005618 if (socket_parse_timeout(&timeout, arg) < 0)
5619 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005622
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005623 Py_INCREF(Py_None);
5624 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005625}
5626
5627PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005628"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005629\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005630Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005631A value of None indicates that new socket objects have no timeout.\n\
5632When the socket module is first imported, the default is None.");
5633
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005634#ifdef HAVE_IF_NAMEINDEX
5635/* Python API for getting interface indices and names */
5636
5637static PyObject *
5638socket_if_nameindex(PyObject *self, PyObject *arg)
5639{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005640 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005641 int i;
5642 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005643
Charles-François Natali60713592011-05-20 16:55:06 +02005644 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005645 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005646 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005647 return NULL;
5648 }
5649
5650 list = PyList_New(0);
5651 if (list == NULL) {
5652 if_freenameindex(ni);
5653 return NULL;
5654 }
5655
Charles-François Natali60713592011-05-20 16:55:06 +02005656 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5657 PyObject *ni_tuple = Py_BuildValue("IO&",
5658 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005659
5660 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5661 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005662 Py_DECREF(list);
5663 if_freenameindex(ni);
5664 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005665 }
5666 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005667 }
5668
5669 if_freenameindex(ni);
5670 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005671}
5672
5673PyDoc_STRVAR(if_nameindex_doc,
5674"if_nameindex()\n\
5675\n\
5676Returns a list of network interface information (index, name) tuples.");
5677
Charles-François Natali60713592011-05-20 16:55:06 +02005678static PyObject *
5679socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005680{
Charles-François Natali60713592011-05-20 16:55:06 +02005681 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005682 unsigned long index;
5683
Charles-François Natali60713592011-05-20 16:55:06 +02005684 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5685 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005686 return NULL;
5687
Charles-François Natali60713592011-05-20 16:55:06 +02005688 index = if_nametoindex(PyBytes_AS_STRING(oname));
5689 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005690 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005691 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005692 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005693 return NULL;
5694 }
5695
5696 return PyLong_FromUnsignedLong(index);
5697}
5698
5699PyDoc_STRVAR(if_nametoindex_doc,
5700"if_nametoindex(if_name)\n\
5701\n\
5702Returns the interface index corresponding to the interface name if_name.");
5703
Charles-François Natali60713592011-05-20 16:55:06 +02005704static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005705socket_if_indextoname(PyObject *self, PyObject *arg)
5706{
Charles-François Natali60713592011-05-20 16:55:06 +02005707 unsigned long index;
5708 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005709
Charles-François Natali60713592011-05-20 16:55:06 +02005710 index = PyLong_AsUnsignedLong(arg);
5711 if (index == (unsigned long) -1)
5712 return NULL;
5713
5714 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005715 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005716 return NULL;
5717 }
5718
Charles-François Natali60713592011-05-20 16:55:06 +02005719 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005720}
5721
5722PyDoc_STRVAR(if_indextoname_doc,
5723"if_indextoname(if_index)\n\
5724\n\
5725Returns the interface name corresponding to the interface index if_index.");
5726
5727#endif /* HAVE_IF_NAMEINDEX */
5728
5729
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005730#ifdef CMSG_LEN
5731/* Python interface to CMSG_LEN(length). */
5732
5733static PyObject *
5734socket_CMSG_LEN(PyObject *self, PyObject *args)
5735{
5736 Py_ssize_t length;
5737 size_t result;
5738
5739 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5740 return NULL;
5741 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5742 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5743 return NULL;
5744 }
5745 return PyLong_FromSize_t(result);
5746}
5747
5748PyDoc_STRVAR(CMSG_LEN_doc,
5749"CMSG_LEN(length) -> control message length\n\
5750\n\
5751Return the total length, without trailing padding, of an ancillary\n\
5752data item with associated data of the given length. This value can\n\
5753often be used as the buffer size for recvmsg() to receive a single\n\
5754item of ancillary data, but RFC 3542 requires portable applications to\n\
5755use CMSG_SPACE() and thus include space for padding, even when the\n\
5756item will be the last in the buffer. Raises OverflowError if length\n\
5757is outside the permissible range of values.");
5758
5759
5760#ifdef CMSG_SPACE
5761/* Python interface to CMSG_SPACE(length). */
5762
5763static PyObject *
5764socket_CMSG_SPACE(PyObject *self, PyObject *args)
5765{
5766 Py_ssize_t length;
5767 size_t result;
5768
5769 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5770 return NULL;
5771 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5772 PyErr_SetString(PyExc_OverflowError,
5773 "CMSG_SPACE() argument out of range");
5774 return NULL;
5775 }
5776 return PyLong_FromSize_t(result);
5777}
5778
5779PyDoc_STRVAR(CMSG_SPACE_doc,
5780"CMSG_SPACE(length) -> buffer size\n\
5781\n\
5782Return the buffer size needed for recvmsg() to receive an ancillary\n\
5783data item with associated data of the given length, along with any\n\
5784trailing padding. The buffer space needed to receive multiple items\n\
5785is the sum of the CMSG_SPACE() values for their associated data\n\
5786lengths. Raises OverflowError if length is outside the permissible\n\
5787range of values.");
5788#endif /* CMSG_SPACE */
5789#endif /* CMSG_LEN */
5790
5791
Guido van Rossum30a685f1991-06-27 15:51:29 +00005792/* List of functions exported by this module. */
5793
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005794static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 {"gethostbyname", socket_gethostbyname,
5796 METH_VARARGS, gethostbyname_doc},
5797 {"gethostbyname_ex", socket_gethostbyname_ex,
5798 METH_VARARGS, ghbn_ex_doc},
5799 {"gethostbyaddr", socket_gethostbyaddr,
5800 METH_VARARGS, gethostbyaddr_doc},
5801 {"gethostname", socket_gethostname,
5802 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005803#ifdef HAVE_SETHOSTNAME
5804 {"sethostname", socket_sethostname,
5805 METH_VARARGS, sethostname_doc},
5806#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 {"getservbyname", socket_getservbyname,
5808 METH_VARARGS, getservbyname_doc},
5809 {"getservbyport", socket_getservbyport,
5810 METH_VARARGS, getservbyport_doc},
5811 {"getprotobyname", socket_getprotobyname,
5812 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005813#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 {"dup", socket_dup,
5815 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005816#endif
Dave Cole331708b2004-08-09 04:51:41 +00005817#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 {"socketpair", socket_socketpair,
5819 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005820#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 {"ntohs", socket_ntohs,
5822 METH_VARARGS, ntohs_doc},
5823 {"ntohl", socket_ntohl,
5824 METH_O, ntohl_doc},
5825 {"htons", socket_htons,
5826 METH_VARARGS, htons_doc},
5827 {"htonl", socket_htonl,
5828 METH_O, htonl_doc},
5829 {"inet_aton", socket_inet_aton,
5830 METH_VARARGS, inet_aton_doc},
5831 {"inet_ntoa", socket_inet_ntoa,
5832 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005833#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005834 {"inet_pton", socket_inet_pton,
5835 METH_VARARGS, inet_pton_doc},
5836 {"inet_ntop", socket_inet_ntop,
5837 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005838#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005839 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5840 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005841 {"getnameinfo", socket_getnameinfo,
5842 METH_VARARGS, getnameinfo_doc},
5843 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5844 METH_NOARGS, getdefaulttimeout_doc},
5845 {"setdefaulttimeout", socket_setdefaulttimeout,
5846 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005847#ifdef HAVE_IF_NAMEINDEX
5848 {"if_nameindex", socket_if_nameindex,
5849 METH_NOARGS, if_nameindex_doc},
5850 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005851 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005852 {"if_indextoname", socket_if_indextoname,
5853 METH_O, if_indextoname_doc},
5854#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005855#ifdef CMSG_LEN
5856 {"CMSG_LEN", socket_CMSG_LEN,
5857 METH_VARARGS, CMSG_LEN_doc},
5858#ifdef CMSG_SPACE
5859 {"CMSG_SPACE", socket_CMSG_SPACE,
5860 METH_VARARGS, CMSG_SPACE_doc},
5861#endif
5862#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005863 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005864};
5865
Guido van Rossum30a685f1991-06-27 15:51:29 +00005866
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005867#ifdef MS_WINDOWS
5868#define OS_INIT_DEFINED
5869
5870/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005871
5872static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005873os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005874{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005875 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005876}
5877
5878static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005879os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005880{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 WSADATA WSAData;
5882 int ret;
5883 ret = WSAStartup(0x0101, &WSAData);
5884 switch (ret) {
5885 case 0: /* No error */
5886 Py_AtExit(os_cleanup);
5887 return 1; /* Success */
5888 case WSASYSNOTREADY:
5889 PyErr_SetString(PyExc_ImportError,
5890 "WSAStartup failed: network not ready");
5891 break;
5892 case WSAVERNOTSUPPORTED:
5893 case WSAEINVAL:
5894 PyErr_SetString(
5895 PyExc_ImportError,
5896 "WSAStartup failed: requested version not supported");
5897 break;
5898 default:
5899 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5900 break;
5901 }
5902 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005903}
5904
Guido van Rossum8d665e61996-06-26 18:22:49 +00005905#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005906
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005907
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005908
5909#ifndef OS_INIT_DEFINED
5910static int
5911os_init(void)
5912{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005913 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005914}
5915#endif
5916
5917
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005918/* C API table - always add new things to the end for binary
5919 compatibility. */
5920static
5921PySocketModule_APIObject PySocketModuleAPI =
5922{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005924 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005925 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005926};
5927
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005928
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005929/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005930
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005931 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005932 "socket.py" which implements some additional functionality.
5933 The import of "_socket" may fail with an ImportError exception if
5934 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005935 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005936 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005937*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005939PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005940"Implementation module for socket operations.\n\
5941\n\
5942See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005943
Martin v. Löwis1a214512008-06-11 05:26:20 +00005944static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 PyModuleDef_HEAD_INIT,
5946 PySocket_MODULE_NAME,
5947 socket_doc,
5948 -1,
5949 socket_methods,
5950 NULL,
5951 NULL,
5952 NULL,
5953 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005954};
5955
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005956PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005957PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005961 if (!os_init())
5962 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005963
Victor Stinnerdaf45552013-08-28 00:53:59 +02005964#ifdef MS_WINDOWS
5965 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08005966#if defined(_MSC_VER) && _MSC_VER >= 1800
5967 support_wsa_no_inherit = IsWindows7SP1OrGreater();
5968#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02005969 DWORD version = GetVersion();
5970 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5971 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5972 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08005973 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
5974#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02005975 }
5976#endif
5977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 Py_TYPE(&sock_type) = &PyType_Type;
5979 m = PyModule_Create(&socketmodule);
5980 if (m == NULL)
5981 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005982
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005983 Py_INCREF(PyExc_OSError);
5984 PySocketModuleAPI.error = PyExc_OSError;
5985 Py_INCREF(PyExc_OSError);
5986 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005988 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005989 if (socket_herror == NULL)
5990 return NULL;
5991 Py_INCREF(socket_herror);
5992 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005993 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005994 NULL);
5995 if (socket_gaierror == NULL)
5996 return NULL;
5997 Py_INCREF(socket_gaierror);
5998 PyModule_AddObject(m, "gaierror", socket_gaierror);
5999 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006000 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 if (socket_timeout == NULL)
6002 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006003 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006004 Py_INCREF(socket_timeout);
6005 PyModule_AddObject(m, "timeout", socket_timeout);
6006 Py_INCREF((PyObject *)&sock_type);
6007 if (PyModule_AddObject(m, "SocketType",
6008 (PyObject *)&sock_type) != 0)
6009 return NULL;
6010 Py_INCREF((PyObject *)&sock_type);
6011 if (PyModule_AddObject(m, "socket",
6012 (PyObject *)&sock_type) != 0)
6013 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006014
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006015#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006016 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006017#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006018 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 Py_INCREF(has_ipv6);
6021 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006022
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006023 /* Export C API */
6024 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6025 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6026 ) != 0)
6027 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006029 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006030#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006031 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006032#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006033 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006034#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006035 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006036#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006037#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006038 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006039#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006040#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006042 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006043#endif
6044#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006045 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006046#endif
6047#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006048 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006049 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006050#endif
6051#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006052 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006053 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006054#endif
6055#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006056 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006057 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006058#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006059#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006061 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006062#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006063#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006064 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006065 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006066#endif
6067#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006068 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006069 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006070#endif
6071#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006072 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006073#endif
6074#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006076 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006077#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006078#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006080 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006081#endif
6082#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006084 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006085#endif
6086#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006087 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006088 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006089#endif
6090#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006092 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006093#endif
6094#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006096 PyModule_AddIntMacro(m, AF_NETLINK);
6097 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006098#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006099 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006100#endif
6101#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006102 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006103#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006104 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6105 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006106#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006107 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006108#endif
6109#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006110 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006111#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006112#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006113 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006114#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006115#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006116 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006117#endif
6118#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006119 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006120#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006121 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006122#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006123 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006124#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006125#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006126 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006127#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006128#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006129#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006130 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006131 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006132#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006133#ifdef AF_LINK
6134 PyModule_AddIntMacro(m, AF_LINK);
6135#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006136#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006138 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006139#endif
6140#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006142 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006143#endif
6144#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006145 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006146 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006147#endif
6148#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006149 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006150 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006151#endif
6152#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006154 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006155#endif
6156#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006158 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006159#endif
6160#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006161 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006162 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006163#endif
6164#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006166 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006167#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006168
Hye-Shik Chang81268602004-02-02 06:05:24 +00006169#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006170 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6171 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6172 PyModule_AddIntMacro(m, BTPROTO_HCI);
6173 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006174#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006176#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006177#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006178#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006180#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6182 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006183#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006184 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006185 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6186 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006187#endif
6188
Charles-François Natali47413c12011-10-06 19:47:44 +02006189#ifdef AF_CAN
6190 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006192#endif
6193#ifdef PF_CAN
6194 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006196#endif
6197
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006198/* Reliable Datagram Sockets */
6199#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006200 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006201#endif
6202#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006204#endif
6205
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006206/* Kernel event messages */
6207#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006208 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006209#endif
6210#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006211 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006212#endif
6213
Antoine Pitroub156a462010-10-27 20:13:57 +00006214#ifdef AF_PACKET
6215 PyModule_AddIntMacro(m, AF_PACKET);
6216#endif
6217#ifdef PF_PACKET
6218 PyModule_AddIntMacro(m, PF_PACKET);
6219#endif
6220#ifdef PACKET_HOST
6221 PyModule_AddIntMacro(m, PACKET_HOST);
6222#endif
6223#ifdef PACKET_BROADCAST
6224 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6225#endif
6226#ifdef PACKET_MULTICAST
6227 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6228#endif
6229#ifdef PACKET_OTHERHOST
6230 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6231#endif
6232#ifdef PACKET_OUTGOING
6233 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6234#endif
6235#ifdef PACKET_LOOPBACK
6236 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6237#endif
6238#ifdef PACKET_FASTROUTE
6239 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006240#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006241
Christian Heimes043d6f62008-01-07 17:19:16 +00006242#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006243 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006246 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6247 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6248 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006249
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006250 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6251 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6252 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006254 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006255 PyModule_AddIntMacro(m, SOL_TIPC);
6256 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6257 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6258 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6259 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006260
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006261 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6262 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6263 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6264 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006266 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006267 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6268 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006269#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006270 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006271 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006272#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006273 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6274 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6275 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6276 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6277 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6278 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006279#endif
6280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006281 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, SOCK_STREAM);
6283 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006284/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, SOCK_RAW);
6286 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006287#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006289#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006290#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006292#endif
6293#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006294 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006295#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006302#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006303#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006305#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006306#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006307 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006308#endif
6309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006311 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006314 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006317 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006354#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006355#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006357#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006358#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006359 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006360#endif
6361#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006363#endif
6364#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006365 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006366#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006367#ifdef SO_BINDTODEVICE
6368 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6369#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006370#ifdef SO_PRIORITY
6371 PyModule_AddIntMacro(m, SO_PRIORITY);
6372#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006373#ifdef SO_MARK
6374 PyModule_AddIntMacro(m, SO_MARK);
6375#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006377 /* Maximum number of connections for "listen" */
6378#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006380#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006382#endif
6383
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006384 /* Ancilliary message types */
6385#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006387#endif
6388#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006390#endif
6391#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006392 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006393#endif
6394
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395 /* Flags for send, recv */
6396#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006423#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006425#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006426#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006428#endif
6429#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006430 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006431#endif
6432#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006434#endif
6435#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006437#endif
6438#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006440#endif
6441#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006443#endif
6444#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006446#endif
6447#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006449#endif
6450#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006452#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006453#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006455#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006456
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457 /* Protocol level and numbers, usable for [gs]etsockopt */
6458#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006460#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006462 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006463#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006464 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006482 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006483#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006484 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006488#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006490#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006491#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006492 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006493#endif
6494#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006495 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6496 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006497#endif
6498#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6500 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6501 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006502
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006503 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6504 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6505 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006506#endif
6507#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006508 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6509 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6510 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6511 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006512#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006513#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006514 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006515 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6516 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6517 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6518 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6519 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6520 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6521 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6522 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6523 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6524 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6525 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6526 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6527#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006528#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006530#endif
6531#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006533#endif
6534#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006536#endif
6537#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006539#endif
6540#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006542#endif
6543#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006545#endif
6546#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006551#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006559#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006560 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006569 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006576#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006578 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006579#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006580 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006587#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006589 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006590#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006649#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006650#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006652#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006653#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006655#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006656#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006657 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006658#endif
6659/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006661 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006662#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006663 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006664#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006665#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006667#endif
6668
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006669#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006670 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006671#endif
6672
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006673 /* Some port configuration */
6674#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006676#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006677 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006678#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006680 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006681#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006683#endif
6684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006685 /* Some reserved IP v.4 addresses */
6686#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006688#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006693#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006694 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006698#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006700#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006702 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006703#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006704 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006705#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006706#ifdef INADDR_ALLHOSTS_GROUP
6707 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6708 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006709#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006710 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006711#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006713 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006714#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006715 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006716#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006718 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006719#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006721#endif
6722
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006723 /* IPv4 [gs]etsockopt options */
6724#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006771#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006772#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006774#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006775
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006776 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6777#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006794#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006795 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006796#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006797 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006799 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006800#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006802#endif
6803#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006805#endif
6806#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006808#endif
6809#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006811#endif
6812#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006814#endif
6815#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006817#endif
6818#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006820#endif
6821#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006823#endif
6824#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006826#endif
6827#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006829#endif
6830#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006832#endif
6833#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006835#endif
6836#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006838#endif
6839#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006841#endif
6842#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006844#endif
6845#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006847#endif
6848#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006850#endif
6851#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006853#endif
6854#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006856#endif
6857#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006858 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006859#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006861 /* TCP options */
6862#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006894#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006895#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006897#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006898#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006899 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006900#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 /* IPX options */
6903#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006905#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006906
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006907/* Reliable Datagram Sockets */
6908#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006910#endif
6911#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006913#endif
6914#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006916#endif
6917#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006919#endif
6920#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006922#endif
6923#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006925#endif
6926#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006928#endif
6929#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006931#endif
6932#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006934#endif
6935#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006937#endif
6938#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006940#endif
6941#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006942 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006943#endif
6944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006945 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006946#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006948#endif
6949#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006951#endif
6952#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006954#endif
6955#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006957#endif
6958#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006960#endif
6961#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006963#endif
6964#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006966#endif
6967#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006969#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006970#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006972#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006973#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006975#endif
6976#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006978#endif
6979#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006981#endif
6982#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006984#endif
6985#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006987#endif
6988#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006990#endif
6991#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006992 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006993#endif
6994#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006996#endif
6997#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006998 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006999#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007000#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007002#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007003#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007005#endif
7006#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007008#endif
7009#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007011#endif
7012#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007014#endif
7015#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007017#endif
7018#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007020#endif
7021#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007023#endif
7024#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007026#endif
7027#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007029#endif
7030#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007032#endif
7033#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007035#endif
7036#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007038#endif
7039#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007040 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007041#endif
7042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007043 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007044#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007045 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007046#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007047 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007048#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007049 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007050#endif
7051#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007053#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007054 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007055#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007056 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007057#endif
7058#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007059 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007060#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007061 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007062#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007063 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007064#endif
7065
Christian Heimesfaf2f632008-01-06 16:59:19 +00007066#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007067 {
7068 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7069 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7070 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007071 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007072 PyObject *tmp;
7073 tmp = PyLong_FromUnsignedLong(codes[i]);
7074 if (tmp == NULL)
7075 return NULL;
7076 PyModule_AddObject(m, names[i], tmp);
7077 }
7078 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, RCVALL_OFF);
7080 PyModule_AddIntMacro(m, RCVALL_ON);
7081 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007082#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007084#endif
7085#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007086 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007087#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007088#endif /* _MSTCPIP_ */
7089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007090 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007091#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007092 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007093#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007094 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007095}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007096
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007097
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007098#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007099#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007100
7101/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007102/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007103
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007104int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007105inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007106{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007107 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007108#if (SIZEOF_INT != 4)
7109#error "Not sure if in_addr_t exists and int is not 32-bits."
7110#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007111 unsigned int packed_addr;
7112 packed_addr = inet_addr(src);
7113 if (packed_addr == INADDR_NONE)
7114 return 0;
7115 memcpy(dst, &packed_addr, 4);
7116 return 1;
7117 }
7118 /* Should set errno to EAFNOSUPPORT */
7119 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007120}
7121
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007122const char *
7123inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007125 if (af == AF_INET) {
7126 struct in_addr packed_addr;
7127 if (size < 16)
7128 /* Should set errno to ENOSPC. */
7129 return NULL;
7130 memcpy(&packed_addr, src, sizeof(packed_addr));
7131 return strncpy(dst, inet_ntoa(packed_addr), size);
7132 }
7133 /* Should set errno to EAFNOSUPPORT */
7134 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007135}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007136
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007137#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007138#endif