blob: 90aa3afcc17ffda1e8301c50db0f14fd93db552c [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Steve Dower65e4cb12014-11-22 12:54:57 -0800287#if defined(_MSC_VER) && _MSC_VER >= 1800
288/* Provides the IsWindows7SP1OrGreater() function */
289#include <VersionHelpers.h>
290#endif
291
Jeremy Hylton22308652001-02-02 03:23:09 +0000292#endif
293
Skip Montanaro7befb992004-02-10 16:50:21 +0000294#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000295
Neal Norwitz39d22e52002-11-02 19:55:21 +0000296#ifndef O_NONBLOCK
297# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
299
Trent Micka708d6e2004-09-07 17:48:26 +0000300/* include Python's addrinfo.h unless it causes trouble */
301#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
302 /* Do not include addinfo.h on some newer IRIX versions.
303 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
304 * for example, but not by 6.5.10.
305 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000307 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
308 * EAI_* constants are defined in (the already included) ws2tcpip.h.
309 */
310#else
311# include "addrinfo.h"
312#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000313
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000314#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000315#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000316int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000317const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000318#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000319#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000321#ifdef __APPLE__
322/* On OS X, getaddrinfo returns no error indication of lookup
323 failure, so we must use the emulation instead of the libinfo
324 implementation. Unfortunately, performing an autoconf test
325 for this bug would require DNS access for the machine performing
326 the configuration, which is not acceptable. Therefore, we
327 determine the bug just by checking for __APPLE__. If this bug
328 gets ever fixed, perhaps checking for sys/version.h would be
329 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#ifndef HAVE_GETNAMEINFO
331/* This bug seems to be fixed in Jaguar. Ths easiest way I could
332 Find to check for Jaguar is that it has getnameinfo(), which
333 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
337#ifdef HAVE_INET_ATON
338#define USE_INET_ATON_WEAKLINK
339#endif
340
Jack Jansen84262fb2002-07-02 14:40:42 +0000341#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000343/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345/* avoid clashes with the C library definition of the symbol. */
346#define getaddrinfo fake_getaddrinfo
347#define gai_strerror fake_gai_strerror
348#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349#include "getaddrinfo.c"
350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getnameinfo.c"
354#endif
355
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000356#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358#endif
359
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000360#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000361#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000362#define EAFNOSUPPORT WSAEAFNOSUPPORT
363#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000365
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#ifndef SOCKETCLOSE
367#define SOCKETCLOSE close
368#endif
369
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000370#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#define USE_BLUETOOTH 1
372#if defined(__FreeBSD__)
373#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
374#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376#define SOL_HCI SOL_HCI_RAW
377#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#define sockaddr_l2 sockaddr_l2cap
379#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
382#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000383#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385#define sockaddr_l2 sockaddr_bt
386#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#define SOL_HCI BTPROTO_HCI
390#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
400#endif
401#endif
402
Charles-François Natali8b759652011-12-23 16:44:51 +0100403/* Convert "sock_addr_t *" to "struct sockaddr *". */
404#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405
Martin v. Löwise9416172003-05-03 10:12:45 +0000406/*
407 * Constants for getnameinfo()
408 */
409#if !defined(NI_MAXHOST)
410#define NI_MAXHOST 1025
411#endif
412#if !defined(NI_MAXSERV)
413#define NI_MAXSERV 32
414#endif
415
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000416#ifndef INVALID_SOCKET /* MS defines this */
417#define INVALID_SOCKET (-1)
418#endif
419
Charles-François Natali0cc86852013-09-13 19:53:08 +0200420#ifndef INADDR_NONE
421#define INADDR_NONE (-1)
422#endif
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* XXX There's a problem here: *static* functions are not supposed to have
425 a Py prefix (or use CapitalizedWords). Later... */
426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* Global variable holding the exception type for errors detected
428 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429static PyObject *socket_herror;
430static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000431static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432
Tim Peters643a7fc2002-02-17 04:13:21 +0000433/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 The sock_type variable contains pointers to various functions,
435 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000436 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000437static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#if defined(HAVE_POLL_H)
440#include <poll.h>
441#elif defined(HAVE_SYS_POLL_H)
442#include <sys/poll.h>
443#endif
444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445/* Largest value to try to store in a socklen_t (used when handling
446 ancillary data). POSIX requires socklen_t to hold at least
447 (2**31)-1 and recommends against storing larger values, but
448 socklen_t was originally int in the BSD interface, so to be on the
449 safe side we use the smaller of (2**31)-1 and INT_MAX. */
450#if INT_MAX > 0x7fffffff
451#define SOCKLEN_T_LIMIT 0x7fffffff
452#else
453#define SOCKLEN_T_LIMIT INT_MAX
454#endif
455
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457/* Instead of select(), we'll use poll() since poll() works on any fd. */
458#define IS_SELECTABLE(s) 1
459/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000460#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461/* If there's no timeout left, we don't have to call select, so it's a safe,
462 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000465
466static PyObject*
467select_error(void)
468{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471}
472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000473#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000474#ifndef WSAEAGAIN
475#define WSAEAGAIN WSAEWOULDBLOCK
476#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#define CHECK_ERRNO(expected) \
478 (WSAGetLastError() == WSA ## expected)
479#else
480#define CHECK_ERRNO(expected) \
481 (errno == expected)
482#endif
483
Victor Stinnerdaf45552013-08-28 00:53:59 +0200484#ifdef MS_WINDOWS
Victor Stinner81c41db2015-04-02 11:50:57 +0200485# define GET_SOCK_ERROR WSAGetLastError()
486# define SET_SOCK_ERROR(err) WSASetLastError(err)
487# define SOCK_TIMEOUT_ERR WSAEWOULDBLOCK
488# define SOCK_INPROGRESS_ERR WSAEWOULDBLOCK
489#else
490# define GET_SOCK_ERROR errno
491# define SET_SOCK_ERROR(err) do { errno = err; } while (0)
492# define SOCK_TIMEOUT_ERR EWOULDBLOCK
493# define SOCK_INPROGRESS_ERR EINPROGRESS
494#endif
495
496
497#ifdef MS_WINDOWS
Victor Stinnerdaf45552013-08-28 00:53:59 +0200498/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
499static int support_wsa_no_inherit = -1;
500#endif
501
Guido van Rossum30a685f1991-06-27 15:51:29 +0000502/* Convenience function to raise an error according to errno
503 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504
Guido van Rossum73624e91994-10-10 17:59:00 +0000505static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000506set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000507{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000508#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 int err_no = WSAGetLastError();
510 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
511 recognizes the error codes used by both GetLastError() and
512 WSAGetLastError */
513 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200514 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000515#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000516
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200517 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000518}
519
Guido van Rossum30a685f1991-06-27 15:51:29 +0000520
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000522set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000525
526#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 if (v != NULL) {
532 PyErr_SetObject(socket_herror, v);
533 Py_DECREF(v);
534 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537}
538
539
540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000541set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000544
Martin v. Löwis272cb402002-03-01 08:31:07 +0000545#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* EAI_SYSTEM is not available on Windows XP. */
547 if (error == EAI_SYSTEM)
548 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000549#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000550
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000551#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000553#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000555#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 if (v != NULL) {
557 PyErr_SetObject(socket_gaierror, v);
558 Py_DECREF(v);
559 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000562}
563
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000564/* Function to perform the setting of socket blocking mode
565 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000566static int
567internal_setblocking(PySocketSockObject *s, int block)
568{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200569#ifdef MS_WINDOWS
570 u_long arg;
571#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100572#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100573 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100574 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000575#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000576#ifdef SOCK_NONBLOCK
577 if (block)
578 s->sock_type &= (~SOCK_NONBLOCK);
579 else
580 s->sock_type |= SOCK_NONBLOCK;
581#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100585#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 block = !block;
587 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100588#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
590 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100591 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 else
Victor Stinner9a954832013-12-04 00:41:24 +0100593 new_delay_flag = delay_flag | O_NONBLOCK;
594 if (new_delay_flag != delay_flag)
595 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
596#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200598 arg = !block;
599 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000600#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 /* Since these don't return anything */
604 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000605}
606
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000607static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200608internal_select(PySocketSockObject *s, int writing, _PyTime_t interval,
609 int connect)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100612#ifdef HAVE_POLL
613 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200614 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100615#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200616 fd_set fds, efds;
Victor Stinnerced11742015-04-09 10:27:25 +0200617 struct timeval tv, *tvp;
Victor Stinner71694d52015-03-28 01:18:54 +0100618#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000619
Victor Stinnerb7df3142015-03-27 22:59:32 +0100620#ifdef WITH_THREAD
621 /* must be called with the GIL held */
622 assert(PyGILState_Check());
623#endif
624
Victor Stinner416f2e62015-03-31 13:56:29 +0200625 /* Error condition is for output only */
Victor Stinner81c41db2015-04-02 11:50:57 +0200626 assert(!(connect && !writing));
Guido van Rossum67f7a382002-06-06 21:08:16 +0000627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 /* Guard against closed socket */
629 if (s->sock_fd < 0)
630 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 /* Prefer poll, if available, since you can poll() any fd
633 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000634#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100635 pollfd.fd = s->sock_fd;
636 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner81c41db2015-04-02 11:50:57 +0200637 if (connect) {
638 /* On Windows, the socket becomes writable on connection success,
639 but a connection failure is notified as an error. On POSIX, the
640 socket becomes writable on connection success or on connection
641 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200642 pollfd.events |= POLLERR;
Victor Stinner81c41db2015-04-02 11:50:57 +0200643 }
Guido van Rossum67f7a382002-06-06 21:08:16 +0000644
Victor Stinner71694d52015-03-28 01:18:54 +0100645 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinner10550cd2015-04-03 13:22:27 +0200646 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
Victor Stinnere6951c62015-03-31 13:50:44 +0200647 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000648
Victor Stinner71694d52015-03-28 01:18:54 +0100649 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200650 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100651 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000652#else
Victor Stinnerced11742015-04-09 10:27:25 +0200653 if (interval >= 0) {
654 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
655 tvp = &tv;
656 }
657 else
658 tvp = NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000659
Victor Stinner71694d52015-03-28 01:18:54 +0100660 FD_ZERO(&fds);
661 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200662 FD_ZERO(&efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200663 if (connect) {
664 /* On Windows, the socket becomes writable on connection success,
665 but a connection failure is notified as an error. On POSIX, the
666 socket becomes writable on connection success or on connection
667 failure. */
Victor Stinner416f2e62015-03-31 13:56:29 +0200668 FD_SET(s->sock_fd, &efds);
Victor Stinner81c41db2015-04-02 11:50:57 +0200669 }
Victor Stinner71694d52015-03-28 01:18:54 +0100670
671 /* See if the socket is ready */
672 Py_BEGIN_ALLOW_THREADS;
673 if (writing)
674 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200675 NULL, &fds, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100676 else
677 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinnerced11742015-04-09 10:27:25 +0200678 &fds, NULL, &efds, tvp);
Victor Stinner71694d52015-03-28 01:18:54 +0100679 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000680#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 if (n < 0)
683 return -1;
684 if (n == 0)
685 return 1;
686 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000687}
688
Victor Stinner31bf2d52015-04-01 21:57:09 +0200689/* Call a socket function.
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000690
Victor Stinner81c41db2015-04-02 11:50:57 +0200691 On error, raise an exception and return -1 if err is set, or fill err and
692 return -1 otherwise. If a signal was received and the signal handler raised
693 an exception, return -1, and set err to -1 if err is set.
694
695 On success, return 0, and set err to 0 if err is set.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100696
Victor Stinner31bf2d52015-04-01 21:57:09 +0200697 If the socket has a timeout, wait until the socket is ready before calling
698 the function: wait until the socket is writable if writing is nonzero, wait
699 until the socket received data otherwise.
Victor Stinnerb7df3142015-03-27 22:59:32 +0100700
Victor Stinner81c41db2015-04-02 11:50:57 +0200701 If the socket function is interrupted by a signal (failed with EINTR): retry
Victor Stinner31bf2d52015-04-01 21:57:09 +0200702 the function, except if the signal handler raised an exception (PEP 475).
703
704 When the function is retried, recompute the timeout using a monotonic clock.
705
Victor Stinner81c41db2015-04-02 11:50:57 +0200706 sock_call_ex() must be called with the GIL held. The socket function is
707 called with the GIL released. */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200708static int
Victor Stinner81c41db2015-04-02 11:50:57 +0200709sock_call_ex(PySocketSockObject *s,
710 int writing,
711 int (*sock_func) (PySocketSockObject *s, void *data),
712 void *data,
713 int connect,
Victor Stinner8912d142015-04-06 23:16:34 +0200714 int *err,
715 _PyTime_t timeout)
Victor Stinner31bf2d52015-04-01 21:57:09 +0200716{
Victor Stinner8912d142015-04-06 23:16:34 +0200717 int has_timeout = (timeout > 0);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200718 _PyTime_t deadline = 0;
719 int deadline_initialized = 0;
720 int res;
721
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200722#ifdef WITH_THREAD
Victor Stinner31bf2d52015-04-01 21:57:09 +0200723 /* sock_call() must be called with the GIL held. */
724 assert(PyGILState_Check());
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200725#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +0200726
727 /* outer loop to retry select() when select() is interrupted by a signal
Victor Stinner81c41db2015-04-02 11:50:57 +0200728 or to retry select()+sock_func() on false positive (see above) */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200729 while (1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200730 /* For connect(), poll even for blocking socket. The connection
731 runs asynchronously. */
732 if (has_timeout || connect) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200733 if (has_timeout) {
Victor Stinner10550cd2015-04-03 13:22:27 +0200734 _PyTime_t interval;
735
Victor Stinner81c41db2015-04-02 11:50:57 +0200736 if (deadline_initialized) {
737 /* recompute the timeout */
738 interval = deadline - _PyTime_GetMonotonicClock();
739 }
740 else {
741 deadline_initialized = 1;
Victor Stinner8912d142015-04-06 23:16:34 +0200742 deadline = _PyTime_GetMonotonicClock() + timeout;
743 interval = timeout;
Victor Stinner81c41db2015-04-02 11:50:57 +0200744 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200745
Victor Stinner10550cd2015-04-03 13:22:27 +0200746 if (interval >= 0)
747 res = internal_select(s, writing, interval, connect);
748 else
749 res = 1;
750 }
751 else {
Victor Stinner222dfc72015-04-06 22:30:41 +0200752 res = internal_select(s, writing, timeout, connect);
Victor Stinner10550cd2015-04-03 13:22:27 +0200753 }
754
Victor Stinner31bf2d52015-04-01 21:57:09 +0200755 if (res == -1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200756 if (err)
757 *err = GET_SOCK_ERROR;
758
Victor Stinner31bf2d52015-04-01 21:57:09 +0200759 if (CHECK_ERRNO(EINTR)) {
760 /* select() was interrupted by a signal */
Victor Stinner81c41db2015-04-02 11:50:57 +0200761 if (PyErr_CheckSignals()) {
762 if (err)
763 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200764 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200765 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200766
767 /* retry select() */
768 continue;
769 }
770
771 /* select() failed */
772 s->errorhandler();
773 return -1;
774 }
775
776 if (res == 1) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200777 if (err)
778 *err = SOCK_TIMEOUT_ERR;
779 else
780 PyErr_SetString(socket_timeout, "timed out");
Victor Stinner31bf2d52015-04-01 21:57:09 +0200781 return -1;
782 }
783
784 /* the socket is ready */
785 }
786
Victor Stinner81c41db2015-04-02 11:50:57 +0200787 /* inner loop to retry sock_func() when sock_func() is interrupted
788 by a signal */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200789 while (1) {
790 Py_BEGIN_ALLOW_THREADS
Victor Stinner81c41db2015-04-02 11:50:57 +0200791 res = sock_func(s, data);
Victor Stinner31bf2d52015-04-01 21:57:09 +0200792 Py_END_ALLOW_THREADS
793
794 if (res) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200795 /* sock_func() succeeded */
796 if (err)
797 *err = 0;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200798 return 0;
799 }
800
Victor Stinner81c41db2015-04-02 11:50:57 +0200801 if (err)
802 *err = GET_SOCK_ERROR;
803
Victor Stinner31bf2d52015-04-01 21:57:09 +0200804 if (!CHECK_ERRNO(EINTR))
805 break;
806
Victor Stinner81c41db2015-04-02 11:50:57 +0200807 /* sock_func() was interrupted by a signal */
808 if (PyErr_CheckSignals()) {
809 if (err)
810 *err = -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +0200811 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +0200812 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200813
Victor Stinner81c41db2015-04-02 11:50:57 +0200814 /* retry sock_func() */
Victor Stinner31bf2d52015-04-01 21:57:09 +0200815 }
816
817 if (s->sock_timeout > 0
818 && (CHECK_ERRNO(EWOULDBLOCK) || CHECK_ERRNO(EAGAIN))) {
Victor Stinner81c41db2015-04-02 11:50:57 +0200819 /* False positive: sock_func() failed with EWOULDBLOCK or EAGAIN.
Victor Stinner31bf2d52015-04-01 21:57:09 +0200820
821 For example, select() could indicate a socket is ready for
822 reading, but the data then discarded by the OS because of a
823 wrong checksum.
824
825 Loop on select() to recheck for socket readyness. */
826 continue;
827 }
828
Victor Stinner81c41db2015-04-02 11:50:57 +0200829 /* sock_func() failed */
830 if (!err)
831 s->errorhandler();
832 /* else: err was already set before */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000833 return -1;
834 }
Victor Stinner31bf2d52015-04-01 21:57:09 +0200835}
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000836
Victor Stinner81c41db2015-04-02 11:50:57 +0200837static int
838sock_call(PySocketSockObject *s,
839 int writing,
840 int (*func) (PySocketSockObject *s, void *data),
841 void *data)
842{
Victor Stinner8912d142015-04-06 23:16:34 +0200843 return sock_call_ex(s, writing, func, data, 0, NULL, s->sock_timeout);
Victor Stinner81c41db2015-04-02 11:50:57 +0200844}
845
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000846
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000847/* Initialize a new socket object. */
848
Victor Stinner88ed6402015-04-09 10:23:12 +0200849/* Default timeout for new sockets */
850static _PyTime_t defaulttimeout = _PYTIME_FROMSECONDS(-1);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000851
Martin v. Löwis1a214512008-06-11 05:26:20 +0000852static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000853init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000855{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 s->sock_fd = fd;
857 s->sock_family = family;
858 s->sock_type = type;
859 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000861 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000862#ifdef SOCK_NONBLOCK
863 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100864 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000865 else
866#endif
867 {
868 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100869 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000870 internal_setblocking(s, 0);
871 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000872
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000873}
874
875
Guido van Rossum30a685f1991-06-27 15:51:29 +0000876/* Create a new socket object.
877 This just creates the object and initializes it.
878 If the creation fails, return NULL and set an exception (implicit
879 in NEWOBJ()). */
880
Guido van Rossum73624e91994-10-10 17:59:00 +0000881static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000882new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 PySocketSockObject *s;
885 s = (PySocketSockObject *)
886 PyType_GenericNew(&sock_type, NULL, NULL);
887 if (s != NULL)
888 init_sockobject(s, fd, family, type, proto);
889 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000890}
891
Guido van Rossum30a685f1991-06-27 15:51:29 +0000892
Guido van Rossum48a680c2001-03-02 06:34:14 +0000893/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000894 thread to be in gethostbyname or getaddrinfo */
895#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200896static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000897#endif
898
899
Guido van Rossum30a685f1991-06-27 15:51:29 +0000900/* Convert a string specifying a host name or one of a few symbolic
901 names to a numeric IP address. This usually calls gethostbyname()
902 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000903 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000904 an error occurred; then an exception is raised. */
905
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000906static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000907setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000908{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 struct addrinfo hints, *res;
910 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000912 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
913 if (name[0] == '\0') {
914 int siz;
915 memset(&hints, 0, sizeof(hints));
916 hints.ai_family = af;
917 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
918 hints.ai_flags = AI_PASSIVE;
919 Py_BEGIN_ALLOW_THREADS
920 ACQUIRE_GETADDRINFO_LOCK
921 error = getaddrinfo(NULL, "0", &hints, &res);
922 Py_END_ALLOW_THREADS
923 /* We assume that those thread-unsafe getaddrinfo() versions
924 *are* safe regarding their return value, ie. that a
925 subsequent call to getaddrinfo() does not destroy the
926 outcome of the first call. */
927 RELEASE_GETADDRINFO_LOCK
928 if (error) {
929 set_gaierror(error);
930 return -1;
931 }
932 switch (res->ai_family) {
933 case AF_INET:
934 siz = 4;
935 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000936#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 case AF_INET6:
938 siz = 16;
939 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000941 default:
942 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200943 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 "unsupported address family");
945 return -1;
946 }
947 if (res->ai_next) {
948 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200949 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 "wildcard resolved to multiple address");
951 return -1;
952 }
953 if (res->ai_addrlen < addr_ret_size)
954 addr_ret_size = res->ai_addrlen;
955 memcpy(addr_ret, res->ai_addr, addr_ret_size);
956 freeaddrinfo(res);
957 return siz;
958 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200959 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100960 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200961 if (strcmp(name, "255.255.255.255") == 0 ||
962 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000963 struct sockaddr_in *sin;
964 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200965 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 "address family mismatched");
967 return -1;
968 }
969 sin = (struct sockaddr_in *)addr_ret;
970 memset((void *) sin, '\0', sizeof(*sin));
971 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000972#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000975 sin->sin_addr.s_addr = INADDR_BROADCAST;
976 return sizeof(sin->sin_addr);
977 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200978
979 /* avoid a name resolution in case of numeric address */
980#ifdef HAVE_INET_PTON
981 /* check for an IPv4 address */
982 if (af == AF_UNSPEC || af == AF_INET) {
983 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
984 memset(sin, 0, sizeof(*sin));
985 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
986 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000987#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200988 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000989#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200990 return 4;
991 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200993#ifdef ENABLE_IPV6
994 /* check for an IPv6 address - if the address contains a scope ID, we
995 * fallback to getaddrinfo(), which can handle translation from interface
996 * name to interface index */
997 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
998 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
999 memset(sin, 0, sizeof(*sin));
1000 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
1001 sin->sin6_family = AF_INET6;
1002#ifdef HAVE_SOCKADDR_SA_LEN
1003 sin->sin6_len = sizeof(*sin);
1004#endif
1005 return 16;
1006 }
1007 }
1008#endif /* ENABLE_IPV6 */
1009#else /* HAVE_INET_PTON */
1010 /* check for an IPv4 address */
1011 if (af == AF_INET || af == AF_UNSPEC) {
1012 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
1013 memset(sin, 0, sizeof(*sin));
1014 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
1015 sin->sin_family = AF_INET;
1016#ifdef HAVE_SOCKADDR_SA_LEN
1017 sin->sin_len = sizeof(*sin);
1018#endif
1019 return 4;
1020 }
Victor Stinnere990c6e2013-11-16 00:18:58 +01001021 }
Charles-François Natali0cc86852013-09-13 19:53:08 +02001022#endif /* HAVE_INET_PTON */
1023
1024 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 memset(&hints, 0, sizeof(hints));
1026 hints.ai_family = af;
1027 Py_BEGIN_ALLOW_THREADS
1028 ACQUIRE_GETADDRINFO_LOCK
1029 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001030#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 if (error == EAI_NONAME && af == AF_UNSPEC) {
1032 /* On Tru64 V5.1, numeric-to-addr conversion fails
1033 if no address family is given. Assume IPv4 for now.*/
1034 hints.ai_family = AF_INET;
1035 error = getaddrinfo(name, NULL, &hints, &res);
1036 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +00001037#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001038 Py_END_ALLOW_THREADS
1039 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
1040 if (error) {
1041 set_gaierror(error);
1042 return -1;
1043 }
1044 if (res->ai_addrlen < addr_ret_size)
1045 addr_ret_size = res->ai_addrlen;
1046 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
1047 freeaddrinfo(res);
1048 switch (addr_ret->sa_family) {
1049 case AF_INET:
1050 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001051#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001052 case AF_INET6:
1053 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +00001054#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001056 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001057 return -1;
1058 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001059}
1060
Guido van Rossum30a685f1991-06-27 15:51:29 +00001061
Guido van Rossum30a685f1991-06-27 15:51:29 +00001062/* Create a string object representing an IP address.
1063 This is always a string of the form 'dd.dd.dd.dd' (with variable
1064 size numbers). */
1065
Guido van Rossum73624e91994-10-10 17:59:00 +00001066static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001067makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +00001068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001069 char buf[NI_MAXHOST];
1070 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
1073 NI_NUMERICHOST);
1074 if (error) {
1075 set_gaierror(error);
1076 return NULL;
1077 }
1078 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079}
1080
1081
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001082#ifdef USE_BLUETOOTH
1083/* Convert a string representation of a Bluetooth address into a numeric
1084 address. Returns the length (6), or raises an exception and returns -1 if
1085 an error occurred. */
1086
1087static int
1088setbdaddr(char *name, bdaddr_t *bdaddr)
1089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001090 unsigned int b0, b1, b2, b3, b4, b5;
1091 char ch;
1092 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001094 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
1095 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
1096 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
1097 bdaddr->b[0] = b0;
1098 bdaddr->b[1] = b1;
1099 bdaddr->b[2] = b2;
1100 bdaddr->b[3] = b3;
1101 bdaddr->b[4] = b4;
1102 bdaddr->b[5] = b5;
1103 return 6;
1104 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001105 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 return -1;
1107 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001108}
1109
1110/* Create a string representation of the Bluetooth address. This is always a
1111 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
1112 value (zero padded if necessary). */
1113
1114static PyObject *
1115makebdaddr(bdaddr_t *bdaddr)
1116{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001117 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001119 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1120 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
1121 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1122 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001123}
1124#endif
1125
1126
Guido van Rossum30a685f1991-06-27 15:51:29 +00001127/* Create an object representing the given socket address,
1128 suitable for passing it back to bind(), connect() etc.
1129 The family field of the sockaddr structure is inspected
1130 to determine what kind of address it really is. */
1131
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001132/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001133static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001134makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001135{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 if (addrlen == 0) {
1137 /* No address -- may be recvfrom() from known socket */
1138 Py_INCREF(Py_None);
1139 return Py_None;
1140 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001142 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001144 case AF_INET:
1145 {
1146 struct sockaddr_in *a;
1147 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1148 PyObject *ret = NULL;
1149 if (addrobj) {
1150 a = (struct sockaddr_in *)addr;
1151 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1152 Py_DECREF(addrobj);
1153 }
1154 return ret;
1155 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001156
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001157#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 case AF_UNIX:
1159 {
1160 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001161#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1163 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001164 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001165 }
1166 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001167#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001168 {
1169 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001170 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001171 }
1172 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001173#endif /* AF_UNIX */
1174
Martin v. Löwis11017b12006-01-14 18:12:57 +00001175#if defined(AF_NETLINK)
1176 case AF_NETLINK:
1177 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001178 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1179 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001180 }
1181#endif /* AF_NETLINK */
1182
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001183#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001184 case AF_INET6:
1185 {
1186 struct sockaddr_in6 *a;
1187 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1188 PyObject *ret = NULL;
1189 if (addrobj) {
1190 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001191 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001192 addrobj,
1193 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001194 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001195 a->sin6_scope_id);
1196 Py_DECREF(addrobj);
1197 }
1198 return ret;
1199 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001200#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001201
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001202#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001203 case AF_BLUETOOTH:
1204 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 case BTPROTO_L2CAP:
1207 {
1208 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1209 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1210 PyObject *ret = NULL;
1211 if (addrobj) {
1212 ret = Py_BuildValue("Oi",
1213 addrobj,
1214 _BT_L2_MEMB(a, psm));
1215 Py_DECREF(addrobj);
1216 }
1217 return ret;
1218 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001219
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001220 case BTPROTO_RFCOMM:
1221 {
1222 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1223 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1224 PyObject *ret = NULL;
1225 if (addrobj) {
1226 ret = Py_BuildValue("Oi",
1227 addrobj,
1228 _BT_RC_MEMB(a, channel));
1229 Py_DECREF(addrobj);
1230 }
1231 return ret;
1232 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001233
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001234 case BTPROTO_HCI:
1235 {
1236 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001237#if defined(__NetBSD__) || defined(__DragonFly__)
1238 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1239#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 PyObject *ret = NULL;
1241 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1242 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001243#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001244 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001245
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001246#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001247 case BTPROTO_SCO:
1248 {
1249 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1250 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1251 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001252#endif
1253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 default:
1255 PyErr_SetString(PyExc_ValueError,
1256 "Unknown Bluetooth protocol");
1257 return NULL;
1258 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001259#endif
1260
Antoine Pitroub156a462010-10-27 20:13:57 +00001261#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001262 case AF_PACKET:
1263 {
1264 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1265 char *ifname = "";
1266 struct ifreq ifr;
1267 /* need to look up interface name give index */
1268 if (a->sll_ifindex) {
1269 ifr.ifr_ifindex = a->sll_ifindex;
1270 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1271 ifname = ifr.ifr_name;
1272 }
1273 return Py_BuildValue("shbhy#",
1274 ifname,
1275 ntohs(a->sll_protocol),
1276 a->sll_pkttype,
1277 a->sll_hatype,
1278 a->sll_addr,
1279 a->sll_halen);
1280 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001281#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001282
Christian Heimes043d6f62008-01-07 17:19:16 +00001283#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001284 case AF_TIPC:
1285 {
1286 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1287 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1288 return Py_BuildValue("IIIII",
1289 a->addrtype,
1290 a->addr.nameseq.type,
1291 a->addr.nameseq.lower,
1292 a->addr.nameseq.upper,
1293 a->scope);
1294 } else if (a->addrtype == TIPC_ADDR_NAME) {
1295 return Py_BuildValue("IIIII",
1296 a->addrtype,
1297 a->addr.name.name.type,
1298 a->addr.name.name.instance,
1299 a->addr.name.name.instance,
1300 a->scope);
1301 } else if (a->addrtype == TIPC_ADDR_ID) {
1302 return Py_BuildValue("IIIII",
1303 a->addrtype,
1304 a->addr.id.node,
1305 a->addr.id.ref,
1306 0,
1307 a->scope);
1308 } else {
1309 PyErr_SetString(PyExc_ValueError,
1310 "Invalid address type");
1311 return NULL;
1312 }
1313 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001314#endif
1315
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001316#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001317 case AF_CAN:
1318 {
1319 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1320 char *ifname = "";
1321 struct ifreq ifr;
1322 /* need to look up interface name given index */
1323 if (a->can_ifindex) {
1324 ifr.ifr_ifindex = a->can_ifindex;
1325 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1326 ifname = ifr.ifr_name;
1327 }
1328
1329 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1330 ifname,
1331 a->can_family);
1332 }
1333#endif
1334
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001335#ifdef PF_SYSTEM
1336 case PF_SYSTEM:
1337 switch(proto) {
1338#ifdef SYSPROTO_CONTROL
1339 case SYSPROTO_CONTROL:
1340 {
1341 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1342 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1343 }
1344#endif
1345 default:
1346 PyErr_SetString(PyExc_ValueError,
1347 "Invalid address type");
1348 return 0;
1349 }
1350#endif
1351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001352 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001353
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001354 default:
1355 /* If we don't know the address family, don't raise an
1356 exception -- return it as an (int, bytes) tuple. */
1357 return Py_BuildValue("iy#",
1358 addr->sa_family,
1359 addr->sa_data,
1360 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001362 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001363}
1364
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001365/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1366 (in particular, numeric IP addresses). */
1367struct maybe_idna {
1368 PyObject *obj;
1369 char *buf;
1370};
1371
1372static void
1373idna_cleanup(struct maybe_idna *data)
1374{
1375 Py_CLEAR(data->obj);
1376}
1377
1378static int
1379idna_converter(PyObject *obj, struct maybe_idna *data)
1380{
1381 size_t len;
1382 PyObject *obj2, *obj3;
1383 if (obj == NULL) {
1384 idna_cleanup(data);
1385 return 1;
1386 }
1387 data->obj = NULL;
1388 len = -1;
1389 if (PyBytes_Check(obj)) {
1390 data->buf = PyBytes_AsString(obj);
1391 len = PyBytes_Size(obj);
1392 }
1393 else if (PyByteArray_Check(obj)) {
1394 data->buf = PyByteArray_AsString(obj);
1395 len = PyByteArray_Size(obj);
1396 }
1397 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1398 data->buf = PyUnicode_DATA(obj);
1399 len = PyUnicode_GET_LENGTH(obj);
1400 }
1401 else {
1402 obj2 = PyUnicode_FromObject(obj);
1403 if (!obj2) {
1404 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1405 obj->ob_type->tp_name);
1406 return 0;
1407 }
1408 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1409 Py_DECREF(obj2);
1410 if (!obj3) {
1411 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1412 return 0;
1413 }
1414 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001415 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001416 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1417 return 0;
1418 }
1419 data->obj = obj3;
1420 data->buf = PyBytes_AS_STRING(obj3);
1421 len = PyBytes_GET_SIZE(obj3);
1422 }
1423 if (strlen(data->buf) != len) {
1424 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001425 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001426 return 0;
1427 }
1428 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001429}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001430
1431/* Parse a socket address argument according to the socket object's
1432 address family. Return 1 if the address was in the proper format,
1433 0 of not. The address is returned through addr_ret, its length
1434 through len_ret. */
1435
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001436static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001437getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001438 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001441
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001442#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 case AF_UNIX:
1444 {
1445 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001446 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001447 int retval = 0;
1448
1449 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1450 allow embedded nulls on Linux. */
1451 if (PyUnicode_Check(args)) {
1452 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1453 return 0;
1454 }
1455 else
1456 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001457 if (!PyArg_Parse(args, "y*", &path)) {
1458 Py_DECREF(args);
1459 return retval;
1460 }
1461 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001463 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001464#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001465 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001467 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001468 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001469 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001470 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001471 }
1472 }
1473 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001474#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 {
1476 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001477 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001478 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001480 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001482 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001483 }
1484 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001485 memcpy(addr->sun_path, path.buf, path.len);
1486 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001487 retval = 1;
1488 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001489 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001490 Py_DECREF(args);
1491 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001492 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001493#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001494
Martin v. Löwis11017b12006-01-14 18:12:57 +00001495#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001496 case AF_NETLINK:
1497 {
1498 struct sockaddr_nl* addr;
1499 int pid, groups;
1500 addr = (struct sockaddr_nl *)addr_ret;
1501 if (!PyTuple_Check(args)) {
1502 PyErr_Format(
1503 PyExc_TypeError,
1504 "getsockaddrarg: "
1505 "AF_NETLINK address must be tuple, not %.500s",
1506 Py_TYPE(args)->tp_name);
1507 return 0;
1508 }
1509 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1510 return 0;
1511 addr->nl_family = AF_NETLINK;
1512 addr->nl_pid = pid;
1513 addr->nl_groups = groups;
1514 *len_ret = sizeof(*addr);
1515 return 1;
1516 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001517#endif
1518
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001519#ifdef AF_RDS
1520 case AF_RDS:
1521 /* RDS sockets use sockaddr_in: fall-through */
1522#endif
1523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 case AF_INET:
1525 {
1526 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001527 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001528 int port, result;
1529 if (!PyTuple_Check(args)) {
1530 PyErr_Format(
1531 PyExc_TypeError,
1532 "getsockaddrarg: "
1533 "AF_INET address must be tuple, not %.500s",
1534 Py_TYPE(args)->tp_name);
1535 return 0;
1536 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001537 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1538 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001539 return 0;
1540 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001541 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001543 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 if (result < 0)
1545 return 0;
1546 if (port < 0 || port > 0xffff) {
1547 PyErr_SetString(
1548 PyExc_OverflowError,
1549 "getsockaddrarg: port must be 0-65535.");
1550 return 0;
1551 }
1552 addr->sin_family = AF_INET;
1553 addr->sin_port = htons((short)port);
1554 *len_ret = sizeof *addr;
1555 return 1;
1556 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001557
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001558#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001559 case AF_INET6:
1560 {
1561 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001562 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001563 int port, result;
1564 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001565 flowinfo = scope_id = 0;
1566 if (!PyTuple_Check(args)) {
1567 PyErr_Format(
1568 PyExc_TypeError,
1569 "getsockaddrarg: "
1570 "AF_INET6 address must be tuple, not %.500s",
1571 Py_TYPE(args)->tp_name);
1572 return 0;
1573 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001574 if (!PyArg_ParseTuple(args, "O&i|II",
1575 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001576 &scope_id)) {
1577 return 0;
1578 }
1579 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001580 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001582 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001583 if (result < 0)
1584 return 0;
1585 if (port < 0 || port > 0xffff) {
1586 PyErr_SetString(
1587 PyExc_OverflowError,
1588 "getsockaddrarg: port must be 0-65535.");
1589 return 0;
1590 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001591 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001592 PyErr_SetString(
1593 PyExc_OverflowError,
1594 "getsockaddrarg: flowinfo must be 0-1048575.");
1595 return 0;
1596 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001597 addr->sin6_family = s->sock_family;
1598 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001599 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 addr->sin6_scope_id = scope_id;
1601 *len_ret = sizeof *addr;
1602 return 1;
1603 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001604#endif
1605
Hye-Shik Chang81268602004-02-02 06:05:24 +00001606#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001607 case AF_BLUETOOTH:
1608 {
1609 switch (s->sock_proto) {
1610 case BTPROTO_L2CAP:
1611 {
1612 struct sockaddr_l2 *addr;
1613 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 addr = (struct sockaddr_l2 *)addr_ret;
1616 memset(addr, 0, sizeof(struct sockaddr_l2));
1617 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1618 if (!PyArg_ParseTuple(args, "si", &straddr,
1619 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001620 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 "wrong format");
1622 return 0;
1623 }
1624 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1625 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001627 *len_ret = sizeof *addr;
1628 return 1;
1629 }
1630 case BTPROTO_RFCOMM:
1631 {
1632 struct sockaddr_rc *addr;
1633 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 addr = (struct sockaddr_rc *)addr_ret;
1636 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1637 if (!PyArg_ParseTuple(args, "si", &straddr,
1638 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001639 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 "wrong format");
1641 return 0;
1642 }
1643 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1644 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001646 *len_ret = sizeof *addr;
1647 return 1;
1648 }
1649 case BTPROTO_HCI:
1650 {
1651 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001652#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001653 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001654
Alexander Belopolskye239d232010-12-08 23:31:48 +00001655 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001656 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001657 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001658 "wrong format");
1659 return 0;
1660 }
1661 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1662 return 0;
1663#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001664 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1665 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001666 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001667 "wrong format");
1668 return 0;
1669 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001670#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001671 *len_ret = sizeof *addr;
1672 return 1;
1673 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001674#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001675 case BTPROTO_SCO:
1676 {
1677 struct sockaddr_sco *addr;
1678 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001679
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001680 addr = (struct sockaddr_sco *)addr_ret;
1681 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1682 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001683 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001684 "wrong format");
1685 return 0;
1686 }
1687 straddr = PyBytes_AS_STRING(args);
1688 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1689 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001691 *len_ret = sizeof *addr;
1692 return 1;
1693 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001694#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001695 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001696 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001697 return 0;
1698 }
1699 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001700#endif
1701
Antoine Pitroub156a462010-10-27 20:13:57 +00001702#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 case AF_PACKET:
1704 {
1705 struct sockaddr_ll* addr;
1706 struct ifreq ifr;
1707 char *interfaceName;
1708 int protoNumber;
1709 int hatype = 0;
1710 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001711 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001713 if (!PyTuple_Check(args)) {
1714 PyErr_Format(
1715 PyExc_TypeError,
1716 "getsockaddrarg: "
1717 "AF_PACKET address must be tuple, not %.500s",
1718 Py_TYPE(args)->tp_name);
1719 return 0;
1720 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001721 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001722 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001723 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 return 0;
1725 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1726 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1727 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1728 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001729 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 return 0;
1731 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001732 if (haddr.buf && haddr.len > 8) {
1733 PyErr_SetString(PyExc_ValueError,
1734 "Hardware address must be 8 bytes or less");
1735 PyBuffer_Release(&haddr);
1736 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001737 }
1738 if (protoNumber < 0 || protoNumber > 0xffff) {
1739 PyErr_SetString(
1740 PyExc_OverflowError,
1741 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001742 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001743 return 0;
1744 }
1745 addr = (struct sockaddr_ll*)addr_ret;
1746 addr->sll_family = AF_PACKET;
1747 addr->sll_protocol = htons((short)protoNumber);
1748 addr->sll_ifindex = ifr.ifr_ifindex;
1749 addr->sll_pkttype = pkttype;
1750 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001751 if (haddr.buf) {
1752 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1753 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001754 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001755 else
1756 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001757 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001758 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001759 return 1;
1760 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001761#endif
1762
Christian Heimes043d6f62008-01-07 17:19:16 +00001763#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 case AF_TIPC:
1765 {
1766 unsigned int atype, v1, v2, v3;
1767 unsigned int scope = TIPC_CLUSTER_SCOPE;
1768 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 if (!PyTuple_Check(args)) {
1771 PyErr_Format(
1772 PyExc_TypeError,
1773 "getsockaddrarg: "
1774 "AF_TIPC address must be tuple, not %.500s",
1775 Py_TYPE(args)->tp_name);
1776 return 0;
1777 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 if (!PyArg_ParseTuple(args,
1780 "IIII|I;Invalid TIPC address format",
1781 &atype, &v1, &v2, &v3, &scope))
1782 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001783
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 addr = (struct sockaddr_tipc *) addr_ret;
1785 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001787 addr->family = AF_TIPC;
1788 addr->scope = scope;
1789 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001791 if (atype == TIPC_ADDR_NAMESEQ) {
1792 addr->addr.nameseq.type = v1;
1793 addr->addr.nameseq.lower = v2;
1794 addr->addr.nameseq.upper = v3;
1795 } else if (atype == TIPC_ADDR_NAME) {
1796 addr->addr.name.name.type = v1;
1797 addr->addr.name.name.instance = v2;
1798 } else if (atype == TIPC_ADDR_ID) {
1799 addr->addr.id.node = v1;
1800 addr->addr.id.ref = v2;
1801 } else {
1802 /* Shouldn't happen */
1803 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1804 return 0;
1805 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001807 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001809 return 1;
1810 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001811#endif
1812
Vinay Sajiped6783f2014-03-21 11:44:32 +00001813#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001814 case AF_CAN:
1815 switch (s->sock_proto) {
1816 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001817 /* fall-through */
1818 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001819 {
1820 struct sockaddr_can *addr;
1821 PyObject *interfaceName;
1822 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001823 Py_ssize_t len;
1824
Benjamin Peterson18b71912013-05-16 15:29:44 -05001825 addr = (struct sockaddr_can *)addr_ret;
1826
Charles-François Natali47413c12011-10-06 19:47:44 +02001827 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1828 &interfaceName))
1829 return 0;
1830
1831 len = PyBytes_GET_SIZE(interfaceName);
1832
1833 if (len == 0) {
1834 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001835 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001836 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1837 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001838 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1839 s->errorhandler();
1840 Py_DECREF(interfaceName);
1841 return 0;
1842 }
1843 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001844 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001845 "AF_CAN interface name too long");
1846 Py_DECREF(interfaceName);
1847 return 0;
1848 }
1849
1850 addr->can_family = AF_CAN;
1851 addr->can_ifindex = ifr.ifr_ifindex;
1852
1853 *len_ret = sizeof(*addr);
1854 Py_DECREF(interfaceName);
1855 return 1;
1856 }
1857 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001858 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001859 "getsockaddrarg: unsupported CAN protocol");
1860 return 0;
1861 }
1862#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001863
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001864#ifdef PF_SYSTEM
1865 case PF_SYSTEM:
1866 switch (s->sock_proto) {
1867#ifdef SYSPROTO_CONTROL
1868 case SYSPROTO_CONTROL:
1869 {
1870 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001871
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001872 addr = (struct sockaddr_ctl *)addr_ret;
1873 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001874 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001875
1876 if (PyUnicode_Check(args)) {
1877 struct ctl_info info;
1878 PyObject *ctl_name;
1879
1880 if (!PyArg_Parse(args, "O&",
1881 PyUnicode_FSConverter, &ctl_name)) {
1882 return 0;
1883 }
1884
Victor Stinnerf50e1872015-03-20 11:32:24 +01001885 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001886 PyErr_SetString(PyExc_ValueError,
1887 "provided string is too long");
1888 Py_DECREF(ctl_name);
1889 return 0;
1890 }
1891 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1892 sizeof(info.ctl_name));
1893 Py_DECREF(ctl_name);
1894
1895 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1896 PyErr_SetString(PyExc_OSError,
1897 "cannot find kernel control with provided name");
1898 return 0;
1899 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001900
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001901 addr->sc_id = info.ctl_id;
1902 addr->sc_unit = 0;
1903 } else if (!PyArg_ParseTuple(args, "II",
1904 &(addr->sc_id), &(addr->sc_unit))) {
1905 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1906 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001907
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001908 return 0;
1909 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001910
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001911 *len_ret = sizeof(*addr);
1912 return 1;
1913 }
1914#endif
1915 default:
1916 PyErr_SetString(PyExc_OSError,
1917 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1918 return 0;
1919 }
1920#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001921
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001922 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001924 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001925 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001926 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001927
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001928 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001929}
1930
Guido van Rossum30a685f1991-06-27 15:51:29 +00001931
Guido van Rossum48a680c2001-03-02 06:34:14 +00001932/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001933 Return 1 if the family is known, 0 otherwise. The length is returned
1934 through len_ret. */
1935
1936static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001937getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001938{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001939 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001940
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001941#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001942 case AF_UNIX:
1943 {
1944 *len_ret = sizeof (struct sockaddr_un);
1945 return 1;
1946 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001947#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001948#if defined(AF_NETLINK)
1949 case AF_NETLINK:
1950 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001951 *len_ret = sizeof (struct sockaddr_nl);
1952 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001953 }
1954#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001955
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001956#ifdef AF_RDS
1957 case AF_RDS:
1958 /* RDS sockets use sockaddr_in: fall-through */
1959#endif
1960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001961 case AF_INET:
1962 {
1963 *len_ret = sizeof (struct sockaddr_in);
1964 return 1;
1965 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001966
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001967#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001968 case AF_INET6:
1969 {
1970 *len_ret = sizeof (struct sockaddr_in6);
1971 return 1;
1972 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001973#endif
1974
Hye-Shik Chang81268602004-02-02 06:05:24 +00001975#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 case AF_BLUETOOTH:
1977 {
1978 switch(s->sock_proto)
1979 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001981 case BTPROTO_L2CAP:
1982 *len_ret = sizeof (struct sockaddr_l2);
1983 return 1;
1984 case BTPROTO_RFCOMM:
1985 *len_ret = sizeof (struct sockaddr_rc);
1986 return 1;
1987 case BTPROTO_HCI:
1988 *len_ret = sizeof (struct sockaddr_hci);
1989 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001990#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001991 case BTPROTO_SCO:
1992 *len_ret = sizeof (struct sockaddr_sco);
1993 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001994#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001995 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001996 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001997 "unknown BT protocol");
1998 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001999
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002000 }
2001 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00002002#endif
2003
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00002004#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002005 case AF_PACKET:
2006 {
2007 *len_ret = sizeof (struct sockaddr_ll);
2008 return 1;
2009 }
Jeremy Hylton22308652001-02-02 03:23:09 +00002010#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00002011
Christian Heimes043d6f62008-01-07 17:19:16 +00002012#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002013 case AF_TIPC:
2014 {
2015 *len_ret = sizeof (struct sockaddr_tipc);
2016 return 1;
2017 }
Christian Heimes043d6f62008-01-07 17:19:16 +00002018#endif
2019
Vinay Sajipecfc98c2014-03-20 12:42:42 +00002020#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02002021 case AF_CAN:
2022 {
2023 *len_ret = sizeof (struct sockaddr_can);
2024 return 1;
2025 }
2026#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02002027
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01002028#ifdef PF_SYSTEM
2029 case PF_SYSTEM:
2030 switch(s->sock_proto) {
2031#ifdef SYSPROTO_CONTROL
2032 case SYSPROTO_CONTROL:
2033 *len_ret = sizeof (struct sockaddr_ctl);
2034 return 1;
2035#endif
2036 default:
2037 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
2038 "unknown PF_SYSTEM protocol");
2039 return 0;
2040 }
2041#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00002044
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002045 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002046 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002047 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00002048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002049 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00002050}
2051
2052
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002053/* Support functions for the sendmsg() and recvmsg[_into]() methods.
2054 Currently, these methods are only compiled if the RFC 2292/3542
2055 CMSG_LEN() macro is available. Older systems seem to have used
2056 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
2057 it may be possible to define CMSG_LEN() that way if it's not
2058 provided. Some architectures might need extra padding after the
2059 cmsghdr, however, and CMSG_LEN() would have to take account of
2060 this. */
2061#ifdef CMSG_LEN
2062/* If length is in range, set *result to CMSG_LEN(length) and return
2063 true; otherwise, return false. */
2064static int
2065get_CMSG_LEN(size_t length, size_t *result)
2066{
2067 size_t tmp;
2068
2069 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
2070 return 0;
2071 tmp = CMSG_LEN(length);
2072 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2073 return 0;
2074 *result = tmp;
2075 return 1;
2076}
2077
2078#ifdef CMSG_SPACE
2079/* If length is in range, set *result to CMSG_SPACE(length) and return
2080 true; otherwise, return false. */
2081static int
2082get_CMSG_SPACE(size_t length, size_t *result)
2083{
2084 size_t tmp;
2085
2086 /* Use CMSG_SPACE(1) here in order to take account of the padding
2087 necessary before *and* after the data. */
2088 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
2089 return 0;
2090 tmp = CMSG_SPACE(length);
2091 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
2092 return 0;
2093 *result = tmp;
2094 return 1;
2095}
2096#endif
2097
2098/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
2099 pointer in msg->msg_control with at least "space" bytes after it,
2100 and its cmsg_len member inside the buffer. */
2101static int
2102cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
2103{
2104 size_t cmsg_offset;
2105 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
2106 sizeof(cmsgh->cmsg_len));
2107
Charles-François Natali466517d2011-08-28 18:23:43 +02002108 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05002109 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002110 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05002111 /* Note that POSIX allows msg_controllen to be of a signed type. This is
2112 annoying under OS X as it's unsigned there and so it triggers a
2113 tautological comparison warning under Clang when compared against 0.
2114 Since the check is valid on other platforms, silence the warning under
2115 Clang. */
2116 #ifdef __clang__
2117 #pragma clang diagnostic push
2118 #pragma clang diagnostic ignored "-Wtautological-compare"
2119 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002120 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002121 #pragma GCC diagnostic push
2122 #pragma GCC diagnostic ignored "-Wtype-limits"
2123 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002124 if (msg->msg_controllen < 0)
2125 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002126 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002127 #pragma GCC diagnostic pop
2128 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002129 #ifdef __clang__
2130 #pragma clang diagnostic pop
2131 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002132 if (space < cmsg_len_end)
2133 space = cmsg_len_end;
2134 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2135 return (cmsg_offset <= (size_t)-1 - space &&
2136 cmsg_offset + space <= msg->msg_controllen);
2137}
2138
2139/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2140 *space to number of bytes following it in the buffer and return
2141 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2142 msg->msg_controllen are valid. */
2143static int
2144get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2145{
2146 size_t data_offset;
2147 char *data_ptr;
2148
2149 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2150 return 0;
2151 data_offset = data_ptr - (char *)msg->msg_control;
2152 if (data_offset > msg->msg_controllen)
2153 return 0;
2154 *space = msg->msg_controllen - data_offset;
2155 return 1;
2156}
2157
2158/* If cmsgh is invalid or not contained in the buffer pointed to by
2159 msg->msg_control, return -1. If cmsgh is valid and its associated
2160 data is entirely contained in the buffer, set *data_len to the
2161 length of the associated data and return 0. If only part of the
2162 associated data is contained in the buffer but cmsgh is otherwise
2163 valid, set *data_len to the length contained in the buffer and
2164 return 1. */
2165static int
2166get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2167{
2168 size_t space, cmsg_data_len;
2169
2170 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2171 cmsgh->cmsg_len < CMSG_LEN(0))
2172 return -1;
2173 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2174 if (!get_cmsg_data_space(msg, cmsgh, &space))
2175 return -1;
2176 if (space >= cmsg_data_len) {
2177 *data_len = cmsg_data_len;
2178 return 0;
2179 }
2180 *data_len = space;
2181 return 1;
2182}
2183#endif /* CMSG_LEN */
2184
2185
Victor Stinner31bf2d52015-04-01 21:57:09 +02002186struct sock_accept {
2187 socklen_t *addrlen;
2188 sock_addr_t *addrbuf;
2189 SOCKET_T result;
2190};
2191
2192#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2193/* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2194static int accept4_works = -1;
2195#endif
2196
2197static int
2198sock_accept_impl(PySocketSockObject *s, void *data)
2199{
2200 struct sock_accept *ctx = data;
2201
2202#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2203 if (accept4_works != 0) {
2204 ctx->result = accept4(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen,
2205 SOCK_CLOEXEC);
2206 if (ctx->result == INVALID_SOCKET && accept4_works == -1) {
2207 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2208 accept4_works = (errno != ENOSYS);
2209 }
2210 }
2211 if (accept4_works == 0)
2212 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2213#else
2214 ctx->result = accept(s->sock_fd, SAS2SA(ctx->addrbuf), ctx->addrlen);
2215#endif
Victor Stinnerbea232a2015-07-27 23:37:11 +02002216
2217#ifdef MS_WINDOWS
2218 return (ctx->result != INVALID_SOCKET);
2219#else
Victor Stinner31bf2d52015-04-01 21:57:09 +02002220 return (ctx->result >= 0);
Victor Stinnerbea232a2015-07-27 23:37:11 +02002221#endif
Victor Stinner31bf2d52015-04-01 21:57:09 +02002222}
2223
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002224/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002225
Guido van Rossum73624e91994-10-10 17:59:00 +00002226static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002227sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002229 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002230 SOCKET_T newfd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002231 socklen_t addrlen;
2232 PyObject *sock = NULL;
2233 PyObject *addr = NULL;
2234 PyObject *res = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002235 struct sock_accept ctx;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002237 if (!getsockaddrlen(s, &addrlen))
2238 return NULL;
2239 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002240
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002241 if (!IS_SELECTABLE(s))
2242 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002243
Victor Stinner31bf2d52015-04-01 21:57:09 +02002244 ctx.addrlen = &addrlen;
2245 ctx.addrbuf = &addrbuf;
2246 if (sock_call(s, 0, sock_accept_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002247 return NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002248 newfd = ctx.result;
Barry Warsaw752300b1997-01-03 17:18:10 +00002249
Victor Stinnerdaf45552013-08-28 00:53:59 +02002250#ifdef MS_WINDOWS
2251 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2252 PyErr_SetFromWindowsErr(0);
2253 SOCKETCLOSE(newfd);
2254 goto finally;
2255 }
2256#else
2257
2258#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2259 if (!accept4_works)
2260#endif
2261 {
2262 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2263 SOCKETCLOSE(newfd);
2264 goto finally;
2265 }
2266 }
2267#endif
2268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002269 sock = PyLong_FromSocket_t(newfd);
2270 if (sock == NULL) {
2271 SOCKETCLOSE(newfd);
2272 goto finally;
2273 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002274
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002275 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2276 addrlen, s->sock_proto);
2277 if (addr == NULL)
2278 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002279
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002280 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002281
Guido van Rossum67f7a382002-06-06 21:08:16 +00002282finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002283 Py_XDECREF(sock);
2284 Py_XDECREF(addr);
2285 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002286}
2287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002288PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002289"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002290\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002291Wait for an incoming connection. Return a new socket file descriptor\n\
2292representing the connection, and the address of the client.\n\
2293For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002294
Guido van Rossum11ba0942002-06-13 15:07:44 +00002295/* s.setblocking(flag) method. Argument:
2296 False -- non-blocking mode; same as settimeout(0)
2297 True -- blocking mode; same as settimeout(None)
2298*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002299
Guido van Rossum73624e91994-10-10 17:59:00 +00002300static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002301sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002302{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002303 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 block = PyLong_AsLong(arg);
2306 if (block == -1 && PyErr_Occurred())
2307 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002308
Victor Stinner9001d802015-04-06 23:06:01 +02002309 s->sock_timeout = _PyTime_FromSeconds(block ? -1 : 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002311
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002312 Py_INCREF(Py_None);
2313 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002314}
Guido van Rossume4485b01994-09-07 14:32:49 +00002315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002316PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002317"setblocking(flag)\n\
2318\n\
2319Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002320setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002321setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002322
Victor Stinner71694d52015-03-28 01:18:54 +01002323static int
2324socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2325{
2326#ifdef MS_WINDOWS
2327 struct timeval tv;
2328#endif
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002329#ifndef HAVE_POLL
2330 _PyTime_t ms;
2331#endif
Victor Stinner71694d52015-03-28 01:18:54 +01002332 int overflow = 0;
2333
2334 if (timeout_obj == Py_None) {
Victor Stinner10550cd2015-04-03 13:22:27 +02002335 *timeout = _PyTime_FromSeconds(-1);
Victor Stinner71694d52015-03-28 01:18:54 +01002336 return 0;
2337 }
2338
Victor Stinner869e1772015-03-30 03:49:14 +02002339 if (_PyTime_FromSecondsObject(timeout,
2340 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002341 return -1;
2342
2343 if (*timeout < 0) {
2344 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2345 return -1;
2346 }
2347
2348#ifdef MS_WINDOWS
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002349 overflow |= (_PyTime_AsTimeval(*timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002350#endif
2351#ifndef HAVE_POLL
Victor Stinner1bb0aef2015-03-31 16:31:19 +02002352 ms = _PyTime_AsMilliseconds(*timeout, _PyTime_ROUND_CEILING);
2353 overflow |= (ms > INT_MAX);
Victor Stinner71694d52015-03-28 01:18:54 +01002354#endif
2355 if (overflow) {
2356 PyErr_SetString(PyExc_OverflowError,
2357 "timeout doesn't fit into C timeval");
2358 return -1;
2359 }
2360
2361 return 0;
2362}
2363
Guido van Rossum11ba0942002-06-13 15:07:44 +00002364/* s.settimeout(timeout) method. Argument:
2365 None -- no timeout, blocking mode; same as setblocking(True)
2366 0.0 -- non-blocking mode; same as setblocking(False)
2367 > 0 -- timeout mode; operations time out after timeout seconds
2368 < 0 -- illegal; raises an exception
2369*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002370static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002371sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002372{
Victor Stinner71694d52015-03-28 01:18:54 +01002373 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002374
Victor Stinner71694d52015-03-28 01:18:54 +01002375 if (socket_parse_timeout(&timeout, arg) < 0)
2376 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002377
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002378 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002379 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002381 Py_INCREF(Py_None);
2382 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002383}
2384
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002385PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002386"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002387\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002388Set a timeout on socket operations. 'timeout' can be a float,\n\
2389giving in seconds, or None. Setting a timeout of None disables\n\
2390the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002391Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002392
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002393/* s.gettimeout() method.
2394 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002397{
Victor Stinner71694d52015-03-28 01:18:54 +01002398 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 Py_INCREF(Py_None);
2400 return Py_None;
2401 }
Victor Stinner71694d52015-03-28 01:18:54 +01002402 else {
2403 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2404 return PyFloat_FromDouble(seconds);
2405 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002406}
2407
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002408PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002409"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002410\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002411Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002412operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002413operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002414
Guido van Rossumaee08791992-09-08 09:05:33 +00002415/* s.setsockopt() method.
2416 With an integer third argument, sets an integer option.
2417 With a string third argument, sets an option from a buffer;
2418 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002419
Guido van Rossum73624e91994-10-10 17:59:00 +00002420static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002421sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002422{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002423 int level;
2424 int optname;
2425 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002426 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002427 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002428
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002429 if (PyArg_ParseTuple(args, "iii:setsockopt",
2430 &level, &optname, &flag)) {
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002431 res = setsockopt(s->sock_fd, level, optname,
2432 (char*)&flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002433 }
2434 else {
2435 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002436 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2437 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002438 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002439 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2440 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002441 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002442 if (res < 0)
2443 return s->errorhandler();
2444 Py_INCREF(Py_None);
2445 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002446}
2447
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002448PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002449"setsockopt(level, option, value)\n\
2450\n\
2451Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002452The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002453
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002454
Guido van Rossumaee08791992-09-08 09:05:33 +00002455/* s.getsockopt() method.
2456 With two arguments, retrieves an integer option.
2457 With a third integer argument, retrieves a string buffer of that size;
2458 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002459
Guido van Rossum73624e91994-10-10 17:59:00 +00002460static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002461sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002463 int level;
2464 int optname;
2465 int res;
2466 PyObject *buf;
2467 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002469 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2470 &level, &optname, &buflen))
2471 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002473 if (buflen == 0) {
2474 int flag = 0;
2475 socklen_t flagsize = sizeof flag;
2476 res = getsockopt(s->sock_fd, level, optname,
2477 (void *)&flag, &flagsize);
2478 if (res < 0)
2479 return s->errorhandler();
2480 return PyLong_FromLong(flag);
2481 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002482 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002483 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 "getsockopt buflen out of range");
2485 return NULL;
2486 }
2487 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2488 if (buf == NULL)
2489 return NULL;
2490 res = getsockopt(s->sock_fd, level, optname,
2491 (void *)PyBytes_AS_STRING(buf), &buflen);
2492 if (res < 0) {
2493 Py_DECREF(buf);
2494 return s->errorhandler();
2495 }
2496 _PyBytes_Resize(&buf, buflen);
2497 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002498}
2499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002501"getsockopt(level, option[, buffersize]) -> value\n\
2502\n\
2503Get a socket option. See the Unix manual for level and option.\n\
2504If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002505string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002506
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002507
Fred Drake728819a2000-07-01 03:40:12 +00002508/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002509
Guido van Rossum73624e91994-10-10 17:59:00 +00002510static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002511sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002512{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 sock_addr_t addrbuf;
2514 int addrlen;
2515 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002517 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2518 return NULL;
2519 Py_BEGIN_ALLOW_THREADS
2520 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2521 Py_END_ALLOW_THREADS
2522 if (res < 0)
2523 return s->errorhandler();
2524 Py_INCREF(Py_None);
2525 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002526}
2527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002528PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002529"bind(address)\n\
2530\n\
2531Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002532pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002533sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002534
Guido van Rossum30a685f1991-06-27 15:51:29 +00002535
2536/* s.close() method.
2537 Set the file descriptor to -1 so operations tried subsequently
2538 will surely fail. */
2539
Guido van Rossum73624e91994-10-10 17:59:00 +00002540static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002541sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002542{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002544
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002545 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2546 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2547 * for more details.
2548 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 if ((fd = s->sock_fd) != -1) {
2550 s->sock_fd = -1;
2551 Py_BEGIN_ALLOW_THREADS
2552 (void) SOCKETCLOSE(fd);
2553 Py_END_ALLOW_THREADS
2554 }
2555 Py_INCREF(Py_None);
2556 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002557}
2558
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002559PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002560"close()\n\
2561\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002562Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002563
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002564static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002565sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002566{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002567 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002568 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002569 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002570}
2571
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002572PyDoc_STRVAR(detach_doc,
2573"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002574\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002575Close the socket object without closing the underlying file descriptor.\n\
2576The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002577can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002578
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002579static int
Victor Stinner81c41db2015-04-02 11:50:57 +02002580sock_connect_impl(PySocketSockObject *s, void* Py_UNUSED(data))
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002581{
Victor Stinner81c41db2015-04-02 11:50:57 +02002582 int err;
2583 socklen_t size = sizeof err;
Victor Stinnerb6c15bc2015-03-31 16:35:35 +02002584
Victor Stinner81c41db2015-04-02 11:50:57 +02002585 if (getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR, (void *)&err, &size)) {
2586 /* getsockopt() failed */
2587 return 0;
2588 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002589
Victor Stinner81c41db2015-04-02 11:50:57 +02002590 if (err == EISCONN)
2591 return 1;
Victor Stinner38aec752015-04-02 14:37:20 +02002592 if (err != 0) {
2593 /* sock_call_ex() uses GET_SOCK_ERROR() to get the error code */
2594 SET_SOCK_ERROR(err);
Victor Stinner38aec752015-04-02 14:37:20 +02002595 return 0;
2596 }
2597 return 1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002598}
2599
2600static int
2601internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
2602 int raise)
2603{
2604 int res, err, wait_connect;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002605
2606 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002607 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002608 Py_END_ALLOW_THREADS
2609
Victor Stinner70a46f62015-03-31 22:03:59 +02002610 if (!res) {
2611 /* connect() succeeded, the socket is connected */
2612 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002613 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002614
Victor Stinner81c41db2015-04-02 11:50:57 +02002615 /* connect() failed */
Victor Stinneree699e92015-03-31 21:28:42 +02002616
Victor Stinner81c41db2015-04-02 11:50:57 +02002617 /* save error, PyErr_CheckSignals() can replace it */
2618 err = GET_SOCK_ERROR;
2619 if (CHECK_ERRNO(EINTR)) {
2620 if (PyErr_CheckSignals())
Victor Stinner70a46f62015-03-31 22:03:59 +02002621 return -1;
Victor Stinner81c41db2015-04-02 11:50:57 +02002622
2623 /* Issue #23618: when connect() fails with EINTR, the connection is
2624 running asynchronously.
2625
2626 If the socket is blocking or has a timeout, wait until the
2627 connection completes, fails or timed out using select(), and then
2628 get the connection status using getsockopt(SO_ERROR).
2629
2630 If the socket is non-blocking, raise InterruptedError. The caller is
2631 responsible to wait until the connection completes, fails or timed
2632 out (it's the case in asyncio for example). */
2633 wait_connect = (s->sock_timeout != 0 && IS_SELECTABLE(s));
2634 }
2635 else {
2636 wait_connect = (s->sock_timeout > 0 && err == SOCK_INPROGRESS_ERR
2637 && IS_SELECTABLE(s));
Victor Stinner70a46f62015-03-31 22:03:59 +02002638 }
2639
Victor Stinner81c41db2015-04-02 11:50:57 +02002640 if (!wait_connect) {
2641 if (raise) {
2642 /* restore error, maybe replaced by PyErr_CheckSignals() */
2643 SET_SOCK_ERROR(err);
2644 s->errorhandler();
2645 return -1;
2646 }
2647 else
2648 return err;
Victor Stinner70a46f62015-03-31 22:03:59 +02002649 }
2650
Victor Stinner81c41db2015-04-02 11:50:57 +02002651 if (raise) {
2652 /* socket.connect() raises an exception on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002653 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2654 1, NULL, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002655 return -1;
Victor Stinner70a46f62015-03-31 22:03:59 +02002656 }
Victor Stinner81c41db2015-04-02 11:50:57 +02002657 else {
2658 /* socket.connect_ex() returns the error code on error */
Victor Stinner8912d142015-04-06 23:16:34 +02002659 if (sock_call_ex(s, 1, sock_connect_impl, NULL,
2660 1, &err, s->sock_timeout) < 0)
Victor Stinner81c41db2015-04-02 11:50:57 +02002661 return err;
2662 }
2663 return 0;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002664}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002665
Fred Drake728819a2000-07-01 03:40:12 +00002666/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002667
Guido van Rossum73624e91994-10-10 17:59:00 +00002668static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002669sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002671 sock_addr_t addrbuf;
2672 int addrlen;
2673 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002674
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002675 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2676 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002677
Victor Stinner81c41db2015-04-02 11:50:57 +02002678 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 1);
Victor Stinneree699e92015-03-31 21:28:42 +02002679 if (res < 0)
2680 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002681
Victor Stinneree699e92015-03-31 21:28:42 +02002682 Py_RETURN_NONE;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002683}
2684
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002685PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002686"connect(address)\n\
2687\n\
2688Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002689is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002690
Guido van Rossum30a685f1991-06-27 15:51:29 +00002691
Fred Drake728819a2000-07-01 03:40:12 +00002692/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002693
2694static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002695sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002697 sock_addr_t addrbuf;
2698 int addrlen;
2699 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002701 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2702 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002703
Victor Stinner81c41db2015-04-02 11:50:57 +02002704 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002705 if (res < 0)
2706 return NULL;
2707
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002708 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002709}
2710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002712"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002713\n\
2714This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002715instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002716
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002717
Guido van Rossumed233a51992-06-23 09:07:03 +00002718/* s.fileno() method */
2719
Guido van Rossum73624e91994-10-10 17:59:00 +00002720static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002721sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002722{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002723 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002724}
2725
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002726PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002727"fileno() -> integer\n\
2728\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002729Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002730
Guido van Rossumed233a51992-06-23 09:07:03 +00002731
Guido van Rossumc89705d1992-11-26 08:54:07 +00002732/* s.getsockname() method */
2733
Guido van Rossum73624e91994-10-10 17:59:00 +00002734static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002735sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002736{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002737 sock_addr_t addrbuf;
2738 int res;
2739 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002741 if (!getsockaddrlen(s, &addrlen))
2742 return NULL;
2743 memset(&addrbuf, 0, addrlen);
2744 Py_BEGIN_ALLOW_THREADS
2745 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2746 Py_END_ALLOW_THREADS
2747 if (res < 0)
2748 return s->errorhandler();
2749 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2750 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002751}
2752
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002753PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002754"getsockname() -> address info\n\
2755\n\
2756Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002757info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002758
Guido van Rossumc89705d1992-11-26 08:54:07 +00002759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002760#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002761/* s.getpeername() method */
2762
Guido van Rossum73624e91994-10-10 17:59:00 +00002763static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002764sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002765{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002766 sock_addr_t addrbuf;
2767 int res;
2768 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002769
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 if (!getsockaddrlen(s, &addrlen))
2771 return NULL;
2772 memset(&addrbuf, 0, addrlen);
2773 Py_BEGIN_ALLOW_THREADS
2774 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2775 Py_END_ALLOW_THREADS
2776 if (res < 0)
2777 return s->errorhandler();
2778 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2779 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002780}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002781
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002782PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002783"getpeername() -> address info\n\
2784\n\
2785Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002786info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002787
Guido van Rossumb6775db1994-08-01 11:34:53 +00002788#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002789
2790
Guido van Rossum30a685f1991-06-27 15:51:29 +00002791/* s.listen(n) method */
2792
Guido van Rossum73624e91994-10-10 17:59:00 +00002793static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002794sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002795{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002796 /* We try to choose a default backlog high enough to avoid connection drops
2797 * for common workloads, yet not too high to limit resource usage. */
2798 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002799 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002800
Charles-François Natali644b8f52014-05-22 19:45:39 +01002801 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002802 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002803
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002804 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002805 /* To avoid problems on systems that don't allow a negative backlog
2806 * (which doesn't make sense anyway) we force a minimum value of 0. */
2807 if (backlog < 0)
2808 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 res = listen(s->sock_fd, backlog);
2810 Py_END_ALLOW_THREADS
2811 if (res < 0)
2812 return s->errorhandler();
2813 Py_INCREF(Py_None);
2814 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002815}
2816
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002817PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002818"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002819\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002820Enable a server to accept connections. If backlog is specified, it must be\n\
2821at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002822unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002823connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002824
Victor Stinner31bf2d52015-04-01 21:57:09 +02002825struct sock_recv {
2826 char *cbuf;
2827 Py_ssize_t len;
2828 int flags;
2829 Py_ssize_t result;
2830};
2831
2832static int
2833sock_recv_impl(PySocketSockObject *s, void *data)
2834{
2835 struct sock_recv *ctx = data;
2836
2837#ifdef MS_WINDOWS
2838 if (ctx->len > INT_MAX)
2839 ctx->len = INT_MAX;
2840 ctx->result = recv(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags);
2841#else
2842 ctx->result = recv(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags);
2843#endif
2844 return (ctx->result >= 0);
2845}
2846
Guido van Rossum82a5c661998-07-07 20:45:43 +00002847
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002849 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002850 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002852 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002853 * also possible that we return a number of bytes smaller than the request
2854 * bytes.
2855 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002856
Antoine Pitrou19467d22010-08-17 19:33:30 +00002857static Py_ssize_t
2858sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002859{
Victor Stinner31bf2d52015-04-01 21:57:09 +02002860 struct sock_recv ctx;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 if (!IS_SELECTABLE(s)) {
2863 select_error();
2864 return -1;
2865 }
2866 if (len == 0) {
2867 /* If 0 bytes were requested, do nothing. */
2868 return 0;
2869 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002870
Victor Stinner31bf2d52015-04-01 21:57:09 +02002871 ctx.cbuf = cbuf;
2872 ctx.len = len;
2873 ctx.flags = flags;
2874 if (sock_call(s, 0, sock_recv_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002875 return -1;
Victor Stinner31bf2d52015-04-01 21:57:09 +02002876
2877 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002878}
2879
Guido van Rossum48a680c2001-03-02 06:34:14 +00002880
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002881/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002882
Guido van Rossum73624e91994-10-10 17:59:00 +00002883static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002884sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002885{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002886 Py_ssize_t recvlen, outlen;
2887 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002888 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002889
Antoine Pitrou19467d22010-08-17 19:33:30 +00002890 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002891 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002892
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002893 if (recvlen < 0) {
2894 PyErr_SetString(PyExc_ValueError,
2895 "negative buffersize in recv");
2896 return NULL;
2897 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002899 /* Allocate a new string. */
2900 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2901 if (buf == NULL)
2902 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002903
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 /* Call the guts */
2905 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2906 if (outlen < 0) {
2907 /* An error occurred, release the string and return an
2908 error. */
2909 Py_DECREF(buf);
2910 return NULL;
2911 }
2912 if (outlen != recvlen) {
2913 /* We did not read as many bytes as we anticipated, resize the
2914 string if possible and be successful. */
2915 _PyBytes_Resize(&buf, outlen);
2916 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002918 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002919}
2920
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002921PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002922"recv(buffersize[, flags]) -> data\n\
2923\n\
2924Receive up to buffersize bytes from the socket. For the optional flags\n\
2925argument, see the Unix manual. When no data is available, block until\n\
2926at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002927the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002928
Guido van Rossum30a685f1991-06-27 15:51:29 +00002929
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002930/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002931
Thomas Wouters477c8d52006-05-27 19:21:47 +00002932static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002933sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002935 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002936
Antoine Pitrou19467d22010-08-17 19:33:30 +00002937 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002938 Py_buffer pbuf;
2939 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002940 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002942 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002943 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002944 &pbuf, &recvlen, &flags))
2945 return NULL;
2946 buf = pbuf.buf;
2947 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002948
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002949 if (recvlen < 0) {
2950 PyBuffer_Release(&pbuf);
2951 PyErr_SetString(PyExc_ValueError,
2952 "negative buffersize in recv_into");
2953 return NULL;
2954 }
2955 if (recvlen == 0) {
2956 /* If nbytes was not specified, use the buffer's length */
2957 recvlen = buflen;
2958 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002960 /* Check if the buffer is large enough */
2961 if (buflen < recvlen) {
2962 PyBuffer_Release(&pbuf);
2963 PyErr_SetString(PyExc_ValueError,
2964 "buffer too small for requested bytes");
2965 return NULL;
2966 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002968 /* Call the guts */
2969 readlen = sock_recv_guts(s, buf, recvlen, flags);
2970 if (readlen < 0) {
2971 /* Return an error. */
2972 PyBuffer_Release(&pbuf);
2973 return NULL;
2974 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002976 PyBuffer_Release(&pbuf);
2977 /* Return the number of bytes read. Note that we do not do anything
2978 special here in the case that readlen < recvlen. */
2979 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002980}
2981
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002982PyDoc_STRVAR(recv_into_doc,
2983"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002984\n\
2985A version of recv() that stores its data into a buffer rather than creating \n\
2986a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2987is not specified (or 0), receive up to the size available in the given buffer.\n\
2988\n\
2989See recv() for documentation about the flags.");
2990
Victor Stinner31bf2d52015-04-01 21:57:09 +02002991struct sock_recvfrom {
2992 char* cbuf;
2993 Py_ssize_t len;
2994 int flags;
2995 socklen_t *addrlen;
2996 sock_addr_t *addrbuf;
2997 Py_ssize_t result;
2998};
2999
3000static int
3001sock_recvfrom_impl(PySocketSockObject *s, void *data)
3002{
3003 struct sock_recvfrom *ctx = data;
3004
3005 memset(ctx->addrbuf, 0, *ctx->addrlen);
3006
3007#ifdef MS_WINDOWS
3008 if (ctx->len > INT_MAX)
3009 ctx->len = INT_MAX;
3010 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, (int)ctx->len, ctx->flags,
3011 SAS2SA(ctx->addrbuf), ctx->addrlen);
3012#else
3013 ctx->result = recvfrom(s->sock_fd, ctx->cbuf, ctx->len, ctx->flags,
3014 SAS2SA(ctx->addrbuf), ctx->addrlen);
3015#endif
3016 return (ctx->result >= 0);
3017}
3018
Thomas Wouters477c8d52006-05-27 19:21:47 +00003019
3020/*
Christian Heimes99170a52007-12-19 02:07:34 +00003021 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
3022 * into a char buffer. If you have any inc/def ref to do to the objects that
3023 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02003024 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00003025 * that it is also possible that we return a number of bytes smaller than the
3026 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00003027 *
3028 * 'addr' is a return value for the address object. Note that you must decref
3029 * it yourself.
3030 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003031static Py_ssize_t
3032sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003033 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003034{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003035 sock_addr_t addrbuf;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003036 socklen_t addrlen;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003037 struct sock_recvfrom ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003041 if (!getsockaddrlen(s, &addrlen))
3042 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003043
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003044 if (!IS_SELECTABLE(s)) {
3045 select_error();
3046 return -1;
3047 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003048
Victor Stinner31bf2d52015-04-01 21:57:09 +02003049 ctx.cbuf = cbuf;
3050 ctx.len = len;
3051 ctx.flags = flags;
3052 ctx.addrbuf = &addrbuf;
3053 ctx.addrlen = &addrlen;
3054 if (sock_call(s, 0, sock_recvfrom_impl, &ctx) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003056
Victor Stinner31bf2d52015-04-01 21:57:09 +02003057 *addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
3058 s->sock_proto);
3059 if (*addr == NULL)
3060 return -1;
3061
3062 return ctx.result;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003063}
3064
3065/* s.recvfrom(nbytes [,flags]) method */
3066
3067static PyObject *
3068sock_recvfrom(PySocketSockObject *s, PyObject *args)
3069{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003070 PyObject *buf = NULL;
3071 PyObject *addr = NULL;
3072 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003073 int flags = 0;
3074 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003075
Antoine Pitrou19467d22010-08-17 19:33:30 +00003076 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003077 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00003078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003079 if (recvlen < 0) {
3080 PyErr_SetString(PyExc_ValueError,
3081 "negative buffersize in recvfrom");
3082 return NULL;
3083 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00003084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003085 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
3086 if (buf == NULL)
3087 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003089 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
3090 recvlen, flags, &addr);
3091 if (outlen < 0) {
3092 goto finally;
3093 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003095 if (outlen != recvlen) {
3096 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02003097 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003098 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02003099 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003100 goto finally;
3101 }
Barry Warsaw752300b1997-01-03 17:18:10 +00003102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003103 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003104
3105finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003106 Py_XDECREF(buf);
3107 Py_XDECREF(addr);
3108 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003109}
3110
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003111PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003112"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3113\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003114Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003115
Thomas Wouters477c8d52006-05-27 19:21:47 +00003116
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003117/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003118
3119static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003120sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003122 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003123
Antoine Pitrou19467d22010-08-17 19:33:30 +00003124 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003125 Py_buffer pbuf;
3126 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003127 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003129 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003130
Antoine Pitrou19467d22010-08-17 19:33:30 +00003131 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003132 kwlist, &pbuf,
3133 &recvlen, &flags))
3134 return NULL;
3135 buf = pbuf.buf;
3136 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003137
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003138 if (recvlen < 0) {
3139 PyBuffer_Release(&pbuf);
3140 PyErr_SetString(PyExc_ValueError,
3141 "negative buffersize in recvfrom_into");
3142 return NULL;
3143 }
3144 if (recvlen == 0) {
3145 /* If nbytes was not specified, use the buffer's length */
3146 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003147 } else if (recvlen > buflen) {
3148 PyBuffer_Release(&pbuf);
3149 PyErr_SetString(PyExc_ValueError,
3150 "nbytes is greater than the length of the buffer");
3151 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003152 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003153
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003154 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3155 if (readlen < 0) {
3156 PyBuffer_Release(&pbuf);
3157 /* Return an error */
3158 Py_XDECREF(addr);
3159 return NULL;
3160 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003162 PyBuffer_Release(&pbuf);
3163 /* Return the number of bytes read and the address. Note that we do
3164 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003165 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003166}
3167
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003168PyDoc_STRVAR(recvfrom_into_doc,
3169"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003170\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003171Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003172
Victor Stinner35bee932015-04-02 12:28:07 +02003173/* The sendmsg() and recvmsg[_into]() methods require a working
3174 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3175#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003176struct sock_recvmsg {
3177 struct msghdr *msg;
3178 int flags;
3179 ssize_t result;
3180};
3181
3182static int
3183sock_recvmsg_impl(PySocketSockObject *s, void *data)
3184{
3185 struct sock_recvmsg *ctx = data;
3186
3187 ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags);
3188 return (ctx->result >= 0);
3189}
3190
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003191/*
3192 * Call recvmsg() with the supplied iovec structures, flags, and
3193 * ancillary data buffer size (controllen). Returns the tuple return
3194 * value for recvmsg() or recvmsg_into(), with the first item provided
3195 * by the supplied makeval() function. makeval() will be called with
3196 * the length read and makeval_data as arguments, and must return a
3197 * new reference (which will be decrefed if there is a subsequent
3198 * error). On error, closes any file descriptors received via
3199 * SCM_RIGHTS.
3200 */
3201static PyObject *
3202sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3203 int flags, Py_ssize_t controllen,
3204 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3205{
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003206 sock_addr_t addrbuf;
3207 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003208 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003209 PyObject *cmsg_list = NULL, *retval = NULL;
3210 void *controlbuf = NULL;
3211 struct cmsghdr *cmsgh;
3212 size_t cmsgdatalen = 0;
3213 int cmsg_status;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003214 struct sock_recvmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003215
3216 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3217 ignored" when the socket is connected (Linux fills them in
3218 anyway for AF_UNIX sockets at least). Normally msg_namelen
3219 seems to be set to 0 if there's no address, but try to
3220 initialize msg_name to something that won't be mistaken for a
3221 real address if that doesn't happen. */
3222 if (!getsockaddrlen(s, &addrbuflen))
3223 return NULL;
3224 memset(&addrbuf, 0, addrbuflen);
3225 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3226
3227 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3228 PyErr_SetString(PyExc_ValueError,
3229 "invalid ancillary data buffer length");
3230 return NULL;
3231 }
3232 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3233 return PyErr_NoMemory();
3234
3235 /* Make the system call. */
3236 if (!IS_SELECTABLE(s)) {
3237 select_error();
3238 goto finally;
3239 }
3240
Victor Stinner31bf2d52015-04-01 21:57:09 +02003241 msg.msg_name = SAS2SA(&addrbuf);
3242 msg.msg_namelen = addrbuflen;
3243 msg.msg_iov = iov;
3244 msg.msg_iovlen = iovlen;
3245 msg.msg_control = controlbuf;
3246 msg.msg_controllen = controllen;
Victor Stinnerb7df3142015-03-27 22:59:32 +01003247
Victor Stinner31bf2d52015-04-01 21:57:09 +02003248 ctx.msg = &msg;
3249 ctx.flags = flags;
3250 if (sock_call(s, 0, sock_recvmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003251 goto finally;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003252
3253 /* Make list of (level, type, data) tuples from control messages. */
3254 if ((cmsg_list = PyList_New(0)) == NULL)
3255 goto err_closefds;
3256 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3257 implementations didn't do so. */
3258 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3259 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3260 PyObject *bytes, *tuple;
3261 int tmp;
3262
3263 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3264 if (cmsg_status != 0) {
3265 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3266 "received malformed or improperly-truncated "
3267 "ancillary data", 1) == -1)
3268 goto err_closefds;
3269 }
3270 if (cmsg_status < 0)
3271 break;
3272 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003273 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003274 goto err_closefds;
3275 }
3276
3277 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3278 cmsgdatalen);
3279 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3280 (int)cmsgh->cmsg_type, bytes);
3281 if (tuple == NULL)
3282 goto err_closefds;
3283 tmp = PyList_Append(cmsg_list, tuple);
3284 Py_DECREF(tuple);
3285 if (tmp != 0)
3286 goto err_closefds;
3287
3288 if (cmsg_status != 0)
3289 break;
3290 }
3291
3292 retval = Py_BuildValue("NOiN",
Victor Stinner31bf2d52015-04-01 21:57:09 +02003293 (*makeval)(ctx.result, makeval_data),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003294 cmsg_list,
3295 (int)msg.msg_flags,
3296 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3297 ((msg.msg_namelen > addrbuflen) ?
3298 addrbuflen : msg.msg_namelen),
3299 s->sock_proto));
3300 if (retval == NULL)
3301 goto err_closefds;
3302
3303finally:
3304 Py_XDECREF(cmsg_list);
3305 PyMem_Free(controlbuf);
3306 return retval;
3307
3308err_closefds:
3309#ifdef SCM_RIGHTS
3310 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3311 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3312 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3313 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3314 if (cmsg_status < 0)
3315 break;
3316 if (cmsgh->cmsg_level == SOL_SOCKET &&
3317 cmsgh->cmsg_type == SCM_RIGHTS) {
3318 size_t numfds;
3319 int *fdp;
3320
3321 numfds = cmsgdatalen / sizeof(int);
3322 fdp = (int *)CMSG_DATA(cmsgh);
3323 while (numfds-- > 0)
3324 close(*fdp++);
3325 }
3326 if (cmsg_status != 0)
3327 break;
3328 }
3329#endif /* SCM_RIGHTS */
3330 goto finally;
3331}
3332
3333
3334static PyObject *
3335makeval_recvmsg(ssize_t received, void *data)
3336{
3337 PyObject **buf = data;
3338
3339 if (received < PyBytes_GET_SIZE(*buf))
3340 _PyBytes_Resize(buf, received);
3341 Py_XINCREF(*buf);
3342 return *buf;
3343}
3344
3345/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3346
3347static PyObject *
3348sock_recvmsg(PySocketSockObject *s, PyObject *args)
3349{
3350 Py_ssize_t bufsize, ancbufsize = 0;
3351 int flags = 0;
3352 struct iovec iov;
3353 PyObject *buf = NULL, *retval = NULL;
3354
3355 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3356 return NULL;
3357
3358 if (bufsize < 0) {
3359 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3360 return NULL;
3361 }
3362 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3363 return NULL;
3364 iov.iov_base = PyBytes_AS_STRING(buf);
3365 iov.iov_len = bufsize;
3366
3367 /* Note that we're passing a pointer to *our pointer* to the bytes
3368 object here (&buf); makeval_recvmsg() may incref the object, or
3369 deallocate it and set our pointer to NULL. */
3370 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3371 &makeval_recvmsg, &buf);
3372 Py_XDECREF(buf);
3373 return retval;
3374}
3375
3376PyDoc_STRVAR(recvmsg_doc,
3377"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3378\n\
3379Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3380socket. The ancbufsize argument sets the size in bytes of the\n\
3381internal buffer used to receive the ancillary data; it defaults to 0,\n\
3382meaning that no ancillary data will be received. Appropriate buffer\n\
3383sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3384CMSG_LEN(), and items which do not fit into the buffer might be\n\
3385truncated or discarded. The flags argument defaults to 0 and has the\n\
3386same meaning as for recv().\n\
3387\n\
3388The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3389The data item is a bytes object holding the non-ancillary data\n\
3390received. The ancdata item is a list of zero or more tuples\n\
3391(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3392(control messages) received: cmsg_level and cmsg_type are integers\n\
3393specifying the protocol level and protocol-specific type respectively,\n\
3394and cmsg_data is a bytes object holding the associated data. The\n\
3395msg_flags item is the bitwise OR of various flags indicating\n\
3396conditions on the received message; see your system documentation for\n\
3397details. If the receiving socket is unconnected, address is the\n\
3398address of the sending socket, if available; otherwise, its value is\n\
3399unspecified.\n\
3400\n\
3401If recvmsg() raises an exception after the system call returns, it\n\
3402will first attempt to close any file descriptors received via the\n\
3403SCM_RIGHTS mechanism.");
3404
3405
3406static PyObject *
3407makeval_recvmsg_into(ssize_t received, void *data)
3408{
3409 return PyLong_FromSsize_t(received);
3410}
3411
3412/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3413
3414static PyObject *
3415sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3416{
3417 Py_ssize_t ancbufsize = 0;
3418 int flags = 0;
3419 struct iovec *iovs = NULL;
3420 Py_ssize_t i, nitems, nbufs = 0;
3421 Py_buffer *bufs = NULL;
3422 PyObject *buffers_arg, *fast, *retval = NULL;
3423
3424 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3425 &buffers_arg, &ancbufsize, &flags))
3426 return NULL;
3427
3428 if ((fast = PySequence_Fast(buffers_arg,
3429 "recvmsg_into() argument 1 must be an "
3430 "iterable")) == NULL)
3431 return NULL;
3432 nitems = PySequence_Fast_GET_SIZE(fast);
3433 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003434 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003435 goto finally;
3436 }
3437
3438 /* Fill in an iovec for each item, and save the Py_buffer
3439 structs to release afterwards. */
3440 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3441 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3442 PyErr_NoMemory();
3443 goto finally;
3444 }
3445 for (; nbufs < nitems; nbufs++) {
3446 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3447 "w*;recvmsg_into() argument 1 must be an iterable "
3448 "of single-segment read-write buffers",
3449 &bufs[nbufs]))
3450 goto finally;
3451 iovs[nbufs].iov_base = bufs[nbufs].buf;
3452 iovs[nbufs].iov_len = bufs[nbufs].len;
3453 }
3454
3455 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3456 &makeval_recvmsg_into, NULL);
3457finally:
3458 for (i = 0; i < nbufs; i++)
3459 PyBuffer_Release(&bufs[i]);
3460 PyMem_Free(bufs);
3461 PyMem_Free(iovs);
3462 Py_DECREF(fast);
3463 return retval;
3464}
3465
3466PyDoc_STRVAR(recvmsg_into_doc,
3467"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3468\n\
3469Receive normal data and ancillary data from the socket, scattering the\n\
3470non-ancillary data into a series of buffers. The buffers argument\n\
3471must be an iterable of objects that export writable buffers\n\
3472(e.g. bytearray objects); these will be filled with successive chunks\n\
3473of the non-ancillary data until it has all been written or there are\n\
3474no more buffers. The ancbufsize argument sets the size in bytes of\n\
3475the internal buffer used to receive the ancillary data; it defaults to\n\
34760, meaning that no ancillary data will be received. Appropriate\n\
3477buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3478or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3479truncated or discarded. The flags argument defaults to 0 and has the\n\
3480same meaning as for recv().\n\
3481\n\
3482The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3483The nbytes item is the total number of bytes of non-ancillary data\n\
3484written into the buffers. The ancdata item is a list of zero or more\n\
3485tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3486data (control messages) received: cmsg_level and cmsg_type are\n\
3487integers specifying the protocol level and protocol-specific type\n\
3488respectively, and cmsg_data is a bytes object holding the associated\n\
3489data. The msg_flags item is the bitwise OR of various flags\n\
3490indicating conditions on the received message; see your system\n\
3491documentation for details. If the receiving socket is unconnected,\n\
3492address is the address of the sending socket, if available; otherwise,\n\
3493its value is unspecified.\n\
3494\n\
3495If recvmsg_into() raises an exception after the system call returns,\n\
3496it will first attempt to close any file descriptors received via the\n\
3497SCM_RIGHTS mechanism.");
3498#endif /* CMSG_LEN */
3499
3500
Victor Stinner31bf2d52015-04-01 21:57:09 +02003501struct sock_send {
3502 char *buf;
3503 Py_ssize_t len;
3504 int flags;
3505 Py_ssize_t result;
3506};
3507
3508static int
3509sock_send_impl(PySocketSockObject *s, void *data)
3510{
3511 struct sock_send *ctx = data;
3512
3513#ifdef MS_WINDOWS
3514 if (ctx->len > INT_MAX)
3515 ctx->len = INT_MAX;
3516 ctx->result = send(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags);
3517#else
3518 ctx->result = send(s->sock_fd, ctx->buf, ctx->len, ctx->flags);
3519#endif
3520 return (ctx->result >= 0);
3521}
3522
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003523/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003524
Guido van Rossum73624e91994-10-10 17:59:00 +00003525static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003526sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003527{
Victor Stinner31bf2d52015-04-01 21:57:09 +02003528 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003529 Py_buffer pbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003530 struct sock_send ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003531
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3533 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003534
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003535 if (!IS_SELECTABLE(s)) {
3536 PyBuffer_Release(&pbuf);
3537 return select_error();
3538 }
Victor Stinner31bf2d52015-04-01 21:57:09 +02003539 ctx.buf = pbuf.buf;
3540 ctx.len = pbuf.len;
3541 ctx.flags = flags;
3542 if (sock_call(s, 1, sock_send_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003543 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003544 return NULL;
3545 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003546 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003547
3548 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003549}
3550
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003551PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003552"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003553\n\
3554Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003555argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003556sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003557
3558
3559/* s.sendall(data [,flags]) method */
3560
3561static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003562sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003563{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003564 char *buf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003565 Py_ssize_t len, n;
3566 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003567 Py_buffer pbuf;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003568 struct sock_send ctx;
Victor Stinner8912d142015-04-06 23:16:34 +02003569 int has_timeout = (s->sock_timeout > 0);
3570 _PyTime_t interval = s->sock_timeout;
3571 _PyTime_t deadline = 0;
3572 int deadline_initialized = 0;
3573 PyObject *res = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003575 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3576 return NULL;
3577 buf = pbuf.buf;
3578 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003580 if (!IS_SELECTABLE(s)) {
3581 PyBuffer_Release(&pbuf);
3582 return select_error();
3583 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003585 do {
Victor Stinner8912d142015-04-06 23:16:34 +02003586 if (has_timeout) {
3587 if (deadline_initialized) {
3588 /* recompute the timeout */
3589 interval = deadline - _PyTime_GetMonotonicClock();
3590 }
3591 else {
3592 deadline_initialized = 1;
3593 deadline = _PyTime_GetMonotonicClock() + s->sock_timeout;
3594 }
3595
3596 if (interval <= 0) {
3597 PyErr_SetString(socket_timeout, "timed out");
3598 goto done;
3599 }
3600 }
3601
Victor Stinner02f32ab2015-04-01 22:53:26 +02003602 ctx.buf = buf;
3603 ctx.len = len;
3604 ctx.flags = flags;
Victor Stinner8912d142015-04-06 23:16:34 +02003605 if (sock_call_ex(s, 1, sock_send_impl, &ctx, 0, NULL, interval) < 0)
3606 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003607 n = ctx.result;
3608 assert(n >= 0);
3609
3610 buf += n;
3611 len -= n;
3612
3613 /* We must run our signal handlers before looping again.
3614 send() can return a successful partial write when it is
3615 interrupted, so we can't restrict ourselves to EINTR. */
Victor Stinner8912d142015-04-06 23:16:34 +02003616 if (PyErr_CheckSignals())
3617 goto done;
Victor Stinner02f32ab2015-04-01 22:53:26 +02003618 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003619 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003620
Victor Stinner8912d142015-04-06 23:16:34 +02003621 Py_INCREF(Py_None);
3622 res = Py_None;
3623
3624done:
3625 PyBuffer_Release(&pbuf);
3626 return res;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003627}
3628
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003629PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003630"sendall(data[, flags])\n\
3631\n\
3632Send a data string to the socket. For the optional flags\n\
3633argument, see the Unix manual. This calls send() repeatedly\n\
3634until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003635to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003636
Guido van Rossum30a685f1991-06-27 15:51:29 +00003637
Victor Stinner31bf2d52015-04-01 21:57:09 +02003638struct sock_sendto {
3639 char *buf;
3640 Py_ssize_t len;
3641 int flags;
3642 int addrlen;
3643 sock_addr_t *addrbuf;
3644 Py_ssize_t result;
3645};
3646
3647static int
3648sock_sendto_impl(PySocketSockObject *s, void *data)
3649{
3650 struct sock_sendto *ctx = data;
3651
3652#ifdef MS_WINDOWS
3653 if (ctx->len > INT_MAX)
3654 ctx->len = INT_MAX;
3655 ctx->result = sendto(s->sock_fd, ctx->buf, (int)ctx->len, ctx->flags,
3656 SAS2SA(ctx->addrbuf), ctx->addrlen);
3657#else
3658 ctx->result = sendto(s->sock_fd, ctx->buf, ctx->len, ctx->flags,
3659 SAS2SA(ctx->addrbuf), ctx->addrlen);
3660#endif
3661 return (ctx->result >= 0);
3662}
3663
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003664/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003665
Guido van Rossum73624e91994-10-10 17:59:00 +00003666static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003667sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003669 Py_buffer pbuf;
3670 PyObject *addro;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003671 Py_ssize_t arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 sock_addr_t addrbuf;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003673 int addrlen, flags;
3674 struct sock_sendto ctx;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003675
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003677 arglen = PyTuple_Size(args);
3678 switch (arglen) {
3679 case 2:
3680 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3681 break;
3682 case 3:
3683 PyArg_ParseTuple(args, "y*iO:sendto",
3684 &pbuf, &flags, &addro);
3685 break;
3686 default:
3687 PyErr_Format(PyExc_TypeError,
3688 "sendto() takes 2 or 3 arguments (%d given)",
3689 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003690 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003691 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003692 if (PyErr_Occurred())
3693 return NULL;
3694
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003695 if (!IS_SELECTABLE(s)) {
3696 PyBuffer_Release(&pbuf);
3697 return select_error();
3698 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003700 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3701 PyBuffer_Release(&pbuf);
3702 return NULL;
3703 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003704
Victor Stinner31bf2d52015-04-01 21:57:09 +02003705 ctx.buf = pbuf.buf;
3706 ctx.len = pbuf.len;
3707 ctx.flags = flags;
3708 ctx.addrlen = addrlen;
3709 ctx.addrbuf = &addrbuf;
3710 if (sock_call(s, 1, sock_sendto_impl, &ctx) < 0) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003711 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003712 return NULL;
3713 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003714 PyBuffer_Release(&pbuf);
Victor Stinner31bf2d52015-04-01 21:57:09 +02003715
3716 return PyLong_FromSsize_t(ctx.result);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003717}
3718
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003719PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003720"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003721\n\
3722Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003723For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003724
Guido van Rossum30a685f1991-06-27 15:51:29 +00003725
Victor Stinner35bee932015-04-02 12:28:07 +02003726/* The sendmsg() and recvmsg[_into]() methods require a working
3727 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3728#ifdef CMSG_LEN
Victor Stinner31bf2d52015-04-01 21:57:09 +02003729struct sock_sendmsg {
3730 struct msghdr *msg;
3731 int flags;
3732 ssize_t result;
3733};
3734
3735static int
3736sock_sendmsg_impl(PySocketSockObject *s, void *data)
3737{
3738 struct sock_sendmsg *ctx = data;
3739
3740 ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags);
3741 return (ctx->result >= 0);
3742}
3743
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003744/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3745
3746static PyObject *
3747sock_sendmsg(PySocketSockObject *s, PyObject *args)
3748{
3749 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3750 Py_buffer *databufs = NULL;
3751 struct iovec *iovs = NULL;
3752 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003753 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003754 struct cmsginfo {
3755 int level;
3756 int type;
3757 Py_buffer data;
3758 } *cmsgs = NULL;
3759 void *controlbuf = NULL;
3760 size_t controllen, controllen_last;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003761 int addrlen, flags = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003762 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3763 *cmsg_fast = NULL, *retval = NULL;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003764 struct sock_sendmsg ctx;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003765
3766 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3767 &data_arg, &cmsg_arg, &flags, &addr_arg))
3768 return NULL;
3769
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003770 /* Parse destination address. */
3771 if (addr_arg != NULL && addr_arg != Py_None) {
3772 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3773 goto finally;
3774 msg.msg_name = &addrbuf;
3775 msg.msg_namelen = addrlen;
3776 }
3777
3778 /* Fill in an iovec for each message part, and save the Py_buffer
3779 structs to release afterwards. */
3780 if ((data_fast = PySequence_Fast(data_arg,
3781 "sendmsg() argument 1 must be an "
3782 "iterable")) == NULL)
3783 goto finally;
3784 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3785 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003786 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003787 goto finally;
3788 }
3789 msg.msg_iovlen = ndataparts;
3790 if (ndataparts > 0 &&
3791 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3792 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3793 PyErr_NoMemory();
3794 goto finally;
3795 }
3796 for (; ndatabufs < ndataparts; ndatabufs++) {
3797 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3798 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003799 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003800 &databufs[ndatabufs]))
3801 goto finally;
3802 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3803 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3804 }
3805
3806 if (cmsg_arg == NULL)
3807 ncmsgs = 0;
3808 else {
3809 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3810 "sendmsg() argument 2 must be an "
3811 "iterable")) == NULL)
3812 goto finally;
3813 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3814 }
3815
3816#ifndef CMSG_SPACE
3817 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003818 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003819 "sending multiple control messages is not supported "
3820 "on this system");
3821 goto finally;
3822 }
3823#endif
3824 /* Save level, type and Py_buffer for each control message,
3825 and calculate total size. */
3826 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3827 PyErr_NoMemory();
3828 goto finally;
3829 }
3830 controllen = controllen_last = 0;
3831 while (ncmsgbufs < ncmsgs) {
3832 size_t bufsize, space;
3833
3834 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3835 "(iiy*):[sendmsg() ancillary data items]",
3836 &cmsgs[ncmsgbufs].level,
3837 &cmsgs[ncmsgbufs].type,
3838 &cmsgs[ncmsgbufs].data))
3839 goto finally;
3840 bufsize = cmsgs[ncmsgbufs++].data.len;
3841
3842#ifdef CMSG_SPACE
3843 if (!get_CMSG_SPACE(bufsize, &space)) {
3844#else
3845 if (!get_CMSG_LEN(bufsize, &space)) {
3846#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003847 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003848 goto finally;
3849 }
3850 controllen += space;
3851 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003852 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003853 goto finally;
3854 }
3855 controllen_last = controllen;
3856 }
3857
3858 /* Construct ancillary data block from control message info. */
3859 if (ncmsgbufs > 0) {
3860 struct cmsghdr *cmsgh = NULL;
3861
3862 if ((msg.msg_control = controlbuf =
3863 PyMem_Malloc(controllen)) == NULL) {
3864 PyErr_NoMemory();
3865 goto finally;
3866 }
3867 msg.msg_controllen = controllen;
3868
3869 /* Need to zero out the buffer as a workaround for glibc's
3870 CMSG_NXTHDR() implementation. After getting the pointer to
3871 the next header, it checks its (uninitialized) cmsg_len
3872 member to see if the "message" fits in the buffer, and
3873 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003874 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003875 memset(controlbuf, 0, controllen);
3876
3877 for (i = 0; i < ncmsgbufs; i++) {
3878 size_t msg_len, data_len = cmsgs[i].data.len;
3879 int enough_space = 0;
3880
3881 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3882 if (cmsgh == NULL) {
3883 PyErr_Format(PyExc_RuntimeError,
3884 "unexpected NULL result from %s()",
3885 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3886 goto finally;
3887 }
3888 if (!get_CMSG_LEN(data_len, &msg_len)) {
3889 PyErr_SetString(PyExc_RuntimeError,
3890 "item size out of range for CMSG_LEN()");
3891 goto finally;
3892 }
3893 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3894 size_t space;
3895
3896 cmsgh->cmsg_len = msg_len;
3897 if (get_cmsg_data_space(&msg, cmsgh, &space))
3898 enough_space = (space >= data_len);
3899 }
3900 if (!enough_space) {
3901 PyErr_SetString(PyExc_RuntimeError,
3902 "ancillary data does not fit in calculated "
3903 "space");
3904 goto finally;
3905 }
3906 cmsgh->cmsg_level = cmsgs[i].level;
3907 cmsgh->cmsg_type = cmsgs[i].type;
3908 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3909 }
3910 }
3911
3912 /* Make the system call. */
3913 if (!IS_SELECTABLE(s)) {
3914 select_error();
3915 goto finally;
3916 }
3917
Victor Stinner31bf2d52015-04-01 21:57:09 +02003918 ctx.msg = &msg;
3919 ctx.flags = flags;
3920 if (sock_call(s, 1, sock_sendmsg_impl, &ctx) < 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003921 goto finally;
Victor Stinner31bf2d52015-04-01 21:57:09 +02003922
3923 retval = PyLong_FromSsize_t(ctx.result);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003924
3925finally:
3926 PyMem_Free(controlbuf);
3927 for (i = 0; i < ncmsgbufs; i++)
3928 PyBuffer_Release(&cmsgs[i].data);
3929 PyMem_Free(cmsgs);
3930 Py_XDECREF(cmsg_fast);
3931 for (i = 0; i < ndatabufs; i++)
3932 PyBuffer_Release(&databufs[i]);
3933 PyMem_Free(databufs);
3934 PyMem_Free(iovs);
3935 Py_XDECREF(data_fast);
3936 return retval;
3937}
3938
3939PyDoc_STRVAR(sendmsg_doc,
3940"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3941\n\
3942Send normal and ancillary data to the socket, gathering the\n\
3943non-ancillary data from a series of buffers and concatenating it into\n\
3944a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003945data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003946The ancdata argument specifies the ancillary data (control messages)\n\
3947as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3948cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3949protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003950is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003951argument defaults to 0 and has the same meaning as for send(). If\n\
3952address is supplied and not None, it sets a destination address for\n\
3953the message. The return value is the number of bytes of non-ancillary\n\
3954data sent.");
3955#endif /* CMSG_LEN */
3956
3957
Guido van Rossum30a685f1991-06-27 15:51:29 +00003958/* s.shutdown(how) method */
3959
Guido van Rossum73624e91994-10-10 17:59:00 +00003960static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003961sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003963 int how;
3964 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003965
Serhiy Storchaka78980432013-01-15 01:12:17 +02003966 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 if (how == -1 && PyErr_Occurred())
3968 return NULL;
3969 Py_BEGIN_ALLOW_THREADS
3970 res = shutdown(s->sock_fd, how);
3971 Py_END_ALLOW_THREADS
3972 if (res < 0)
3973 return s->errorhandler();
3974 Py_INCREF(Py_None);
3975 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003976}
3977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003978PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003979"shutdown(flag)\n\
3980\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003981Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3982of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003983
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003984#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003985static PyObject*
3986sock_ioctl(PySocketSockObject *s, PyObject *arg)
3987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003988 unsigned long cmd = SIO_RCVALL;
3989 PyObject *argO;
3990 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003992 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3993 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003995 switch (cmd) {
3996 case SIO_RCVALL: {
3997 unsigned int option = RCVALL_ON;
3998 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3999 return NULL;
4000 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
4001 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4002 return set_error();
4003 }
4004 return PyLong_FromUnsignedLong(recv); }
4005 case SIO_KEEPALIVE_VALS: {
4006 struct tcp_keepalive ka;
4007 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
4008 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
4009 return NULL;
4010 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
4011 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
4012 return set_error();
4013 }
4014 return PyLong_FromUnsignedLong(recv); }
4015 default:
4016 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
4017 return NULL;
4018 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00004019}
4020PyDoc_STRVAR(sock_ioctl_doc,
4021"ioctl(cmd, option) -> long\n\
4022\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00004023Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
4024SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
4025SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004026#endif
4027
4028#if defined(MS_WINDOWS)
4029static PyObject*
4030sock_share(PySocketSockObject *s, PyObject *arg)
4031{
4032 WSAPROTOCOL_INFO info;
4033 DWORD processId;
4034 int result;
4035
4036 if (!PyArg_ParseTuple(arg, "I", &processId))
4037 return NULL;
4038
4039 Py_BEGIN_ALLOW_THREADS
4040 result = WSADuplicateSocket(s->sock_fd, processId, &info);
4041 Py_END_ALLOW_THREADS
4042 if (result == SOCKET_ERROR)
4043 return set_error();
4044 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
4045}
4046PyDoc_STRVAR(sock_share_doc,
4047"share(process_id) -> bytes\n\
4048\n\
4049Share the socket with another process. The target process id\n\
4050must be provided and the resulting bytes object passed to the target\n\
4051process. There the shared socket can be instantiated by calling\n\
4052socket.fromshare().");
4053
Christian Heimesfaf2f632008-01-06 16:59:19 +00004054
4055#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00004056
4057/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004058
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004059static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004060 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
4061 accept_doc},
4062 {"bind", (PyCFunction)sock_bind, METH_O,
4063 bind_doc},
4064 {"close", (PyCFunction)sock_close, METH_NOARGS,
4065 close_doc},
4066 {"connect", (PyCFunction)sock_connect, METH_O,
4067 connect_doc},
4068 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
4069 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00004070 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
4071 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
4073 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004074#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004075 {"getpeername", (PyCFunction)sock_getpeername,
4076 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00004077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004078 {"getsockname", (PyCFunction)sock_getsockname,
4079 METH_NOARGS, getsockname_doc},
4080 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
4081 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00004082#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004083 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
4084 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00004085#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004086#if defined(MS_WINDOWS)
4087 {"share", (PyCFunction)sock_share, METH_VARARGS,
4088 sock_share_doc},
4089#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01004090 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004091 listen_doc},
4092 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
4093 recv_doc},
4094 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
4095 recv_into_doc},
4096 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
4097 recvfrom_doc},
4098 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
4099 recvfrom_into_doc},
4100 {"send", (PyCFunction)sock_send, METH_VARARGS,
4101 send_doc},
4102 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
4103 sendall_doc},
4104 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
4105 sendto_doc},
4106 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
4107 setblocking_doc},
4108 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
4109 settimeout_doc},
4110 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
4111 gettimeout_doc},
4112 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
4113 setsockopt_doc},
4114 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
4115 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004116#ifdef CMSG_LEN
4117 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4118 recvmsg_doc},
4119 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4120 recvmsg_into_doc,},
4121 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4122 sendmsg_doc},
4123#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004125};
4126
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004127/* SockObject members */
4128static PyMemberDef sock_memberlist[] = {
4129 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4130 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4131 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004132 {0},
4133};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004134
Victor Stinner71694d52015-03-28 01:18:54 +01004135static PyGetSetDef sock_getsetlist[] = {
4136 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4137 {NULL} /* sentinel */
4138};
4139
Guido van Rossum73624e91994-10-10 17:59:00 +00004140/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004141 First close the file description. */
4142
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004143static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004144sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004145{
Antoine Pitroue033e062010-10-29 10:38:18 +00004146 if (s->sock_fd != -1) {
4147 PyObject *exc, *val, *tb;
4148 Py_ssize_t old_refcount = Py_REFCNT(s);
4149 ++Py_REFCNT(s);
4150 PyErr_Fetch(&exc, &val, &tb);
4151 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4152 "unclosed %R", s))
4153 /* Spurious errors can appear at shutdown */
4154 if (PyErr_ExceptionMatches(PyExc_Warning))
4155 PyErr_WriteUnraisable((PyObject *) s);
4156 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004157 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004158 Py_REFCNT(s) = old_refcount;
4159 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004160 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004161}
4162
Guido van Rossum30a685f1991-06-27 15:51:29 +00004163
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004164static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004165sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004166{
Victor Stinnere254e532014-07-26 14:36:55 +02004167 long sock_fd;
4168 /* On Windows, this test is needed because SOCKET_T is unsigned */
4169 if (s->sock_fd == INVALID_SOCKET) {
4170 sock_fd = -1;
4171 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004172#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004173 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 /* this can occur on Win64, and actually there is a special
4175 ugly printf formatter for decimal pointer length integer
4176 printing, only bother if necessary*/
4177 PyErr_SetString(PyExc_OverflowError,
4178 "no printf formatter to display "
4179 "the socket descriptor in decimal");
4180 return NULL;
4181 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004182#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004183 else
4184 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004185 return PyUnicode_FromFormat(
4186 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004187 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004188 s->sock_type,
4189 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004190}
4191
4192
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004193/* Create a new, uninitialized socket object. */
4194
4195static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004196sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004197{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004198 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 new = type->tp_alloc(type, 0);
4201 if (new != NULL) {
4202 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner9001d802015-04-06 23:06:01 +02004203 ((PySocketSockObject *)new)->sock_timeout = _PyTime_FromSeconds(-1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004204 ((PySocketSockObject *)new)->errorhandler = &set_error;
4205 }
4206 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004207}
4208
4209
4210/* Initialize a new socket object. */
4211
Victor Stinnerdaf45552013-08-28 00:53:59 +02004212#ifdef SOCK_CLOEXEC
4213/* socket() and socketpair() fail with EINVAL on Linux kernel older
4214 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4215static int sock_cloexec_works = -1;
4216#endif
4217
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004218/*ARGSUSED*/
4219static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004220sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004221{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004222 PySocketSockObject *s = (PySocketSockObject *)self;
4223 PyObject *fdobj = NULL;
4224 SOCKET_T fd = INVALID_SOCKET;
4225 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4226 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004227#ifndef MS_WINDOWS
4228#ifdef SOCK_CLOEXEC
4229 int *atomic_flag_works = &sock_cloexec_works;
4230#else
4231 int *atomic_flag_works = NULL;
4232#endif
4233#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004235 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4236 "|iiiO:socket", keywords,
4237 &family, &type, &proto, &fdobj))
4238 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004240 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004241#ifdef MS_WINDOWS
4242 /* recreate a socket that was duplicated */
4243 if (PyBytes_Check(fdobj)) {
4244 WSAPROTOCOL_INFO info;
4245 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4246 PyErr_Format(PyExc_ValueError,
4247 "socket descriptor string has wrong size, "
4248 "should be %zu bytes.", sizeof(info));
4249 return -1;
4250 }
4251 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4252 Py_BEGIN_ALLOW_THREADS
4253 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4254 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4255 Py_END_ALLOW_THREADS
4256 if (fd == INVALID_SOCKET) {
4257 set_error();
4258 return -1;
4259 }
4260 family = info.iAddressFamily;
4261 type = info.iSocketType;
4262 proto = info.iProtocol;
4263 }
4264 else
4265#endif
4266 {
4267 fd = PyLong_AsSocket_t(fdobj);
4268 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4269 return -1;
4270 if (fd == INVALID_SOCKET) {
4271 PyErr_SetString(PyExc_ValueError,
4272 "can't use invalid socket value");
4273 return -1;
4274 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004275 }
4276 }
4277 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004278#ifdef MS_WINDOWS
4279 /* Windows implementation */
4280#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4281#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4282#endif
4283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004285 if (support_wsa_no_inherit) {
4286 fd = WSASocket(family, type, proto,
4287 NULL, 0,
4288 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4289 if (fd == INVALID_SOCKET) {
4290 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4291 support_wsa_no_inherit = 0;
4292 fd = socket(family, type, proto);
4293 }
4294 }
4295 else {
4296 fd = socket(family, type, proto);
4297 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004298 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004299
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 if (fd == INVALID_SOCKET) {
4301 set_error();
4302 return -1;
4303 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004304
4305 if (!support_wsa_no_inherit) {
4306 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4307 closesocket(fd);
4308 PyErr_SetFromWindowsErr(0);
4309 return -1;
4310 }
4311 }
4312#else
4313 /* UNIX */
4314 Py_BEGIN_ALLOW_THREADS
4315#ifdef SOCK_CLOEXEC
4316 if (sock_cloexec_works != 0) {
4317 fd = socket(family, type | SOCK_CLOEXEC, proto);
4318 if (sock_cloexec_works == -1) {
4319 if (fd >= 0) {
4320 sock_cloexec_works = 1;
4321 }
4322 else if (errno == EINVAL) {
4323 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4324 sock_cloexec_works = 0;
4325 fd = socket(family, type, proto);
4326 }
4327 }
4328 }
4329 else
4330#endif
4331 {
4332 fd = socket(family, type, proto);
4333 }
4334 Py_END_ALLOW_THREADS
4335
4336 if (fd == INVALID_SOCKET) {
4337 set_error();
4338 return -1;
4339 }
4340
4341 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4342 SOCKETCLOSE(fd);
4343 return -1;
4344 }
4345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004346 }
4347 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004348
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004350
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004351}
4352
4353
Guido van Rossumb6775db1994-08-01 11:34:53 +00004354/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004355
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004356static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004357 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4358 "_socket.socket", /* tp_name */
4359 sizeof(PySocketSockObject), /* tp_basicsize */
4360 0, /* tp_itemsize */
4361 (destructor)sock_dealloc, /* tp_dealloc */
4362 0, /* tp_print */
4363 0, /* tp_getattr */
4364 0, /* tp_setattr */
4365 0, /* tp_reserved */
4366 (reprfunc)sock_repr, /* tp_repr */
4367 0, /* tp_as_number */
4368 0, /* tp_as_sequence */
4369 0, /* tp_as_mapping */
4370 0, /* tp_hash */
4371 0, /* tp_call */
4372 0, /* tp_str */
4373 PyObject_GenericGetAttr, /* tp_getattro */
4374 0, /* tp_setattro */
4375 0, /* tp_as_buffer */
4376 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4377 sock_doc, /* tp_doc */
4378 0, /* tp_traverse */
4379 0, /* tp_clear */
4380 0, /* tp_richcompare */
4381 0, /* tp_weaklistoffset */
4382 0, /* tp_iter */
4383 0, /* tp_iternext */
4384 sock_methods, /* tp_methods */
4385 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004386 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 0, /* tp_base */
4388 0, /* tp_dict */
4389 0, /* tp_descr_get */
4390 0, /* tp_descr_set */
4391 0, /* tp_dictoffset */
4392 sock_initobj, /* tp_init */
4393 PyType_GenericAlloc, /* tp_alloc */
4394 sock_new, /* tp_new */
4395 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004396};
4397
Guido van Rossum30a685f1991-06-27 15:51:29 +00004398
Guido van Rossum81194471991-07-27 21:42:02 +00004399/* Python interface to gethostname(). */
4400
4401/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004402static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004403socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004404{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004405#ifdef MS_WINDOWS
4406 /* Don't use winsock's gethostname, as this returns the ANSI
4407 version of the hostname, whereas we need a Unicode string.
4408 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004409 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004410 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004411 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004412 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004413
4414 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004415 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004416
4417 if (GetLastError() != ERROR_MORE_DATA)
4418 return PyErr_SetFromWindowsErr(0);
4419
4420 if (size == 0)
4421 return PyUnicode_New(0, 0);
4422
4423 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4424 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004425 name = PyMem_New(wchar_t, size);
4426 if (!name) {
4427 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004428 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004429 }
Victor Stinner74168972011-11-17 01:11:36 +01004430 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4431 name,
4432 &size))
4433 {
4434 PyMem_Free(name);
4435 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004436 }
Victor Stinner74168972011-11-17 01:11:36 +01004437
4438 result = PyUnicode_FromWideChar(name, size);
4439 PyMem_Free(name);
4440 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004441#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004442 char buf[1024];
4443 int res;
4444 Py_BEGIN_ALLOW_THREADS
4445 res = gethostname(buf, (int) sizeof buf - 1);
4446 Py_END_ALLOW_THREADS
4447 if (res < 0)
4448 return set_error();
4449 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004450 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004451#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004452}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004454PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004455"gethostname() -> string\n\
4456\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004457Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004458
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004459#ifdef HAVE_SETHOSTNAME
4460PyDoc_STRVAR(sethostname_doc,
4461"sethostname(name)\n\n\
4462Sets the hostname to name.");
4463
4464static PyObject *
4465socket_sethostname(PyObject *self, PyObject *args)
4466{
4467 PyObject *hnobj;
4468 Py_buffer buf;
4469 int res, flag = 0;
4470
Christian Heimesd2774c72013-06-19 02:06:29 +02004471#ifdef _AIX
4472/* issue #18259, not declared in any useful header file */
4473extern int sethostname(const char *, size_t);
4474#endif
4475
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004476 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4477 PyErr_Clear();
4478 if (!PyArg_ParseTuple(args, "O&:sethostname",
4479 PyUnicode_FSConverter, &hnobj))
4480 return NULL;
4481 flag = 1;
4482 }
4483 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4484 if (!res) {
4485 res = sethostname(buf.buf, buf.len);
4486 PyBuffer_Release(&buf);
4487 }
4488 if (flag)
4489 Py_DECREF(hnobj);
4490 if (res)
4491 return set_error();
4492 Py_RETURN_NONE;
4493}
4494#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004495
Guido van Rossum30a685f1991-06-27 15:51:29 +00004496/* Python interface to gethostbyname(name). */
4497
4498/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004499static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004500socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 char *name;
4503 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004504 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004505
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004506 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004507 return NULL;
4508 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004509 goto finally;
4510 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4511finally:
4512 PyMem_Free(name);
4513 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004514}
4515
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004516PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004517"gethostbyname(host) -> address\n\
4518\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004519Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004520
4521
Victor Stinner72400302016-01-28 15:41:01 +01004522static PyObject*
4523sock_decode_hostname(const char *name)
4524{
4525#ifdef MS_WINDOWS
4526 /* Issue #26227: gethostbyaddr() returns a string encoded
4527 * to the ANSI code page */
4528 return PyUnicode_DecodeFSDefault(name);
4529#else
4530 /* Decode from UTF-8 */
4531 return PyUnicode_FromString(name);
4532#endif
4533}
4534
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004535/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4536
4537static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004538gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004539{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004540 char **pch;
4541 PyObject *rtn_tuple = (PyObject *)NULL;
4542 PyObject *name_list = (PyObject *)NULL;
4543 PyObject *addr_list = (PyObject *)NULL;
4544 PyObject *tmp;
Victor Stinner72400302016-01-28 15:41:01 +01004545 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 if (h == NULL) {
4548 /* Let's get real error message to return */
4549 set_herror(h_errno);
4550 return NULL;
4551 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004553 if (h->h_addrtype != af) {
4554 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004555 errno = EAFNOSUPPORT;
4556 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004557 return NULL;
4558 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004560 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 case AF_INET:
4563 if (alen < sizeof(struct sockaddr_in))
4564 return NULL;
4565 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004566
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004567#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 case AF_INET6:
4569 if (alen < sizeof(struct sockaddr_in6))
4570 return NULL;
4571 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004572#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004574 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004575
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 if ((name_list = PyList_New(0)) == NULL)
4577 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004579 if ((addr_list = PyList_New(0)) == NULL)
4580 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004582 /* SF #1511317: h_aliases can be NULL */
4583 if (h->h_aliases) {
4584 for (pch = h->h_aliases; *pch != NULL; pch++) {
4585 int status;
4586 tmp = PyUnicode_FromString(*pch);
4587 if (tmp == NULL)
4588 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 status = PyList_Append(name_list, tmp);
4591 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 if (status)
4594 goto err;
4595 }
4596 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004598 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4599 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004601 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004602
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 case AF_INET:
4604 {
4605 struct sockaddr_in sin;
4606 memset(&sin, 0, sizeof(sin));
4607 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004608#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4612 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004613
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 if (pch == h->h_addr_list && alen >= sizeof(sin))
4615 memcpy((char *) addr, &sin, sizeof(sin));
4616 break;
4617 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004618
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004619#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004620 case AF_INET6:
4621 {
4622 struct sockaddr_in6 sin6;
4623 memset(&sin6, 0, sizeof(sin6));
4624 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004625#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004626 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004627#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4629 tmp = makeipaddr((struct sockaddr *)&sin6,
4630 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004632 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4633 memcpy((char *) addr, &sin6, sizeof(sin6));
4634 break;
4635 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004636#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004638 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004639 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 "unsupported address family");
4641 return NULL;
4642 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004643
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004644 if (tmp == NULL)
4645 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004647 status = PyList_Append(addr_list, tmp);
4648 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004649
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004650 if (status)
4651 goto err;
4652 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004653
Victor Stinner72400302016-01-28 15:41:01 +01004654 name = sock_decode_hostname(h->h_name);
4655 if (name == NULL)
4656 goto err;
4657 rtn_tuple = Py_BuildValue("NOO", name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004658
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004659 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004660 Py_XDECREF(name_list);
4661 Py_XDECREF(addr_list);
4662 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004663}
4664
4665
4666/* Python interface to gethostbyname_ex(name). */
4667
4668/*ARGSUSED*/
4669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004670socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004672 char *name;
4673 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004674 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004675 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004676 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004677#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004679#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004680 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004681#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 char buf[16384];
4683 int buf_len = (sizeof buf) - 1;
4684 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004685#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004686#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004688#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004689#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004690
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004691 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004692 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004693 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004694 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004695 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004696#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004697#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004698 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004699 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004700#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004701 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004702#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 memset((void *) &data, '\0', sizeof(data));
4704 result = gethostbyname_r(name, &hp_allocated, &data);
4705 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004706#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004707#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004708#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004709 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004711 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004712#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004713 Py_END_ALLOW_THREADS
4714 /* Some C libraries would require addr.__ss_family instead of
4715 addr.ss_family.
4716 Therefore, we cast the sockaddr_storage into sockaddr to
4717 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004718 sa = SAS2SA(&addr);
4719 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004720 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004721#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004723#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004724finally:
4725 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004726 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004727}
4728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004729PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004730"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4731\n\
4732Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004733for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004734
4735
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004736/* Python interface to gethostbyaddr(IP). */
4737
4738/*ARGSUSED*/
4739static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004740socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004741{
Charles-François Natali8b759652011-12-23 16:44:51 +01004742 sock_addr_t addr;
4743 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004744 char *ip_num;
4745 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004746 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004747#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004748 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004749#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004750 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004751#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004752 /* glibcs up to 2.10 assume that the buf argument to
4753 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4754 does not ensure. The attribute below instructs the compiler
4755 to maintain this alignment. */
4756 char buf[16384] Py_ALIGNED(8);
4757 int buf_len = (sizeof buf) - 1;
4758 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004759#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004760#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004762#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004763#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 char *ap;
4765 int al;
4766 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004767
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004768 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 return NULL;
4770 af = AF_UNSPEC;
4771 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004772 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004773 af = sa->sa_family;
4774 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004775 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004776 switch (af) {
4777 case AF_INET:
4778 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4779 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4780 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004781#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004782 case AF_INET6:
4783 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4784 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4785 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004788 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004789 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004790 }
4791 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004792#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004793#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004794 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 &hp_allocated, buf, buf_len,
4796 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004797#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004798 h = gethostbyaddr_r(ap, al, af,
4799 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004800#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 memset((void *) &data, '\0', sizeof(data));
4802 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4803 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004804#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004805#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004806#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004807 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004808#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004809 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004810#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004811 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004812 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004813#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004814 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004815#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004816finally:
4817 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004818 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004819}
4820
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004821PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004822"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4823\n\
4824Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004825for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004826
Guido van Rossum30a685f1991-06-27 15:51:29 +00004827
4828/* Python interface to getservbyname(name).
4829 This only returns the port number, since the other info is already
4830 known or not useful (like the list of aliases). */
4831
4832/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004833static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004834socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 char *name, *proto=NULL;
4837 struct servent *sp;
4838 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4839 return NULL;
4840 Py_BEGIN_ALLOW_THREADS
4841 sp = getservbyname(name, proto);
4842 Py_END_ALLOW_THREADS
4843 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004844 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004845 return NULL;
4846 }
4847 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004848}
4849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004850PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004851"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004852\n\
4853Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004854The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4855otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004856
Guido van Rossum30a685f1991-06-27 15:51:29 +00004857
Barry Warsaw11b91a02004-06-28 00:50:43 +00004858/* Python interface to getservbyport(port).
4859 This only returns the service name, since the other info is already
4860 known or not useful (like the list of aliases). */
4861
4862/*ARGSUSED*/
4863static PyObject *
4864socket_getservbyport(PyObject *self, PyObject *args)
4865{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 int port;
4867 char *proto=NULL;
4868 struct servent *sp;
4869 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4870 return NULL;
4871 if (port < 0 || port > 0xffff) {
4872 PyErr_SetString(
4873 PyExc_OverflowError,
4874 "getservbyport: port must be 0-65535.");
4875 return NULL;
4876 }
4877 Py_BEGIN_ALLOW_THREADS
4878 sp = getservbyport(htons((short)port), proto);
4879 Py_END_ALLOW_THREADS
4880 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004881 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004882 return NULL;
4883 }
4884 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004885}
4886
4887PyDoc_STRVAR(getservbyport_doc,
4888"getservbyport(port[, protocolname]) -> string\n\
4889\n\
4890Return the service name from a port number and protocol name.\n\
4891The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4892otherwise any protocol will match.");
4893
Guido van Rossum3901d851996-12-19 16:35:04 +00004894/* Python interface to getprotobyname(name).
4895 This only returns the protocol number, since the other info is
4896 already known or not useful (like the list of aliases). */
4897
4898/*ARGSUSED*/
4899static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004900socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004901{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004902 char *name;
4903 struct protoent *sp;
4904 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4905 return NULL;
4906 Py_BEGIN_ALLOW_THREADS
4907 sp = getprotobyname(name);
4908 Py_END_ALLOW_THREADS
4909 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004910 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 return NULL;
4912 }
4913 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004914}
4915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004916PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004917"getprotobyname(name) -> integer\n\
4918\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004919Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004920
Guido van Rossum3901d851996-12-19 16:35:04 +00004921
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004922#ifndef NO_DUP
4923/* dup() function for socket fds */
4924
4925static PyObject *
4926socket_dup(PyObject *self, PyObject *fdobj)
4927{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004928 SOCKET_T fd, newfd;
4929 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004930#ifdef MS_WINDOWS
4931 WSAPROTOCOL_INFO info;
4932#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004933
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004934 fd = PyLong_AsSocket_t(fdobj);
4935 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4936 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004937
Victor Stinnerdaf45552013-08-28 00:53:59 +02004938#ifdef MS_WINDOWS
4939 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4940 return set_error();
4941
4942 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4943 FROM_PROTOCOL_INFO,
4944 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 if (newfd == INVALID_SOCKET)
4946 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004947
Victor Stinnerdaf45552013-08-28 00:53:59 +02004948 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4949 closesocket(newfd);
4950 PyErr_SetFromWindowsErr(0);
4951 return NULL;
4952 }
4953#else
4954 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4955 newfd = _Py_dup(fd);
4956 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004957 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004958#endif
4959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 newfdobj = PyLong_FromSocket_t(newfd);
4961 if (newfdobj == NULL)
4962 SOCKETCLOSE(newfd);
4963 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004964}
4965
4966PyDoc_STRVAR(dup_doc,
4967"dup(integer) -> integer\n\
4968\n\
4969Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4970sockets; on some platforms os.dup() won't work for socket file descriptors.");
4971#endif
4972
4973
Dave Cole331708b2004-08-09 04:51:41 +00004974#ifdef HAVE_SOCKETPAIR
4975/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004976 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004977 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004978
4979/*ARGSUSED*/
4980static PyObject *
4981socket_socketpair(PyObject *self, PyObject *args)
4982{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004983 PySocketSockObject *s0 = NULL, *s1 = NULL;
4984 SOCKET_T sv[2];
4985 int family, type = SOCK_STREAM, proto = 0;
4986 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004987#ifdef SOCK_CLOEXEC
4988 int *atomic_flag_works = &sock_cloexec_works;
4989#else
4990 int *atomic_flag_works = NULL;
4991#endif
4992 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004993
4994#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004996#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004997 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004998#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004999 if (!PyArg_ParseTuple(args, "|iii:socketpair",
5000 &family, &type, &proto))
5001 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02005002
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005003 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02005004 Py_BEGIN_ALLOW_THREADS
5005#ifdef SOCK_CLOEXEC
5006 if (sock_cloexec_works != 0) {
5007 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
5008 if (sock_cloexec_works == -1) {
5009 if (ret >= 0) {
5010 sock_cloexec_works = 1;
5011 }
5012 else if (errno == EINVAL) {
5013 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
5014 sock_cloexec_works = 0;
5015 ret = socketpair(family, type, proto, sv);
5016 }
5017 }
5018 }
5019 else
5020#endif
5021 {
5022 ret = socketpair(family, type, proto, sv);
5023 }
5024 Py_END_ALLOW_THREADS
5025
5026 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005027 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02005028
5029 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
5030 goto finally;
5031 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
5032 goto finally;
5033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005034 s0 = new_sockobject(sv[0], family, type, proto);
5035 if (s0 == NULL)
5036 goto finally;
5037 s1 = new_sockobject(sv[1], family, type, proto);
5038 if (s1 == NULL)
5039 goto finally;
5040 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00005041
5042finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005043 if (res == NULL) {
5044 if (s0 == NULL)
5045 SOCKETCLOSE(sv[0]);
5046 if (s1 == NULL)
5047 SOCKETCLOSE(sv[1]);
5048 }
5049 Py_XDECREF(s0);
5050 Py_XDECREF(s1);
5051 return res;
Dave Cole331708b2004-08-09 04:51:41 +00005052}
5053
5054PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005055"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00005056\n\
5057Create a pair of socket objects from the sockets returned by the platform\n\
5058socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00005059The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00005060AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00005061
5062#endif /* HAVE_SOCKETPAIR */
5063
5064
Guido van Rossum006bf911996-06-12 04:04:55 +00005065static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005066socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005067{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005070 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
5071 return NULL;
5072 }
5073 if (x1 < 0) {
5074 PyErr_SetString(PyExc_OverflowError,
5075 "can't convert negative number to unsigned long");
5076 return NULL;
5077 }
5078 x2 = (unsigned int)ntohs((unsigned short)x1);
5079 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005080}
5081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005082PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005083"ntohs(integer) -> integer\n\
5084\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005085Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005086
5087
Guido van Rossum006bf911996-06-12 04:04:55 +00005088static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005089socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005091 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005093 if (PyLong_Check(arg)) {
5094 x = PyLong_AsUnsignedLong(arg);
5095 if (x == (unsigned long) -1 && PyErr_Occurred())
5096 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005097#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 {
5099 unsigned long y;
5100 /* only want the trailing 32 bits */
5101 y = x & 0xFFFFFFFFUL;
5102 if (y ^ x)
5103 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005104 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005105 x = y;
5106 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 }
5109 else
5110 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005111 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005113 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005114}
5115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005116PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005117"ntohl(integer) -> integer\n\
5118\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005119Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005120
5121
Guido van Rossum006bf911996-06-12 04:04:55 +00005122static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005123socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00005124{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005125 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00005126
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
5128 return NULL;
5129 }
5130 if (x1 < 0) {
5131 PyErr_SetString(PyExc_OverflowError,
5132 "can't convert negative number to unsigned long");
5133 return NULL;
5134 }
5135 x2 = (unsigned int)htons((unsigned short)x1);
5136 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005137}
5138
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005139PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005140"htons(integer) -> integer\n\
5141\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005142Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005143
5144
Guido van Rossum006bf911996-06-12 04:04:55 +00005145static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005146socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005150 if (PyLong_Check(arg)) {
5151 x = PyLong_AsUnsignedLong(arg);
5152 if (x == (unsigned long) -1 && PyErr_Occurred())
5153 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005154#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 {
5156 unsigned long y;
5157 /* only want the trailing 32 bits */
5158 y = x & 0xFFFFFFFFUL;
5159 if (y ^ x)
5160 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005161 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005162 x = y;
5163 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005165 }
5166 else
5167 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005168 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 Py_TYPE(arg)->tp_name);
5170 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005171}
5172
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005173PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005174"htonl(integer) -> integer\n\
5175\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005176Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005177
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005178/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005179
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005180PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005181"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005182\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005183Convert 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 +00005184binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005185
5186static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005187socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005188{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005189#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005190 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005191#endif
5192
5193#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005194#if (SIZEOF_INT != 4)
5195#error "Not sure if in_addr_t exists and int is not 32-bits."
5196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 /* Have to use inet_addr() instead */
5198 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005199#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005202 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5203 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005204
Tim Peters1df9fdd2003-02-13 03:13:40 +00005205
5206#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005207
5208#ifdef USE_INET_ATON_WEAKLINK
5209 if (inet_aton != NULL) {
5210#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005211 if (inet_aton(ip_addr, &buf))
5212 return PyBytes_FromStringAndSize((char *)(&buf),
5213 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005214
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005215 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005216 "illegal IP address string passed to inet_aton");
5217 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005218
Thomas Wouters477c8d52006-05-27 19:21:47 +00005219#ifdef USE_INET_ATON_WEAKLINK
5220 } else {
5221#endif
5222
5223#endif
5224
5225#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005227 /* special-case this address as inet_addr might return INADDR_NONE
5228 * for this */
5229 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005230 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005231 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005233 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005235 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005236 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005237 "illegal IP address string passed to inet_aton");
5238 return NULL;
5239 }
5240 }
5241 return PyBytes_FromStringAndSize((char *) &packed_addr,
5242 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005243
5244#ifdef USE_INET_ATON_WEAKLINK
5245 }
5246#endif
5247
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005248#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005249}
5250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005251PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005252"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005253\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005254Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005255
5256static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005257socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005258{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005259 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005261
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005262 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005263 return NULL;
5264 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005265
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005266 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005267 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005268 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005269 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005270 return NULL;
5271 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005272
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005273 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5274 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005277}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005278
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005279#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005280
5281PyDoc_STRVAR(inet_pton_doc,
5282"inet_pton(af, ip) -> packed IP address string\n\
5283\n\
5284Convert an IP address from string format to a packed string suitable\n\
5285for use with low-level network functions.");
5286
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005287#endif
5288
5289#ifdef HAVE_INET_PTON
5290
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005291static PyObject *
5292socket_inet_pton(PyObject *self, PyObject *args)
5293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 int af;
5295 char* ip;
5296 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005297#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005298 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005299#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005300 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005302 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5303 return NULL;
5304 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005305
Martin v. Löwis04697e82004-06-02 12:35:29 +00005306#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005307 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005308 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005309 "can't use AF_INET6, IPv6 is disabled");
5310 return NULL;
5311 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005312#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005314 retval = inet_pton(af, ip, packed);
5315 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005316 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005317 return NULL;
5318 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005319 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 "illegal IP address string passed to inet_pton");
5321 return NULL;
5322 } else if (af == AF_INET) {
5323 return PyBytes_FromStringAndSize(packed,
5324 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005325#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005326 } else if (af == AF_INET6) {
5327 return PyBytes_FromStringAndSize(packed,
5328 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005329#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005330 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005331 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005332 return NULL;
5333 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005334}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005335#elif defined(MS_WINDOWS)
5336
5337static PyObject *
5338socket_inet_pton(PyObject *self, PyObject *args)
5339{
5340 int af;
5341 char* ip;
5342 struct sockaddr_in6 addr;
5343 INT ret, size;
5344
5345 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5346 return NULL;
5347 }
5348
Victor Stinnere990c6e2013-11-16 00:18:58 +01005349 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005350 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5351
5352 if (ret) {
5353 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5354 return NULL;
5355 } else if(af == AF_INET) {
5356 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005357 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005358 sizeof(addr4->sin_addr));
5359 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005360 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005361 sizeof(addr.sin6_addr));
5362 } else {
5363 PyErr_SetString(PyExc_OSError, "unknown address family");
5364 return NULL;
5365 }
5366}
5367
5368#endif
5369
5370#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005371
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005372PyDoc_STRVAR(inet_ntop_doc,
5373"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5374\n\
5375Convert a packed IP address of the given family to string format.");
5376
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005377#endif
5378
5379
5380#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005381static PyObject *
5382socket_inet_ntop(PyObject *self, PyObject *args)
5383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005384 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005385 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005386 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005387#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005388 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005389#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005391#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5394 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005395
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005396 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005397 return NULL;
5398 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005400 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005401 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005402 PyErr_SetString(PyExc_ValueError,
5403 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005404 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 return NULL;
5406 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005407#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005409 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005410 PyErr_SetString(PyExc_ValueError,
5411 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005412 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005413 return NULL;
5414 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005415#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005416 } else {
5417 PyErr_Format(PyExc_ValueError,
5418 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005419 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005420 return NULL;
5421 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005422
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005423 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5424 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005425 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005426 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005427 return NULL;
5428 } else {
5429 return PyUnicode_FromString(retval);
5430 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 /* NOTREACHED */
5433 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5434 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005435}
5436
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005437#elif defined(MS_WINDOWS)
5438
5439static PyObject *
5440socket_inet_ntop(PyObject *self, PyObject *args)
5441{
5442 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005443 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005444 struct sockaddr_in6 addr;
5445 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005446#ifdef ENABLE_IPV6
5447 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5448#else
5449 char ip[INET_ADDRSTRLEN + 1];
5450#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005451
5452 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5453 memset((void *) &ip[0], '\0', sizeof(ip));
5454
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005455 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005456 return NULL;
5457 }
5458
5459 if (af == AF_INET) {
5460 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5461
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005462 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005463 PyErr_SetString(PyExc_ValueError,
5464 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005465 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005466 return NULL;
5467 }
5468 memset(addr4, 0, sizeof(struct sockaddr_in));
5469 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005470 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005471 addrlen = sizeof(struct sockaddr_in);
5472 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005473 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005474 PyErr_SetString(PyExc_ValueError,
5475 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005476 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005477 return NULL;
5478 }
5479
5480 memset(&addr, 0, sizeof(addr));
5481 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005482 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005483 addrlen = sizeof(addr);
5484 } else {
5485 PyErr_Format(PyExc_ValueError,
5486 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005487 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005488 return NULL;
5489 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005490 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005491
5492 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005493 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005494 ip, &retlen);
5495
5496 if (ret) {
5497 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5498 return NULL;
5499 } else {
5500 return PyUnicode_FromString(ip);
5501 }
5502}
5503
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005504#endif /* HAVE_INET_PTON */
5505
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005506/* Python interface to getaddrinfo(host, port). */
5507
5508/*ARGSUSED*/
5509static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005510socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005511{
Victor Stinner77af1722011-05-26 14:05:59 +02005512 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005513 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005514 struct addrinfo hints, *res;
5515 struct addrinfo *res0 = NULL;
5516 PyObject *hobj = NULL;
5517 PyObject *pobj = (PyObject *)NULL;
5518 char pbuf[30];
5519 char *hptr, *pptr;
5520 int family, socktype, protocol, flags;
5521 int error;
5522 PyObject *all = (PyObject *)NULL;
5523 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005524
Georg Brandl6083a4b2013-10-14 06:51:46 +02005525 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005526 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005527 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005528 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005529 &protocol, &flags)) {
5530 return NULL;
5531 }
5532 if (hobj == Py_None) {
5533 hptr = NULL;
5534 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005535 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005536 if (!idna)
5537 return NULL;
5538 assert(PyBytes_Check(idna));
5539 hptr = PyBytes_AS_STRING(idna);
5540 } else if (PyBytes_Check(hobj)) {
5541 hptr = PyBytes_AsString(hobj);
5542 } else {
5543 PyErr_SetString(PyExc_TypeError,
5544 "getaddrinfo() argument 1 must be string or None");
5545 return NULL;
5546 }
5547 if (PyLong_CheckExact(pobj)) {
5548 long value = PyLong_AsLong(pobj);
5549 if (value == -1 && PyErr_Occurred())
5550 goto err;
5551 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5552 pptr = pbuf;
5553 } else if (PyUnicode_Check(pobj)) {
5554 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005555 if (pptr == NULL)
5556 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005557 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005558 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005559 } else if (pobj == Py_None) {
5560 pptr = (char *)NULL;
5561 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005562 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 goto err;
5564 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005565#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005566 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5567 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005568 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5569 * This workaround avoids a segfault in libsystem.
5570 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005571 pptr = "00";
5572 }
5573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005574 memset(&hints, 0, sizeof(hints));
5575 hints.ai_family = family;
5576 hints.ai_socktype = socktype;
5577 hints.ai_protocol = protocol;
5578 hints.ai_flags = flags;
5579 Py_BEGIN_ALLOW_THREADS
5580 ACQUIRE_GETADDRINFO_LOCK
5581 error = getaddrinfo(hptr, pptr, &hints, &res0);
5582 Py_END_ALLOW_THREADS
5583 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5584 if (error) {
5585 set_gaierror(error);
5586 goto err;
5587 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005588
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005589 all = PyList_New(0);
5590 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005591 goto err;
5592 for (res = res0; res; res = res->ai_next) {
5593 PyObject *single;
5594 PyObject *addr =
5595 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5596 if (addr == NULL)
5597 goto err;
5598 single = Py_BuildValue("iiisO", res->ai_family,
5599 res->ai_socktype, res->ai_protocol,
5600 res->ai_canonname ? res->ai_canonname : "",
5601 addr);
5602 Py_DECREF(addr);
5603 if (single == NULL)
5604 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005605
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005606 if (PyList_Append(all, single))
5607 goto err;
5608 Py_XDECREF(single);
5609 }
5610 Py_XDECREF(idna);
5611 if (res0)
5612 freeaddrinfo(res0);
5613 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005614 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005615 Py_XDECREF(all);
5616 Py_XDECREF(idna);
5617 if (res0)
5618 freeaddrinfo(res0);
5619 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005620}
5621
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005622PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005623"getaddrinfo(host, port [, family, type, proto, flags])\n\
5624 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005625\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005626Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005627
5628/* Python interface to getnameinfo(sa, flags). */
5629
5630/*ARGSUSED*/
5631static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005632socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005634 PyObject *sa = (PyObject *)NULL;
5635 int flags;
5636 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005637 int port;
5638 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005639 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5640 struct addrinfo hints, *res = NULL;
5641 int error;
5642 PyObject *ret = (PyObject *)NULL;
Victor Stinner72400302016-01-28 15:41:01 +01005643 PyObject *name;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005644
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005645 flags = flowinfo = scope_id = 0;
5646 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5647 return NULL;
5648 if (!PyTuple_Check(sa)) {
5649 PyErr_SetString(PyExc_TypeError,
5650 "getnameinfo() argument 1 must be a tuple");
5651 return NULL;
5652 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005653 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005654 &hostp, &port, &flowinfo, &scope_id))
5655 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005656 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005657 PyErr_SetString(PyExc_OverflowError,
5658 "getsockaddrarg: flowinfo must be 0-1048575.");
5659 return NULL;
5660 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005661 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5662 memset(&hints, 0, sizeof(hints));
5663 hints.ai_family = AF_UNSPEC;
5664 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005665 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005666 Py_BEGIN_ALLOW_THREADS
5667 ACQUIRE_GETADDRINFO_LOCK
5668 error = getaddrinfo(hostp, pbuf, &hints, &res);
5669 Py_END_ALLOW_THREADS
5670 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5671 if (error) {
5672 set_gaierror(error);
5673 goto fail;
5674 }
5675 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005676 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005677 "sockaddr resolved to multiple addresses");
5678 goto fail;
5679 }
5680 switch (res->ai_family) {
5681 case AF_INET:
5682 {
5683 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005684 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005685 "IPv4 sockaddr must be 2 tuple");
5686 goto fail;
5687 }
5688 break;
5689 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005690#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005691 case AF_INET6:
5692 {
5693 struct sockaddr_in6 *sin6;
5694 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005695 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005696 sin6->sin6_scope_id = scope_id;
5697 break;
5698 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005699#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005701 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5703 if (error) {
5704 set_gaierror(error);
5705 goto fail;
5706 }
Victor Stinner72400302016-01-28 15:41:01 +01005707
5708 name = sock_decode_hostname(hbuf);
5709 if (name == NULL)
5710 goto fail;
5711 ret = Py_BuildValue("Ns", name, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005712
5713fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005714 if (res)
5715 freeaddrinfo(res);
5716 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005717}
5718
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005719PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005720"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005721\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005722Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005723
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005724
5725/* Python API to getting and setting the default timeout value. */
5726
5727static PyObject *
5728socket_getdefaulttimeout(PyObject *self)
5729{
Victor Stinner71694d52015-03-28 01:18:54 +01005730 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005731 Py_INCREF(Py_None);
5732 return Py_None;
5733 }
Victor Stinner71694d52015-03-28 01:18:54 +01005734 else {
5735 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5736 return PyFloat_FromDouble(seconds);
5737 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005738}
5739
5740PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005741"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005742\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005743Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005744A value of None indicates that new socket objects have no timeout.\n\
5745When the socket module is first imported, the default is None.");
5746
5747static PyObject *
5748socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5749{
Victor Stinner71694d52015-03-28 01:18:54 +01005750 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005751
Victor Stinner71694d52015-03-28 01:18:54 +01005752 if (socket_parse_timeout(&timeout, arg) < 0)
5753 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005755 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005756
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005757 Py_INCREF(Py_None);
5758 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005759}
5760
5761PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005762"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005763\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005764Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005765A value of None indicates that new socket objects have no timeout.\n\
5766When the socket module is first imported, the default is None.");
5767
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005768#ifdef HAVE_IF_NAMEINDEX
5769/* Python API for getting interface indices and names */
5770
5771static PyObject *
5772socket_if_nameindex(PyObject *self, PyObject *arg)
5773{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005774 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005775 int i;
5776 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005777
Charles-François Natali60713592011-05-20 16:55:06 +02005778 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005779 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005780 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005781 return NULL;
5782 }
5783
5784 list = PyList_New(0);
5785 if (list == NULL) {
5786 if_freenameindex(ni);
5787 return NULL;
5788 }
5789
Charles-François Natali60713592011-05-20 16:55:06 +02005790 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5791 PyObject *ni_tuple = Py_BuildValue("IO&",
5792 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005793
5794 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5795 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005796 Py_DECREF(list);
5797 if_freenameindex(ni);
5798 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005799 }
5800 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005801 }
5802
5803 if_freenameindex(ni);
5804 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005805}
5806
5807PyDoc_STRVAR(if_nameindex_doc,
5808"if_nameindex()\n\
5809\n\
5810Returns a list of network interface information (index, name) tuples.");
5811
Charles-François Natali60713592011-05-20 16:55:06 +02005812static PyObject *
5813socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005814{
Charles-François Natali60713592011-05-20 16:55:06 +02005815 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005816 unsigned long index;
5817
Charles-François Natali60713592011-05-20 16:55:06 +02005818 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5819 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005820 return NULL;
5821
Charles-François Natali60713592011-05-20 16:55:06 +02005822 index = if_nametoindex(PyBytes_AS_STRING(oname));
5823 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005824 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005825 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005826 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005827 return NULL;
5828 }
5829
5830 return PyLong_FromUnsignedLong(index);
5831}
5832
5833PyDoc_STRVAR(if_nametoindex_doc,
5834"if_nametoindex(if_name)\n\
5835\n\
5836Returns the interface index corresponding to the interface name if_name.");
5837
Charles-François Natali60713592011-05-20 16:55:06 +02005838static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005839socket_if_indextoname(PyObject *self, PyObject *arg)
5840{
Charles-François Natali60713592011-05-20 16:55:06 +02005841 unsigned long index;
5842 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005843
Charles-François Natali60713592011-05-20 16:55:06 +02005844 index = PyLong_AsUnsignedLong(arg);
5845 if (index == (unsigned long) -1)
5846 return NULL;
5847
5848 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005849 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005850 return NULL;
5851 }
5852
Charles-François Natali60713592011-05-20 16:55:06 +02005853 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005854}
5855
5856PyDoc_STRVAR(if_indextoname_doc,
5857"if_indextoname(if_index)\n\
5858\n\
5859Returns the interface name corresponding to the interface index if_index.");
5860
5861#endif /* HAVE_IF_NAMEINDEX */
5862
5863
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005864#ifdef CMSG_LEN
5865/* Python interface to CMSG_LEN(length). */
5866
5867static PyObject *
5868socket_CMSG_LEN(PyObject *self, PyObject *args)
5869{
5870 Py_ssize_t length;
5871 size_t result;
5872
5873 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5874 return NULL;
5875 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5876 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5877 return NULL;
5878 }
5879 return PyLong_FromSize_t(result);
5880}
5881
5882PyDoc_STRVAR(CMSG_LEN_doc,
5883"CMSG_LEN(length) -> control message length\n\
5884\n\
5885Return the total length, without trailing padding, of an ancillary\n\
5886data item with associated data of the given length. This value can\n\
5887often be used as the buffer size for recvmsg() to receive a single\n\
5888item of ancillary data, but RFC 3542 requires portable applications to\n\
5889use CMSG_SPACE() and thus include space for padding, even when the\n\
5890item will be the last in the buffer. Raises OverflowError if length\n\
5891is outside the permissible range of values.");
5892
5893
5894#ifdef CMSG_SPACE
5895/* Python interface to CMSG_SPACE(length). */
5896
5897static PyObject *
5898socket_CMSG_SPACE(PyObject *self, PyObject *args)
5899{
5900 Py_ssize_t length;
5901 size_t result;
5902
5903 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5904 return NULL;
5905 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5906 PyErr_SetString(PyExc_OverflowError,
5907 "CMSG_SPACE() argument out of range");
5908 return NULL;
5909 }
5910 return PyLong_FromSize_t(result);
5911}
5912
5913PyDoc_STRVAR(CMSG_SPACE_doc,
5914"CMSG_SPACE(length) -> buffer size\n\
5915\n\
5916Return the buffer size needed for recvmsg() to receive an ancillary\n\
5917data item with associated data of the given length, along with any\n\
5918trailing padding. The buffer space needed to receive multiple items\n\
5919is the sum of the CMSG_SPACE() values for their associated data\n\
5920lengths. Raises OverflowError if length is outside the permissible\n\
5921range of values.");
5922#endif /* CMSG_SPACE */
5923#endif /* CMSG_LEN */
5924
5925
Guido van Rossum30a685f1991-06-27 15:51:29 +00005926/* List of functions exported by this module. */
5927
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005928static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005929 {"gethostbyname", socket_gethostbyname,
5930 METH_VARARGS, gethostbyname_doc},
5931 {"gethostbyname_ex", socket_gethostbyname_ex,
5932 METH_VARARGS, ghbn_ex_doc},
5933 {"gethostbyaddr", socket_gethostbyaddr,
5934 METH_VARARGS, gethostbyaddr_doc},
5935 {"gethostname", socket_gethostname,
5936 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005937#ifdef HAVE_SETHOSTNAME
5938 {"sethostname", socket_sethostname,
5939 METH_VARARGS, sethostname_doc},
5940#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005941 {"getservbyname", socket_getservbyname,
5942 METH_VARARGS, getservbyname_doc},
5943 {"getservbyport", socket_getservbyport,
5944 METH_VARARGS, getservbyport_doc},
5945 {"getprotobyname", socket_getprotobyname,
5946 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005947#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005948 {"dup", socket_dup,
5949 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005950#endif
Dave Cole331708b2004-08-09 04:51:41 +00005951#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005952 {"socketpair", socket_socketpair,
5953 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005954#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005955 {"ntohs", socket_ntohs,
5956 METH_VARARGS, ntohs_doc},
5957 {"ntohl", socket_ntohl,
5958 METH_O, ntohl_doc},
5959 {"htons", socket_htons,
5960 METH_VARARGS, htons_doc},
5961 {"htonl", socket_htonl,
5962 METH_O, htonl_doc},
5963 {"inet_aton", socket_inet_aton,
5964 METH_VARARGS, inet_aton_doc},
5965 {"inet_ntoa", socket_inet_ntoa,
5966 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005967#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005968 {"inet_pton", socket_inet_pton,
5969 METH_VARARGS, inet_pton_doc},
5970 {"inet_ntop", socket_inet_ntop,
5971 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005972#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005973 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5974 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 {"getnameinfo", socket_getnameinfo,
5976 METH_VARARGS, getnameinfo_doc},
5977 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5978 METH_NOARGS, getdefaulttimeout_doc},
5979 {"setdefaulttimeout", socket_setdefaulttimeout,
5980 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005981#ifdef HAVE_IF_NAMEINDEX
5982 {"if_nameindex", socket_if_nameindex,
5983 METH_NOARGS, if_nameindex_doc},
5984 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005985 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005986 {"if_indextoname", socket_if_indextoname,
5987 METH_O, if_indextoname_doc},
5988#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005989#ifdef CMSG_LEN
5990 {"CMSG_LEN", socket_CMSG_LEN,
5991 METH_VARARGS, CMSG_LEN_doc},
5992#ifdef CMSG_SPACE
5993 {"CMSG_SPACE", socket_CMSG_SPACE,
5994 METH_VARARGS, CMSG_SPACE_doc},
5995#endif
5996#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005997 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005998};
5999
Guido van Rossum30a685f1991-06-27 15:51:29 +00006000
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006001#ifdef MS_WINDOWS
6002#define OS_INIT_DEFINED
6003
6004/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006005
6006static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006007os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006009 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00006010}
6011
6012static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006013os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00006014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 WSADATA WSAData;
6016 int ret;
6017 ret = WSAStartup(0x0101, &WSAData);
6018 switch (ret) {
6019 case 0: /* No error */
6020 Py_AtExit(os_cleanup);
6021 return 1; /* Success */
6022 case WSASYSNOTREADY:
6023 PyErr_SetString(PyExc_ImportError,
6024 "WSAStartup failed: network not ready");
6025 break;
6026 case WSAVERNOTSUPPORTED:
6027 case WSAEINVAL:
6028 PyErr_SetString(
6029 PyExc_ImportError,
6030 "WSAStartup failed: requested version not supported");
6031 break;
6032 default:
6033 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
6034 break;
6035 }
6036 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006037}
6038
Guido van Rossum8d665e61996-06-26 18:22:49 +00006039#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00006040
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00006041
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006042
6043#ifndef OS_INIT_DEFINED
6044static int
6045os_init(void)
6046{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006047 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006048}
6049#endif
6050
6051
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006052/* C API table - always add new things to the end for binary
6053 compatibility. */
6054static
6055PySocketModule_APIObject PySocketModuleAPI =
6056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006058 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006059 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006060};
6061
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006062
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006063/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006064
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006065 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006066 "socket.py" which implements some additional functionality.
6067 The import of "_socket" may fail with an ImportError exception if
6068 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02006069 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00006070 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006071*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006073PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00006074"Implementation module for socket operations.\n\
6075\n\
6076See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00006077
Martin v. Löwis1a214512008-06-11 05:26:20 +00006078static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 PyModuleDef_HEAD_INIT,
6080 PySocket_MODULE_NAME,
6081 socket_doc,
6082 -1,
6083 socket_methods,
6084 NULL,
6085 NULL,
6086 NULL,
6087 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00006088};
6089
Mark Hammondfe51c6d2002-08-02 02:27:13 +00006090PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00006091PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006092{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006093 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00006094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006095 if (!os_init())
6096 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006097
Victor Stinnerdaf45552013-08-28 00:53:59 +02006098#ifdef MS_WINDOWS
6099 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08006100#if defined(_MSC_VER) && _MSC_VER >= 1800
6101 support_wsa_no_inherit = IsWindows7SP1OrGreater();
6102#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02006103 DWORD version = GetVersion();
6104 DWORD major = (DWORD)LOBYTE(LOWORD(version));
6105 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
6106 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08006107 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
6108#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02006109 }
6110#endif
6111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006112 Py_TYPE(&sock_type) = &PyType_Type;
6113 m = PyModule_Create(&socketmodule);
6114 if (m == NULL)
6115 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006116
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006117 Py_INCREF(PyExc_OSError);
6118 PySocketModuleAPI.error = PyExc_OSError;
6119 Py_INCREF(PyExc_OSError);
6120 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006121 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006122 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123 if (socket_herror == NULL)
6124 return NULL;
6125 Py_INCREF(socket_herror);
6126 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006127 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006128 NULL);
6129 if (socket_gaierror == NULL)
6130 return NULL;
6131 Py_INCREF(socket_gaierror);
6132 PyModule_AddObject(m, "gaierror", socket_gaierror);
6133 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02006134 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135 if (socket_timeout == NULL)
6136 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006137 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 Py_INCREF(socket_timeout);
6139 PyModule_AddObject(m, "timeout", socket_timeout);
6140 Py_INCREF((PyObject *)&sock_type);
6141 if (PyModule_AddObject(m, "SocketType",
6142 (PyObject *)&sock_type) != 0)
6143 return NULL;
6144 Py_INCREF((PyObject *)&sock_type);
6145 if (PyModule_AddObject(m, "socket",
6146 (PyObject *)&sock_type) != 0)
6147 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006148
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006149#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006151#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006152 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006153#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 Py_INCREF(has_ipv6);
6155 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006156
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006157 /* Export C API */
6158 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6159 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6160 ) != 0)
6161 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006163 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006164#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006165 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006166#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006168#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006169 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006170#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006171#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006173#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006174#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006175 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006176 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006177#endif
6178#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006179 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006180#endif
6181#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006183 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006184#endif
6185#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006186 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006187 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006188#endif
6189#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006190 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006191 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006192#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006193#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006194 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006195 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006196#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006197#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006198 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006200#endif
6201#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006202 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006203 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006204#endif
6205#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006206 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006207#endif
6208#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006210 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006211#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006212#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006213 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006214 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006215#endif
6216#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006217 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006218 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006219#endif
6220#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006223#endif
6224#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006225 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006226 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006227#endif
6228#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006229 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006230 PyModule_AddIntMacro(m, AF_NETLINK);
6231 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006232#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006233 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006234#endif
6235#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006236 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006237#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006238 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6239 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006240#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006241 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006242#endif
6243#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006244 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006245#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006246#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006248#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006249#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006250 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006251#endif
6252#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006253 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006254#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006255 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006256#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006257 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006258#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006259#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006260 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006261#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006262#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006263#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006264 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006265 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006266#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006267#ifdef AF_LINK
6268 PyModule_AddIntMacro(m, AF_LINK);
6269#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006270#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006272 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006273#endif
6274#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006275 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006276 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006277#endif
6278#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006281#endif
6282#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006283 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006284 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006285#endif
6286#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006287 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006289#endif
6290#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006293#endif
6294#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006295 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006296 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006297#endif
6298#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006300 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006301#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006302
Hye-Shik Chang81268602004-02-02 06:05:24 +00006303#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6305 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6306 PyModule_AddIntMacro(m, BTPROTO_HCI);
6307 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006308#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006310#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006311#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006312#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006314#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006315 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6316 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006317#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6320 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006321#endif
6322
Charles-François Natali47413c12011-10-06 19:47:44 +02006323#ifdef AF_CAN
6324 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006325 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006326#endif
6327#ifdef PF_CAN
6328 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006330#endif
6331
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006332/* Reliable Datagram Sockets */
6333#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006334 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006335#endif
6336#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006337 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006338#endif
6339
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006340/* Kernel event messages */
6341#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006342 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006343#endif
6344#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006345 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006346#endif
6347
Antoine Pitroub156a462010-10-27 20:13:57 +00006348#ifdef AF_PACKET
6349 PyModule_AddIntMacro(m, AF_PACKET);
6350#endif
6351#ifdef PF_PACKET
6352 PyModule_AddIntMacro(m, PF_PACKET);
6353#endif
6354#ifdef PACKET_HOST
6355 PyModule_AddIntMacro(m, PACKET_HOST);
6356#endif
6357#ifdef PACKET_BROADCAST
6358 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6359#endif
6360#ifdef PACKET_MULTICAST
6361 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6362#endif
6363#ifdef PACKET_OTHERHOST
6364 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6365#endif
6366#ifdef PACKET_OUTGOING
6367 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6368#endif
6369#ifdef PACKET_LOOPBACK
6370 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6371#endif
6372#ifdef PACKET_FASTROUTE
6373 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006374#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006375
Christian Heimes043d6f62008-01-07 17:19:16 +00006376#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006377 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006379 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006380 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6381 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6382 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006383
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006384 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6385 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6386 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006388 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SOL_TIPC);
6390 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6391 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6392 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6393 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006394
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006395 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6396 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6397 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6398 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006400 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006401 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6402 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006403#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006404 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006405 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006406#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006407 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6408 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6409 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6410 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6411 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6412 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006413#endif
6414
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, SOCK_STREAM);
6417 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006418/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006419 PyModule_AddIntMacro(m, SOCK_RAW);
6420 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006421#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006422 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006423#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006424#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006425 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006426#endif
6427#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006429#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006431#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006432 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006433#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006434#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006435 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006436#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006437#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006438 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006439#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006440#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006441 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006442#endif
6443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006444#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006446#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006447#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006449#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006450#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006452#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006453#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006454 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006455#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006456#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006457 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006458#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006459#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006460 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006461#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006462#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006463 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006464#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006465#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006466 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006467#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006468#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006469 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006470#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006471#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006472 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006473#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006474#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006475 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006477#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006478 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006479#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006480#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006481 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006485#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006487 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006491#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006492#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006493 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006494#endif
6495#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006497#endif
6498#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006499 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006500#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006501#ifdef SO_BINDTODEVICE
6502 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6503#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006504#ifdef SO_PRIORITY
6505 PyModule_AddIntMacro(m, SO_PRIORITY);
6506#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006507#ifdef SO_MARK
6508 PyModule_AddIntMacro(m, SO_MARK);
6509#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511 /* Maximum number of connections for "listen" */
6512#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006513 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006514#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006515 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006516#endif
6517
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006518 /* Ancilliary message types */
6519#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006520 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006521#endif
6522#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006524#endif
6525#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006527#endif
6528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006529 /* Flags for send, recv */
6530#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006531 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006532#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006534 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006535#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006536#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006537 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006538#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006539#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006540 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006542#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006543 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006544#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006545#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006546 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006547#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006548#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006549 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006556#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006558 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006559#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006560#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006561 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006562#endif
6563#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006564 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006565#endif
6566#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006567 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006568#endif
6569#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006570 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006571#endif
6572#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006573 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006574#endif
6575#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006576 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006577#endif
6578#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006579 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006580#endif
6581#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006582 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006583#endif
6584#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006585 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006586#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006587#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006589#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006591 /* Protocol level and numbers, usable for [gs]etsockopt */
6592#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006593 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006594#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006595#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006596 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006597#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006598 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006599#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006600#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006601 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006602#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006603#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006604 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006605#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006606#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006607 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006610 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006611#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006612#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006613 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006615#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006616 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006617#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006618 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006622#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006624#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006625#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006627#endif
6628#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6630 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006631#endif
6632#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6634 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6635 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006636
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006637 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6638 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6639 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006640#endif
6641#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6643 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6644 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6645 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006646#endif
Larry Hastingsa6cc5512015-04-13 17:48:40 -04006647#ifdef HAVE_LINUX_CAN_RAW_FD_FRAMES
6648 PyModule_AddIntMacro(m, CAN_RAW_FD_FRAMES);
6649#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006650#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006652 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6653 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6654 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6655 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6656 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6657 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6658 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6659 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6660 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6661 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6662 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6663 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6664#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006665#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006666 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006667#endif
6668#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006669 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006670#endif
6671#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006673#endif
6674#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006675 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006676#endif
6677#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006678 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006679#endif
6680#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006681 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006682#endif
6683#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006685#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006687 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006688#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006689 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006690#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006692 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006693#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006694#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006695 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006696#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006697 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006707#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006708#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006710#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006711#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006712 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006716#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006718#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006719#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006720 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006721#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006722#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006723 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006724#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006725#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006726 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006727#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006728 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006768#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006769#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006771#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006772#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006773 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006775#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006776 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006777#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006778#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006779 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006780#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006781#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006782 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006783#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006784#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006785 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006787#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006788 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006789#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006790#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006791 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006793#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006795#endif
6796/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006797#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006799#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006800 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006801#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006802#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006803 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006804#endif
6805
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006806#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006808#endif
6809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006810 /* Some port configuration */
6811#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006812 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006813#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006814 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006815#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006816#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006818#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006819 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006820#endif
6821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006822 /* Some reserved IP v.4 addresses */
6823#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006824 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006825#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006826 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006827#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006828#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006830#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006831 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006833#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006835#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006836 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006837#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006838#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006839 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006840#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006841 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006842#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006843#ifdef INADDR_ALLHOSTS_GROUP
6844 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6845 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006846#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006847 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006848#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006849#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006851#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006852 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006853#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006854#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006856#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006858#endif
6859
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006860 /* IPv4 [gs]etsockopt options */
6861#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006863#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006865 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006866#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006867#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006868 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006869#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006870#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006871 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006874 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006875#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006876#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006877 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006878#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006879#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006880 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006881#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006883 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006885#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006886 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006888#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006890#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006891#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006892 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006893#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006894#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006895 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006896#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006897#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006898 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006899#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006902#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006903#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006904 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006905#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006906#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006907 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006908#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006909#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006910 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006911#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006913 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6914#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006916#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006919#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006920#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006922#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006923#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006925#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006926#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006928#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006929#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006931#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006932 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006933#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006934 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006935#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006936 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006937#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006938 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006939#endif
6940#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006941 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006942#endif
6943#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006945#endif
6946#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006948#endif
6949#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006951#endif
6952#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006954#endif
6955#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006957#endif
6958#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006960#endif
6961#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006963#endif
6964#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006966#endif
6967#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006969#endif
6970#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006972#endif
6973#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006975#endif
6976#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006978#endif
6979#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006981#endif
6982#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006984#endif
6985#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006987#endif
6988#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006990#endif
6991#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006992 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006993#endif
6994#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006996#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006997
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006998 /* TCP options */
6999#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007000 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00007001#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007002#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007003 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00007004#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007005#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007006 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007008#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007009 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007010#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007011#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007012 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007013#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007014#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007015 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007017#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007018 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007019#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007020#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007021 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007022#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007023#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007024 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007025#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007026#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007027 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007028#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007029#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007030 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007032#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007033 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00007034#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05007035#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007036 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05007037#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00007038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007039 /* IPX options */
7040#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007041 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00007042#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007043
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007044/* Reliable Datagram Sockets */
7045#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007046 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007047#endif
7048#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007050#endif
7051#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007052 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007053#endif
7054#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007055 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007056#endif
7057#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007058 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007059#endif
7060#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007061 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007062#endif
7063#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007064 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007065#endif
7066#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007067 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007068#endif
7069#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007070 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007071#endif
7072#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007073 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007074#endif
7075#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007077#endif
7078#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007079 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01007080#endif
7081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007082 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007083#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007084 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007085#endif
7086#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007087 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007088#endif
7089#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007090 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007091#endif
7092#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007093 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007094#endif
7095#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007096 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007097#endif
7098#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007099 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007100#endif
7101#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007102 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007103#endif
7104#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007105 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007106#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007107#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007108 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007109#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007110#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007111 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007112#endif
7113#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007114 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007115#endif
7116#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007117 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007118#endif
7119#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007120 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007121#endif
7122#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007123 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007124#endif
7125#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007126 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007127#endif
7128#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007129 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007130#endif
7131#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007132 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007133#endif
7134#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007135 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007136#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00007137#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007138 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00007139#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007140#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007141 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007142#endif
7143#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007144 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007145#endif
7146#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007147 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007148#endif
7149#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007150 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007151#endif
7152#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007153 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007154#endif
7155#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007156 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007157#endif
7158#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007159 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007160#endif
7161#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007162 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007163#endif
7164#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007165 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007166#endif
7167#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007168 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007169#endif
7170#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007171 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007172#endif
7173#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007174 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007175#endif
7176#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007177 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007178#endif
7179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007180 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007181#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007182 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007183#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007184 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007185#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007186 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007187#endif
7188#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007189 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007190#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007191 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007192#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007193 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007194#endif
7195#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007196 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007197#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007198 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007199#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007200 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007201#endif
7202
Christian Heimesfaf2f632008-01-06 16:59:19 +00007203#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007204 {
7205 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7206 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7207 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007208 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007209 PyObject *tmp;
7210 tmp = PyLong_FromUnsignedLong(codes[i]);
7211 if (tmp == NULL)
7212 return NULL;
7213 PyModule_AddObject(m, names[i], tmp);
7214 }
7215 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007216 PyModule_AddIntMacro(m, RCVALL_OFF);
7217 PyModule_AddIntMacro(m, RCVALL_ON);
7218 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007219#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007220 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007221#endif
7222#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007223 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007224#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007225#endif /* _MSTCPIP_ */
7226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007227 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007228#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007229 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007230#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007231 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007232}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007233
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007234
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007235#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007236#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007237
7238/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007239/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007240
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007241int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007242inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007244 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007245#if (SIZEOF_INT != 4)
7246#error "Not sure if in_addr_t exists and int is not 32-bits."
7247#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007248 unsigned int packed_addr;
7249 packed_addr = inet_addr(src);
7250 if (packed_addr == INADDR_NONE)
7251 return 0;
7252 memcpy(dst, &packed_addr, 4);
7253 return 1;
7254 }
7255 /* Should set errno to EAFNOSUPPORT */
7256 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007257}
7258
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007259const char *
7260inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007262 if (af == AF_INET) {
7263 struct in_addr packed_addr;
7264 if (size < 16)
7265 /* Should set errno to ENOSPC. */
7266 return NULL;
7267 memcpy(&packed_addr, src, sizeof(packed_addr));
7268 return strncpy(dst, inet_ntoa(packed_addr), size);
7269 }
7270 /* Should set errno to EAFNOSUPPORT */
7271 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007272}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007273
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007274#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007275#endif