blob: 98b6636d78e03e49740c48a4c9e3762236d64a6e [file] [log] [blame]
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001/* Socket module */
2
3/*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005This module provides an interface to Berkeley socket IPC.
6
7Limitations:
8
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00009- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a
Christian Heimes043d6f62008-01-07 17:19:16 +000010 portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported
11 under Linux.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000012- No read/write operations (use sendall/recv or makefile instead).
13- Additional restrictions apply on some non-Unix platforms (compensated
14 for by socket.py).
Guido van Rossum6574b3e1991-06-25 21:36:08 +000015
Guido van Rossum27e177d1995-03-16 15:43:47 +000016Module interface:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000017
Andrew Svetlov0832af62012-12-18 23:10:48 +020018- socket.error: exception raised for socket specific errors, alias for OSError
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000019- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 a subclass of socket.error
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000021- socket.herror: exception raised for gethostby* errors,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 a subclass of socket.error
Guido van Rossum30a685f1991-06-27 15:51:29 +000023- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')
Guido van Rossum3bbc62e1995-01-02 19:30:30 +000024- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])
Guido van Rossum27e177d1995-03-16 15:43:47 +000025- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')
Guido van Rossum25405c71996-12-19 16:42:52 +000026- socket.getprotobyname(protocolname) --> protocol number
Barry Warsaw11b91a02004-06-28 00:50:43 +000027- socket.getservbyname(servicename[, protocolname]) --> port number
28- socket.getservbyport(portnumber[, protocolname]) --> service name
Guido van Rossum7d0a8262007-05-21 23:13:11 +000029- socket.socket([family[, type [, proto, fileno]]]) --> new socket object
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 (fileno specifies a pre-existing socket file descriptor)
Dave Cole331708b2004-08-09 04:51:41 +000031- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)
Guido van Rossum006bf911996-06-12 04:04:55 +000032- socket.ntohs(16 bit value) --> new int object
33- socket.ntohl(32 bit value) --> new int object
34- socket.htons(16 bit value) --> new int object
35- socket.htonl(32 bit value) --> new int object
Berker Peksaga6ec5ee2014-06-30 11:28:40 +030036- socket.getaddrinfo(host, port [, family, type, proto, flags])
37 --> List of (family, type, proto, canonname, sockaddr)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +000038- socket.getnameinfo(sockaddr, flags) --> (host, port)
Guido van Rossum27e177d1995-03-16 15:43:47 +000039- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000040- socket.has_ipv6: boolean value indicating if IPv6 is supported
Guido van Rossum5c9eb211999-08-20 18:21:51 +000041- socket.inet_aton(IP address) -> 32-bit packed IP representation
42- socket.inet_ntoa(packed IP) -> IP address string
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000043- socket.getdefaulttimeout() -> None | float
44- socket.setdefaulttimeout(None | float)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -070045- socket.if_nameindex() -> list of tuples (if_index, if_name)
46- socket.if_nametoindex(name) -> corresponding interface index
47- socket.if_indextoname(index) -> corresponding interface name
Guido van Rossum6574b3e1991-06-25 21:36:08 +000048- an Internet socket address is a pair (hostname, port)
49 where hostname can be anything recognized by gethostbyname()
50 (including the dd.dd.dd.dd notation) and port is in host byte order
51- where a hostname is returned, the dd.dd.dd.dd notation is used
Guido van Rossum27e177d1995-03-16 15:43:47 +000052- a UNIX domain socket address is a string specifying the pathname
Jeremy Hylton22308652001-02-02 03:23:09 +000053- an AF_PACKET socket address is a tuple containing a string
54 specifying the ethernet interface and an integer specifying
55 the Ethernet protocol number to be received. For example:
Jeremy Hyltondbfb6622001-02-02 19:55:17 +000056 ("eth0",0x1234). Optional 3rd,4th,5th elements in the tuple
Andrew M. Kuchlingb8e17172004-07-10 23:39:35 +000057 specify packet-type and ha-type/addr.
Christian Heimes043d6f62008-01-07 17:19:16 +000058- an AF_TIPC socket address is expressed as
59 (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;
Christian Heimes043d6f62008-01-07 17:19:16 +000061 and scope can be one of:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.
Christian Heimes043d6f62008-01-07 17:19:16 +000063 The meaning of v1, v2 and v3 depends on the value of addr_type:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 if addr_type is TIPC_ADDR_NAME:
65 v1 is the server type
66 v2 is the port identifier
67 v3 is ignored
68 if addr_type is TIPC_ADDR_NAMESEQ:
69 v1 is the server type
70 v2 is the lower port number
71 v3 is the upper port number
72 if addr_type is TIPC_ADDR_ID:
73 v1 is the node
74 v2 is the ref
75 v3 is ignored
Christian Heimes043d6f62008-01-07 17:19:16 +000076
Guido van Rossum6574b3e1991-06-25 21:36:08 +000077
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000078Local naming conventions:
Guido van Rossum6574b3e1991-06-25 21:36:08 +000079
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000080- names starting with sock_ are socket object methods
81- names starting with socket_ are module-level functions
82- names starting with PySocket are exported through socketmodule.h
Guido van Rossum30a685f1991-06-27 15:51:29 +000083
Guido van Rossum6574b3e1991-06-25 21:36:08 +000084*/
85
Thomas Wouters477c8d52006-05-27 19:21:47 +000086#ifdef __APPLE__
87 /*
88 * inet_aton is not available on OSX 10.3, yet we want to use a binary
89 * that was build on 10.4 or later to work on that release, weak linking
90 * comes to the rescue.
91 */
92# pragma weak inet_aton
93#endif
94
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000095#include "Python.h"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000096#include "structmember.h"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000097
Guido van Rossumc4fcfa32002-06-07 03:19:37 +000098/* Socket object documentation */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000099PyDoc_STRVAR(sock_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +0200100"socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) -> socket object\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000101\n\
102Open a socket of the given type. The family argument specifies the\n\
103address family; it defaults to AF_INET. The type argument specifies\n\
104whether this is a stream (SOCK_STREAM, this is the default)\n\
105or datagram (SOCK_DGRAM) socket. The protocol argument defaults to 0,\n\
106specifying the default protocol. Keyword arguments are accepted.\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200107The socket is created as non-inheritable.\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000108\n\
109A socket object represents one endpoint of a network connection.\n\
110\n\
111Methods of socket objects (keyword arguments not allowed):\n\
112\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000113_accept() -- accept connection, returning new socket fd and client address\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000114bind(addr) -- bind the socket to a local address\n\
115close() -- close the socket\n\
116connect(addr) -- connect the socket to a remote address\n\
117connect_ex(addr) -- connect, return an error code instead of an exception\n\
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118dup() -- return a new socket fd duplicated from fileno()\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000119fileno() -- return underlying file descriptor\n\
120getpeername() -- return remote address [*]\n\
121getsockname() -- return local address\n\
122getsockopt(level, optname[, buflen]) -- get socket options\n\
123gettimeout() -- return timeout or None\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +0100124listen([n]) -- start listening for incoming connections\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000125recv(buflen[, flags]) -- receive data\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000126recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000127recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000128recvfrom_into(buffer[, nbytes, [, flags])\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +0000129 -- receive data and sender\'s address (into a buffer)\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000130sendall(data[, flags]) -- send all data\n\
131send(data[, flags]) -- send data, may not send all of it\n\
132sendto(data[, flags], addr) -- send data to a given address\n\
133setblocking(0 | 1) -- set or clear the blocking I/O flag\n\
134setsockopt(level, optname, value) -- set socket options\n\
135settimeout(None | float) -- set or clear the timeout\n\
136shutdown(how) -- shut down traffic in one or both directions\n\
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700137if_nameindex() -- return all network interface indices and names\n\
Gregory P. Smithb6471db2011-05-22 22:47:55 -0700138if_nametoindex(name) -- return the corresponding interface index\n\
139if_indextoname(index) -- return the corresponding interface name\n\
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000140\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141 [*] not available on all platforms!");
Guido van Rossum3baaa131999-03-22 21:44:51 +0000142
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +0000143/* XXX This is a terrible mess of platform-dependent preprocessor hacks.
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000144 I hope some day someone can clean this up please... */
145
Guido van Rossum9376b741999-09-15 22:01:40 +0000146/* Hacks for gethostbyname_r(). On some non-Linux platforms, the configure
147 script doesn't get this right, so we hardcode some platform checks below.
148 On the other hand, not all Linux versions agree, so there the settings
149 computed by the configure script are needed! */
150
151#ifndef linux
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000152# undef HAVE_GETHOSTBYNAME_R_3_ARG
153# undef HAVE_GETHOSTBYNAME_R_5_ARG
154# undef HAVE_GETHOSTBYNAME_R_6_ARG
Guido van Rossum9376b741999-09-15 22:01:40 +0000155#endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000156
Victor Stinner710d27e2011-08-23 10:57:32 +0200157#if defined(__OpenBSD__)
158# include <sys/uio.h>
159#endif
160
Guido van Rossum7a122991999-04-13 04:07:32 +0000161#ifndef WITH_THREAD
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000162# undef HAVE_GETHOSTBYNAME_R
Guido van Rossum7a122991999-04-13 04:07:32 +0000163#endif
164
Guido van Rossume7de2061999-03-24 17:24:33 +0000165#ifdef HAVE_GETHOSTBYNAME_R
Jesus Cea736e7fc2011-03-14 17:36:54 +0100166# if defined(_AIX)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000167# define HAVE_GETHOSTBYNAME_R_3_ARG
168# elif defined(__sun) || defined(__sgi)
169# define HAVE_GETHOSTBYNAME_R_5_ARG
170# elif defined(linux)
Guido van Rossum9376b741999-09-15 22:01:40 +0000171/* Rely on the configure script */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000172# else
173# undef HAVE_GETHOSTBYNAME_R
174# endif
Guido van Rossume7de2061999-03-24 17:24:33 +0000175#endif
176
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000177#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \
178 !defined(MS_WINDOWS)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000179# define USE_GETHOSTBYNAME_LOCK
Guido van Rossum3baaa131999-03-22 21:44:51 +0000180#endif
181
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000182/* To use __FreeBSD_version */
183#ifdef HAVE_SYS_PARAM_H
184#include <sys/param.h>
185#endif
Just van Rossum1040d2c2003-05-09 07:53:18 +0000186/* On systems on which getaddrinfo() is believed to not be thread-safe,
Just van Rossum09aecd72003-05-09 08:03:44 +0000187 (this includes the getaddrinfo emulation) protect access with a lock. */
Hye-Shik Chang9ceebd52005-09-24 14:58:47 +0000188#if defined(WITH_THREAD) && (defined(__APPLE__) || \
189 (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000190 defined(__OpenBSD__) || defined(__NetBSD__) || \
Christian Heimesaf01f662013-12-21 16:19:10 +0100191 !defined(HAVE_GETADDRINFO))
Just van Rossum1040d2c2003-05-09 07:53:18 +0000192#define USE_GETADDRINFO_LOCK
193#endif
194
195#ifdef USE_GETADDRINFO_LOCK
196#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);
197#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);
198#else
199#define ACQUIRE_GETADDRINFO_LOCK
200#define RELEASE_GETADDRINFO_LOCK
201#endif
202
203#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000204# include "pythread.h"
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000205#endif
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000206
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000207#if defined(PYCC_VACPP)
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000208# include <types.h>
209# include <io.h>
210# include <sys/ioctl.h>
211# include <utils.h>
212# include <ctype.h>
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000213#endif
214
Martin v. Löwis9d6c6692012-02-03 17:44:58 +0100215#ifdef __APPLE__
216# include <sys/ioctl.h>
217#endif
218
219
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000220#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000221/* make sure that the reentrant (gethostbyaddr_r etc)
222 functions are declared correctly if compiling with
223 MIPSPro 7.x in ANSI C mode (default) */
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000224
Thomas Wouters477c8d52006-05-27 19:21:47 +0000225/* XXX Using _SGIAPI is the wrong thing,
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000226 but I don't know what the right thing is. */
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000227#undef _SGIAPI /* to avoid warning */
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000228#define _SGIAPI 1
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000229
Trent Mick8ea5bdf2004-09-13 17:48:41 +0000230#undef _XOPEN_SOURCE
231#include <sys/socket.h>
232#include <sys/types.h>
233#include <netinet/in.h>
234#ifdef _SS_ALIGNSIZE
235#define HAVE_GETADDRINFO 1
236#define HAVE_GETNAMEINFO 1
237#endif
238
Jeremy Hyltonfb509a32003-07-17 16:58:48 +0000239#define HAVE_INET_PTON
240#include <netdb.h>
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000241#endif
242
Thomas Wouters477c8d52006-05-27 19:21:47 +0000243/* Irix 6.5 fails to define this variable at all. This is needed
244 for both GCC and SGI's compiler. I'd say that the SGI headers
Georg Brandldbd83392006-02-20 09:42:33 +0000245 are just busted. Same thing for Solaris. */
246#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)
Anthony Baxterbab23cf2003-10-04 08:00:49 +0000247#define INET_ADDRSTRLEN 16
248#endif
249
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000250/* Generic includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000251#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000253#endif
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000254
Gregory P. Smith3b1f2c32011-05-15 12:18:23 -0700255#ifdef HAVE_SYS_SOCKET_H
256#include <sys/socket.h>
257#endif
258
259#ifdef HAVE_NET_IF_H
260#include <net/if.h>
261#endif
262
Marc-André Lemburg976ade62002-02-16 18:47:07 +0000263/* Generic socket object definitions and includes */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000264#define PySocket_BUILDING_SOCKET
Marc-André Lemburgbb8b78b2002-02-16 18:44:52 +0000265#include "socketmodule.h"
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000266
267/* Addressing includes */
268
Guido van Rossum6f489d91996-06-28 20:15:15 +0000269#ifndef MS_WINDOWS
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000270
271/* Non-MS WINDOWS includes */
272# include <netdb.h>
Nick Coghlan4ecf6cf2011-08-22 15:45:19 +1000273# include <unistd.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000274
Guido van Rossum9376b741999-09-15 22:01:40 +0000275/* Headers needed for inet_ntoa() and inet_addr() */
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000276# include <arpa/inet.h>
Guido van Rossum5c9eb211999-08-20 18:21:51 +0000277
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000278# include <fcntl.h>
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000279
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000280#else
Guido van Rossum48a680c2001-03-02 06:34:14 +0000281
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000282/* MS_WINDOWS includes */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000283# ifdef HAVE_FCNTL_H
284# include <fcntl.h>
285# endif
Guido van Rossum48a680c2001-03-02 06:34:14 +0000286
Steve Dower65e4cb12014-11-22 12:54:57 -0800287#if defined(_MSC_VER) && _MSC_VER >= 1800
288/* Provides the IsWindows7SP1OrGreater() function */
289#include <VersionHelpers.h>
290#endif
291
Jeremy Hylton22308652001-02-02 03:23:09 +0000292#endif
293
Skip Montanaro7befb992004-02-10 16:50:21 +0000294#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000295
Neal Norwitz39d22e52002-11-02 19:55:21 +0000296#ifndef O_NONBLOCK
297# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000298#endif
299
Trent Micka708d6e2004-09-07 17:48:26 +0000300/* include Python's addrinfo.h unless it causes trouble */
301#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
302 /* Do not include addinfo.h on some newer IRIX versions.
303 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
304 * for example, but not by 6.5.10.
305 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000306#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000307 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
308 * EAI_* constants are defined in (the already included) ws2tcpip.h.
309 */
310#else
311# include "addrinfo.h"
312#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000313
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000314#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000315#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000316int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000317const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000318#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000319#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000320
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000321#ifdef __APPLE__
322/* On OS X, getaddrinfo returns no error indication of lookup
323 failure, so we must use the emulation instead of the libinfo
324 implementation. Unfortunately, performing an autoconf test
325 for this bug would require DNS access for the machine performing
326 the configuration, which is not acceptable. Therefore, we
327 determine the bug just by checking for __APPLE__. If this bug
328 gets ever fixed, perhaps checking for sys/version.h would be
329 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000330#ifndef HAVE_GETNAMEINFO
331/* This bug seems to be fixed in Jaguar. Ths easiest way I could
332 Find to check for Jaguar is that it has getnameinfo(), which
333 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000335#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000336
337#ifdef HAVE_INET_ATON
338#define USE_INET_ATON_WEAKLINK
339#endif
340
Jack Jansen84262fb2002-07-02 14:40:42 +0000341#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000342
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000343/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000344#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000345/* avoid clashes with the C library definition of the symbol. */
346#define getaddrinfo fake_getaddrinfo
347#define gai_strerror fake_gai_strerror
348#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000349#include "getaddrinfo.c"
350#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000351#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000352#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000353#include "getnameinfo.c"
354#endif
355
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000356#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000357#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000358#endif
359
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000360#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000361#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000362#define EAFNOSUPPORT WSAEAFNOSUPPORT
363#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000364#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000365
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000366#ifndef SOCKETCLOSE
367#define SOCKETCLOSE close
368#endif
369
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000370#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000371#define USE_BLUETOOTH 1
372#if defined(__FreeBSD__)
373#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
374#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000375#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000376#define SOL_HCI SOL_HCI_RAW
377#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000378#define sockaddr_l2 sockaddr_l2cap
379#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000380#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000381#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
382#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000383#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000384#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000385#define sockaddr_l2 sockaddr_bt
386#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000387#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000388#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000389#define SOL_HCI BTPROTO_HCI
390#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000391#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
392#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000393#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000394#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000396#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
397#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000398#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000399#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
400#endif
401#endif
402
Charles-François Natali8b759652011-12-23 16:44:51 +0100403/* Convert "sock_addr_t *" to "struct sockaddr *". */
404#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000405
Martin v. Löwise9416172003-05-03 10:12:45 +0000406/*
407 * Constants for getnameinfo()
408 */
409#if !defined(NI_MAXHOST)
410#define NI_MAXHOST 1025
411#endif
412#if !defined(NI_MAXSERV)
413#define NI_MAXSERV 32
414#endif
415
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000416#ifndef INVALID_SOCKET /* MS defines this */
417#define INVALID_SOCKET (-1)
418#endif
419
Charles-François Natali0cc86852013-09-13 19:53:08 +0200420#ifndef INADDR_NONE
421#define INADDR_NONE (-1)
422#endif
423
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000424/* XXX There's a problem here: *static* functions are not supposed to have
425 a Py prefix (or use CapitalizedWords). Later... */
426
Guido van Rossum30a685f1991-06-27 15:51:29 +0000427/* Global variable holding the exception type for errors detected
428 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000429static PyObject *socket_herror;
430static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000431static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000432
Tim Peters643a7fc2002-02-17 04:13:21 +0000433/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000434 The sock_type variable contains pointers to various functions,
435 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000436 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000437static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000438
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000439#if defined(HAVE_POLL_H)
440#include <poll.h>
441#elif defined(HAVE_SYS_POLL_H)
442#include <sys/poll.h>
443#endif
444
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000445/* Largest value to try to store in a socklen_t (used when handling
446 ancillary data). POSIX requires socklen_t to hold at least
447 (2**31)-1 and recommends against storing larger values, but
448 socklen_t was originally int in the BSD interface, so to be on the
449 safe side we use the smaller of (2**31)-1 and INT_MAX. */
450#if INT_MAX > 0x7fffffff
451#define SOCKLEN_T_LIMIT 0x7fffffff
452#else
453#define SOCKLEN_T_LIMIT INT_MAX
454#endif
455
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200456#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000457/* Instead of select(), we'll use poll() since poll() works on any fd. */
458#define IS_SELECTABLE(s) 1
459/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000460#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200461/* If there's no timeout left, we don't have to call select, so it's a safe,
462 * little white lie. */
Victor Stinner71694d52015-03-28 01:18:54 +0100463#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000464#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000465
466static PyObject*
467select_error(void)
468{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200469 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000471}
472
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000473#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000474#ifndef WSAEAGAIN
475#define WSAEAGAIN WSAEWOULDBLOCK
476#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000477#define CHECK_ERRNO(expected) \
478 (WSAGetLastError() == WSA ## expected)
479#else
480#define CHECK_ERRNO(expected) \
481 (errno == expected)
482#endif
483
Victor Stinnerdaf45552013-08-28 00:53:59 +0200484#ifdef MS_WINDOWS
485/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
486static int support_wsa_no_inherit = -1;
487#endif
488
Guido van Rossum30a685f1991-06-27 15:51:29 +0000489/* Convenience function to raise an error according to errno
490 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000491
Guido van Rossum73624e91994-10-10 17:59:00 +0000492static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000493set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000494{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000495#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 int err_no = WSAGetLastError();
497 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
498 recognizes the error codes used by both GetLastError() and
499 WSAGetLastError */
500 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200501 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000502#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000503
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200504 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000505}
506
Guido van Rossum30a685f1991-06-27 15:51:29 +0000507
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000508static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000509set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000510{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000512
513#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000515#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000517#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (v != NULL) {
519 PyErr_SetObject(socket_herror, v);
520 Py_DECREF(v);
521 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000522
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000524}
525
526
527static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000528set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000529{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000531
Martin v. Löwis272cb402002-03-01 08:31:07 +0000532#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 /* EAI_SYSTEM is not available on Windows XP. */
534 if (error == EAI_SYSTEM)
535 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000536#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000537
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000538#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000540#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 if (v != NULL) {
544 PyErr_SetObject(socket_gaierror, v);
545 Py_DECREF(v);
546 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000549}
550
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000551/* Function to perform the setting of socket blocking mode
552 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000553static int
554internal_setblocking(PySocketSockObject *s, int block)
555{
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200556#ifdef MS_WINDOWS
557 u_long arg;
558#endif
Victor Stinner9a954832013-12-04 00:41:24 +0100559#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100560 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100561 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000562#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000563#ifdef SOCK_NONBLOCK
564 if (block)
565 s->sock_type &= (~SOCK_NONBLOCK);
566 else
567 s->sock_type |= SOCK_NONBLOCK;
568#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000571#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100572#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 block = !block;
574 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100575#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
577 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100578 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 else
Victor Stinner9a954832013-12-04 00:41:24 +0100580 new_delay_flag = delay_flag | O_NONBLOCK;
581 if (new_delay_flag != delay_flag)
582 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
583#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000584#else /* MS_WINDOWS */
Victor Stinnerb6dab6b2014-07-23 22:56:55 +0200585 arg = !block;
586 ioctlsocket(s->sock_fd, FIONBIO, &arg);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000587#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000588 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000589
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 /* Since these don't return anything */
591 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000592}
593
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000594static int
Victor Stinner416f2e62015-03-31 13:56:29 +0200595internal_select_impl(PySocketSockObject *s, int writing, _PyTime_t interval,
596 int error)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 int n;
Victor Stinner71694d52015-03-28 01:18:54 +0100599#ifdef HAVE_POLL
600 struct pollfd pollfd;
Victor Stinnere6951c62015-03-31 13:50:44 +0200601 _PyTime_t ms;
Victor Stinner71694d52015-03-28 01:18:54 +0100602#else
Victor Stinner416f2e62015-03-31 13:56:29 +0200603 fd_set fds, efds;
Victor Stinner71694d52015-03-28 01:18:54 +0100604 struct timeval tv;
605#endif
Guido van Rossum11ba0942002-06-13 15:07:44 +0000606
Victor Stinnerb7df3142015-03-27 22:59:32 +0100607#ifdef WITH_THREAD
608 /* must be called with the GIL held */
609 assert(PyGILState_Check());
610#endif
611
Victor Stinner416f2e62015-03-31 13:56:29 +0200612 /* Error condition is for output only */
613 assert(!(error && !writing));
614
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 /* Nothing to do unless we're in timeout mode (not non-blocking) */
Victor Stinner71694d52015-03-28 01:18:54 +0100616 if (s->sock_timeout <= 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 /* Guard against closed socket */
620 if (s->sock_fd < 0)
621 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000622
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000623 /* Handling this condition here simplifies the select loops */
Victor Stinner71694d52015-03-28 01:18:54 +0100624 if (interval < 0)
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000625 return 1;
626
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 /* Prefer poll, if available, since you can poll() any fd
628 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000629#ifdef HAVE_POLL
Victor Stinner71694d52015-03-28 01:18:54 +0100630 pollfd.fd = s->sock_fd;
631 pollfd.events = writing ? POLLOUT : POLLIN;
Victor Stinner416f2e62015-03-31 13:56:29 +0200632 if (error)
633 pollfd.events |= POLLERR;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000634
Victor Stinner71694d52015-03-28 01:18:54 +0100635 /* s->sock_timeout is in seconds, timeout in ms */
Victor Stinnere6951c62015-03-31 13:50:44 +0200636 ms = _PyTime_AsMilliseconds(interval, _PyTime_ROUND_CEILING);
637 assert(ms <= INT_MAX);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000638
Victor Stinner71694d52015-03-28 01:18:54 +0100639 Py_BEGIN_ALLOW_THREADS;
Victor Stinnere6951c62015-03-31 13:50:44 +0200640 n = poll(&pollfd, 1, (int)ms);
Victor Stinner71694d52015-03-28 01:18:54 +0100641 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000642#else
Victor Stinner869e1772015-03-30 03:49:14 +0200643 _PyTime_AsTimeval_noraise(interval, &tv, _PyTime_ROUND_CEILING);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000644
Victor Stinner71694d52015-03-28 01:18:54 +0100645 FD_ZERO(&fds);
646 FD_SET(s->sock_fd, &fds);
Victor Stinner416f2e62015-03-31 13:56:29 +0200647 FD_ZERO(&efds);
648 if (error)
649 FD_SET(s->sock_fd, &efds);
Victor Stinner71694d52015-03-28 01:18:54 +0100650
651 /* See if the socket is ready */
652 Py_BEGIN_ALLOW_THREADS;
653 if (writing)
654 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200655 NULL, &fds, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100656 else
657 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
Victor Stinner416f2e62015-03-31 13:56:29 +0200658 &fds, NULL, &efds, &tv);
Victor Stinner71694d52015-03-28 01:18:54 +0100659 Py_END_ALLOW_THREADS;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000660#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 if (n < 0)
663 return -1;
664 if (n == 0)
665 return 1;
666 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000667}
668
Victor Stinnere6951c62015-03-31 13:50:44 +0200669/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
670 The argument writing indicates the direction.
671 This does not raise an exception; we'll let our caller do that
672 after they've reacquired the interpreter lock.
673 Returns 1 on timeout, -1 on error, 0 otherwise. */
674static int
675internal_select(PySocketSockObject *s, int writing, _PyTime_t interval)
676{
Victor Stinner416f2e62015-03-31 13:56:29 +0200677 return internal_select_impl(s, writing, interval, 0);
Victor Stinnere6951c62015-03-31 13:50:44 +0200678}
679
680static int
681internal_connect_select(PySocketSockObject *s)
682{
Victor Stinner416f2e62015-03-31 13:56:29 +0200683 return internal_select(s, 1, s->sock_timeout, 1);
Victor Stinnere6951c62015-03-31 13:50:44 +0200684}
685
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000686/*
687 Two macros for automatic retry of select() in case of false positives
688 (for example, select() could indicate a socket is ready for reading
689 but the data then discarded by the OS because of a wrong checksum).
690 Here is an example of use:
691
692 BEGIN_SELECT_LOOP(s)
Victor Stinnerb7df3142015-03-27 22:59:32 +0100693
Victor Stinner391fa712015-03-31 13:15:31 +0200694 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +0100695
696 if (!timeout) {
697 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000698 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinnerb7df3142015-03-27 22:59:32 +0100699 Py_END_ALLOW_THREADS
700 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000701 if (timeout == 1) {
702 PyErr_SetString(socket_timeout, "timed out");
703 return -1;
704 }
705 END_SELECT_LOOP(s)
706*/
707
708#define BEGIN_SELECT_LOOP(s) \
709 { \
Victor Stinner71694d52015-03-28 01:18:54 +0100710 _PyTime_t deadline = 0; \
711 _PyTime_t interval = s->sock_timeout; \
712 int has_timeout = (s->sock_timeout > 0); \
713 if (has_timeout) \
714 deadline = _PyTime_GetMonotonicClock() + interval; \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000715 while (1) { \
716 errno = 0; \
717
718#define END_SELECT_LOOP(s) \
719 if (!has_timeout || \
720 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
721 break; \
Victor Stinner71694d52015-03-28 01:18:54 +0100722 interval = deadline - _PyTime_GetMonotonicClock(); \
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000723 } \
724 } \
725
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000726/* Initialize a new socket object. */
727
Victor Stinner71694d52015-03-28 01:18:54 +0100728static _PyTime_t defaulttimeout = -1; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000729
Martin v. Löwis1a214512008-06-11 05:26:20 +0000730static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000731init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000733{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 s->sock_fd = fd;
735 s->sock_family = family;
736 s->sock_type = type;
737 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000738
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000740#ifdef SOCK_NONBLOCK
741 if (type & SOCK_NONBLOCK)
Victor Stinner71694d52015-03-28 01:18:54 +0100742 s->sock_timeout = 0;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000743 else
744#endif
745 {
746 s->sock_timeout = defaulttimeout;
Victor Stinner71694d52015-03-28 01:18:54 +0100747 if (defaulttimeout >= 0)
Antoine Pitroub1c54962010-10-14 15:05:38 +0000748 internal_setblocking(s, 0);
749 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000750
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000751}
752
753
Guido van Rossum30a685f1991-06-27 15:51:29 +0000754/* Create a new socket object.
755 This just creates the object and initializes it.
756 If the creation fails, return NULL and set an exception (implicit
757 in NEWOBJ()). */
758
Guido van Rossum73624e91994-10-10 17:59:00 +0000759static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000760new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000761{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 PySocketSockObject *s;
763 s = (PySocketSockObject *)
764 PyType_GenericNew(&sock_type, NULL, NULL);
765 if (s != NULL)
766 init_sockobject(s, fd, family, type, proto);
767 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000768}
769
Guido van Rossum30a685f1991-06-27 15:51:29 +0000770
Guido van Rossum48a680c2001-03-02 06:34:14 +0000771/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000772 thread to be in gethostbyname or getaddrinfo */
773#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200774static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000775#endif
776
777
Guido van Rossum30a685f1991-06-27 15:51:29 +0000778/* Convert a string specifying a host name or one of a few symbolic
779 names to a numeric IP address. This usually calls gethostbyname()
780 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000781 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000782 an error occurred; then an exception is raised. */
783
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000784static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000785setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 struct addrinfo hints, *res;
788 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
791 if (name[0] == '\0') {
792 int siz;
793 memset(&hints, 0, sizeof(hints));
794 hints.ai_family = af;
795 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
796 hints.ai_flags = AI_PASSIVE;
797 Py_BEGIN_ALLOW_THREADS
798 ACQUIRE_GETADDRINFO_LOCK
799 error = getaddrinfo(NULL, "0", &hints, &res);
800 Py_END_ALLOW_THREADS
801 /* We assume that those thread-unsafe getaddrinfo() versions
802 *are* safe regarding their return value, ie. that a
803 subsequent call to getaddrinfo() does not destroy the
804 outcome of the first call. */
805 RELEASE_GETADDRINFO_LOCK
806 if (error) {
807 set_gaierror(error);
808 return -1;
809 }
810 switch (res->ai_family) {
811 case AF_INET:
812 siz = 4;
813 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000814#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 case AF_INET6:
816 siz = 16;
817 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000818#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000819 default:
820 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200821 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000822 "unsupported address family");
823 return -1;
824 }
825 if (res->ai_next) {
826 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200827 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000828 "wildcard resolved to multiple address");
829 return -1;
830 }
831 if (res->ai_addrlen < addr_ret_size)
832 addr_ret_size = res->ai_addrlen;
833 memcpy(addr_ret, res->ai_addr, addr_ret_size);
834 freeaddrinfo(res);
835 return siz;
836 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200837 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100838 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200839 if (strcmp(name, "255.255.255.255") == 0 ||
840 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 struct sockaddr_in *sin;
842 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200843 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 "address family mismatched");
845 return -1;
846 }
847 sin = (struct sockaddr_in *)addr_ret;
848 memset((void *) sin, '\0', sizeof(*sin));
849 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000850#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 sin->sin_addr.s_addr = INADDR_BROADCAST;
854 return sizeof(sin->sin_addr);
855 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200856
857 /* avoid a name resolution in case of numeric address */
858#ifdef HAVE_INET_PTON
859 /* check for an IPv4 address */
860 if (af == AF_UNSPEC || af == AF_INET) {
861 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
862 memset(sin, 0, sizeof(*sin));
863 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
864 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000865#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200866 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000867#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200868 return 4;
869 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200871#ifdef ENABLE_IPV6
872 /* check for an IPv6 address - if the address contains a scope ID, we
873 * fallback to getaddrinfo(), which can handle translation from interface
874 * name to interface index */
875 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
876 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
877 memset(sin, 0, sizeof(*sin));
878 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
879 sin->sin6_family = AF_INET6;
880#ifdef HAVE_SOCKADDR_SA_LEN
881 sin->sin6_len = sizeof(*sin);
882#endif
883 return 16;
884 }
885 }
886#endif /* ENABLE_IPV6 */
887#else /* HAVE_INET_PTON */
888 /* check for an IPv4 address */
889 if (af == AF_INET || af == AF_UNSPEC) {
890 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
891 memset(sin, 0, sizeof(*sin));
892 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
893 sin->sin_family = AF_INET;
894#ifdef HAVE_SOCKADDR_SA_LEN
895 sin->sin_len = sizeof(*sin);
896#endif
897 return 4;
898 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100899 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200900#endif /* HAVE_INET_PTON */
901
902 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000903 memset(&hints, 0, sizeof(hints));
904 hints.ai_family = af;
905 Py_BEGIN_ALLOW_THREADS
906 ACQUIRE_GETADDRINFO_LOCK
907 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000908#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 if (error == EAI_NONAME && af == AF_UNSPEC) {
910 /* On Tru64 V5.1, numeric-to-addr conversion fails
911 if no address family is given. Assume IPv4 for now.*/
912 hints.ai_family = AF_INET;
913 error = getaddrinfo(name, NULL, &hints, &res);
914 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000915#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 Py_END_ALLOW_THREADS
917 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
918 if (error) {
919 set_gaierror(error);
920 return -1;
921 }
922 if (res->ai_addrlen < addr_ret_size)
923 addr_ret_size = res->ai_addrlen;
924 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
925 freeaddrinfo(res);
926 switch (addr_ret->sa_family) {
927 case AF_INET:
928 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000929#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000930 case AF_INET6:
931 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000932#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000933 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200934 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 return -1;
936 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000937}
938
Guido van Rossum30a685f1991-06-27 15:51:29 +0000939
Guido van Rossum30a685f1991-06-27 15:51:29 +0000940/* Create a string object representing an IP address.
941 This is always a string of the form 'dd.dd.dd.dd' (with variable
942 size numbers). */
943
Guido van Rossum73624e91994-10-10 17:59:00 +0000944static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000945makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 char buf[NI_MAXHOST];
948 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
951 NI_NUMERICHOST);
952 if (error) {
953 set_gaierror(error);
954 return NULL;
955 }
956 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000957}
958
959
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000960#ifdef USE_BLUETOOTH
961/* Convert a string representation of a Bluetooth address into a numeric
962 address. Returns the length (6), or raises an exception and returns -1 if
963 an error occurred. */
964
965static int
966setbdaddr(char *name, bdaddr_t *bdaddr)
967{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 unsigned int b0, b1, b2, b3, b4, b5;
969 char ch;
970 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
973 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
974 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
975 bdaddr->b[0] = b0;
976 bdaddr->b[1] = b1;
977 bdaddr->b[2] = b2;
978 bdaddr->b[3] = b3;
979 bdaddr->b[4] = b4;
980 bdaddr->b[5] = b5;
981 return 6;
982 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200983 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000984 return -1;
985 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000986}
987
988/* Create a string representation of the Bluetooth address. This is always a
989 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
990 value (zero padded if necessary). */
991
992static PyObject *
993makebdaddr(bdaddr_t *bdaddr)
994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
998 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
999 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
1000 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001001}
1002#endif
1003
1004
Guido van Rossum30a685f1991-06-27 15:51:29 +00001005/* Create an object representing the given socket address,
1006 suitable for passing it back to bind(), connect() etc.
1007 The family field of the sockaddr structure is inspected
1008 to determine what kind of address it really is. */
1009
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001010/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00001011static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +00001012makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001013{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 if (addrlen == 0) {
1015 /* No address -- may be recvfrom() from known socket */
1016 Py_INCREF(Py_None);
1017 return Py_None;
1018 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 case AF_INET:
1023 {
1024 struct sockaddr_in *a;
1025 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1026 PyObject *ret = NULL;
1027 if (addrobj) {
1028 a = (struct sockaddr_in *)addr;
1029 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1030 Py_DECREF(addrobj);
1031 }
1032 return ret;
1033 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001034
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001035#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 case AF_UNIX:
1037 {
1038 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001039#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1041 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001042 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001043 }
1044 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001045#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001046 {
1047 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001048 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001049 }
1050 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001051#endif /* AF_UNIX */
1052
Martin v. Löwis11017b12006-01-14 18:12:57 +00001053#if defined(AF_NETLINK)
1054 case AF_NETLINK:
1055 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001056 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1057 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001058 }
1059#endif /* AF_NETLINK */
1060
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001061#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001062 case AF_INET6:
1063 {
1064 struct sockaddr_in6 *a;
1065 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1066 PyObject *ret = NULL;
1067 if (addrobj) {
1068 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001069 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001070 addrobj,
1071 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001072 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001073 a->sin6_scope_id);
1074 Py_DECREF(addrobj);
1075 }
1076 return ret;
1077 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001078#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001079
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001080#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001081 case AF_BLUETOOTH:
1082 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001084 case BTPROTO_L2CAP:
1085 {
1086 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1087 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1088 PyObject *ret = NULL;
1089 if (addrobj) {
1090 ret = Py_BuildValue("Oi",
1091 addrobj,
1092 _BT_L2_MEMB(a, psm));
1093 Py_DECREF(addrobj);
1094 }
1095 return ret;
1096 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001098 case BTPROTO_RFCOMM:
1099 {
1100 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1101 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1102 PyObject *ret = NULL;
1103 if (addrobj) {
1104 ret = Py_BuildValue("Oi",
1105 addrobj,
1106 _BT_RC_MEMB(a, channel));
1107 Py_DECREF(addrobj);
1108 }
1109 return ret;
1110 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001112 case BTPROTO_HCI:
1113 {
1114 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001115#if defined(__NetBSD__) || defined(__DragonFly__)
1116 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1117#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 PyObject *ret = NULL;
1119 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1120 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001121#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001123
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001124#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001125 case BTPROTO_SCO:
1126 {
1127 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1128 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1129 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001130#endif
1131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132 default:
1133 PyErr_SetString(PyExc_ValueError,
1134 "Unknown Bluetooth protocol");
1135 return NULL;
1136 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001137#endif
1138
Antoine Pitroub156a462010-10-27 20:13:57 +00001139#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001140 case AF_PACKET:
1141 {
1142 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1143 char *ifname = "";
1144 struct ifreq ifr;
1145 /* need to look up interface name give index */
1146 if (a->sll_ifindex) {
1147 ifr.ifr_ifindex = a->sll_ifindex;
1148 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1149 ifname = ifr.ifr_name;
1150 }
1151 return Py_BuildValue("shbhy#",
1152 ifname,
1153 ntohs(a->sll_protocol),
1154 a->sll_pkttype,
1155 a->sll_hatype,
1156 a->sll_addr,
1157 a->sll_halen);
1158 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001159#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001160
Christian Heimes043d6f62008-01-07 17:19:16 +00001161#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 case AF_TIPC:
1163 {
1164 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1165 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1166 return Py_BuildValue("IIIII",
1167 a->addrtype,
1168 a->addr.nameseq.type,
1169 a->addr.nameseq.lower,
1170 a->addr.nameseq.upper,
1171 a->scope);
1172 } else if (a->addrtype == TIPC_ADDR_NAME) {
1173 return Py_BuildValue("IIIII",
1174 a->addrtype,
1175 a->addr.name.name.type,
1176 a->addr.name.name.instance,
1177 a->addr.name.name.instance,
1178 a->scope);
1179 } else if (a->addrtype == TIPC_ADDR_ID) {
1180 return Py_BuildValue("IIIII",
1181 a->addrtype,
1182 a->addr.id.node,
1183 a->addr.id.ref,
1184 0,
1185 a->scope);
1186 } else {
1187 PyErr_SetString(PyExc_ValueError,
1188 "Invalid address type");
1189 return NULL;
1190 }
1191 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001192#endif
1193
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001194#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001195 case AF_CAN:
1196 {
1197 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1198 char *ifname = "";
1199 struct ifreq ifr;
1200 /* need to look up interface name given index */
1201 if (a->can_ifindex) {
1202 ifr.ifr_ifindex = a->can_ifindex;
1203 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1204 ifname = ifr.ifr_name;
1205 }
1206
1207 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1208 ifname,
1209 a->can_family);
1210 }
1211#endif
1212
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001213#ifdef PF_SYSTEM
1214 case PF_SYSTEM:
1215 switch(proto) {
1216#ifdef SYSPROTO_CONTROL
1217 case SYSPROTO_CONTROL:
1218 {
1219 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1220 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1221 }
1222#endif
1223 default:
1224 PyErr_SetString(PyExc_ValueError,
1225 "Invalid address type");
1226 return 0;
1227 }
1228#endif
1229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001232 default:
1233 /* If we don't know the address family, don't raise an
1234 exception -- return it as an (int, bytes) tuple. */
1235 return Py_BuildValue("iy#",
1236 addr->sa_family,
1237 addr->sa_data,
1238 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001240 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001241}
1242
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001243/* Helper for getsockaddrarg: bypass IDNA for ASCII-only host names
1244 (in particular, numeric IP addresses). */
1245struct maybe_idna {
1246 PyObject *obj;
1247 char *buf;
1248};
1249
1250static void
1251idna_cleanup(struct maybe_idna *data)
1252{
1253 Py_CLEAR(data->obj);
1254}
1255
1256static int
1257idna_converter(PyObject *obj, struct maybe_idna *data)
1258{
1259 size_t len;
1260 PyObject *obj2, *obj3;
1261 if (obj == NULL) {
1262 idna_cleanup(data);
1263 return 1;
1264 }
1265 data->obj = NULL;
1266 len = -1;
1267 if (PyBytes_Check(obj)) {
1268 data->buf = PyBytes_AsString(obj);
1269 len = PyBytes_Size(obj);
1270 }
1271 else if (PyByteArray_Check(obj)) {
1272 data->buf = PyByteArray_AsString(obj);
1273 len = PyByteArray_Size(obj);
1274 }
1275 else if (PyUnicode_Check(obj) && PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) {
1276 data->buf = PyUnicode_DATA(obj);
1277 len = PyUnicode_GET_LENGTH(obj);
1278 }
1279 else {
1280 obj2 = PyUnicode_FromObject(obj);
1281 if (!obj2) {
1282 PyErr_Format(PyExc_TypeError, "string or unicode text buffer expected, not %s",
1283 obj->ob_type->tp_name);
1284 return 0;
1285 }
1286 obj3 = PyUnicode_AsEncodedString(obj2, "idna", NULL);
1287 Py_DECREF(obj2);
1288 if (!obj3) {
1289 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed");
1290 return 0;
1291 }
1292 if (!PyBytes_Check(obj3)) {
Martin v. Löwis17fd1e12014-08-05 16:13:50 +02001293 Py_DECREF(obj3);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001294 PyErr_SetString(PyExc_TypeError, "encoding of hostname failed to return bytes");
1295 return 0;
1296 }
1297 data->obj = obj3;
1298 data->buf = PyBytes_AS_STRING(obj3);
1299 len = PyBytes_GET_SIZE(obj3);
1300 }
1301 if (strlen(data->buf) != len) {
1302 Py_CLEAR(data->obj);
Serhiy Storchakad8a14472014-09-06 20:07:17 +03001303 PyErr_SetString(PyExc_TypeError, "host name must not contain null character");
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001304 return 0;
1305 }
1306 return Py_CLEANUP_SUPPORTED;
Victor Stinner1a62a682014-08-17 19:33:28 +02001307}
Guido van Rossum30a685f1991-06-27 15:51:29 +00001308
1309/* Parse a socket address argument according to the socket object's
1310 address family. Return 1 if the address was in the proper format,
1311 0 of not. The address is returned through addr_ret, its length
1312 through len_ret. */
1313
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001314static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001315getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001316 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001317{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001319
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001320#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001321 case AF_UNIX:
1322 {
1323 struct sockaddr_un* addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001324 Py_buffer path;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001325 int retval = 0;
1326
1327 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1328 allow embedded nulls on Linux. */
1329 if (PyUnicode_Check(args)) {
1330 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1331 return 0;
1332 }
1333 else
1334 Py_INCREF(args);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001335 if (!PyArg_Parse(args, "y*", &path)) {
1336 Py_DECREF(args);
1337 return retval;
1338 }
1339 assert(path.len >= 0);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001341 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001342#ifdef linux
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001343 if (path.len > 0 && *(const char *)path.buf == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001344 /* Linux abstract namespace extension */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001345 if ((size_t)path.len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001346 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001348 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 }
1350 }
1351 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001352#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001353 {
1354 /* regular NULL-terminated string */
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001355 if ((size_t)path.len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001356 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001357 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001358 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001360 addr->sun_path[path.len] = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001361 }
1362 addr->sun_family = s->sock_family;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001363 memcpy(addr->sun_path, path.buf, path.len);
1364 *len_ret = path.len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001365 retval = 1;
1366 unix_out:
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001367 PyBuffer_Release(&path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001368 Py_DECREF(args);
1369 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001371#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001372
Martin v. Löwis11017b12006-01-14 18:12:57 +00001373#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 case AF_NETLINK:
1375 {
1376 struct sockaddr_nl* addr;
1377 int pid, groups;
1378 addr = (struct sockaddr_nl *)addr_ret;
1379 if (!PyTuple_Check(args)) {
1380 PyErr_Format(
1381 PyExc_TypeError,
1382 "getsockaddrarg: "
1383 "AF_NETLINK address must be tuple, not %.500s",
1384 Py_TYPE(args)->tp_name);
1385 return 0;
1386 }
1387 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1388 return 0;
1389 addr->nl_family = AF_NETLINK;
1390 addr->nl_pid = pid;
1391 addr->nl_groups = groups;
1392 *len_ret = sizeof(*addr);
1393 return 1;
1394 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001395#endif
1396
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001397#ifdef AF_RDS
1398 case AF_RDS:
1399 /* RDS sockets use sockaddr_in: fall-through */
1400#endif
1401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001402 case AF_INET:
1403 {
1404 struct sockaddr_in* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001405 struct maybe_idna host = {NULL, NULL};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001406 int port, result;
1407 if (!PyTuple_Check(args)) {
1408 PyErr_Format(
1409 PyExc_TypeError,
1410 "getsockaddrarg: "
1411 "AF_INET address must be tuple, not %.500s",
1412 Py_TYPE(args)->tp_name);
1413 return 0;
1414 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001415 if (!PyArg_ParseTuple(args, "O&i:getsockaddrarg",
1416 idna_converter, &host, &port))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001417 return 0;
1418 addr=(struct sockaddr_in*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001419 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001420 sizeof(*addr), AF_INET);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001421 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001422 if (result < 0)
1423 return 0;
1424 if (port < 0 || port > 0xffff) {
1425 PyErr_SetString(
1426 PyExc_OverflowError,
1427 "getsockaddrarg: port must be 0-65535.");
1428 return 0;
1429 }
1430 addr->sin_family = AF_INET;
1431 addr->sin_port = htons((short)port);
1432 *len_ret = sizeof *addr;
1433 return 1;
1434 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001435
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001436#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001437 case AF_INET6:
1438 {
1439 struct sockaddr_in6* addr;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001440 struct maybe_idna host = {NULL, NULL};
Charles-François Natali366999a2012-01-02 15:47:29 +01001441 int port, result;
1442 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001443 flowinfo = scope_id = 0;
1444 if (!PyTuple_Check(args)) {
1445 PyErr_Format(
1446 PyExc_TypeError,
1447 "getsockaddrarg: "
1448 "AF_INET6 address must be tuple, not %.500s",
1449 Py_TYPE(args)->tp_name);
1450 return 0;
1451 }
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001452 if (!PyArg_ParseTuple(args, "O&i|II",
1453 idna_converter, &host, &port, &flowinfo,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 &scope_id)) {
1455 return 0;
1456 }
1457 addr = (struct sockaddr_in6*)addr_ret;
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001458 result = setipaddr(host.buf, (struct sockaddr *)addr,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 sizeof(*addr), AF_INET6);
Martin v. Löwiseb1c28a2014-08-05 16:10:38 +02001460 idna_cleanup(&host);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001461 if (result < 0)
1462 return 0;
1463 if (port < 0 || port > 0xffff) {
1464 PyErr_SetString(
1465 PyExc_OverflowError,
1466 "getsockaddrarg: port must be 0-65535.");
1467 return 0;
1468 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001469 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001470 PyErr_SetString(
1471 PyExc_OverflowError,
1472 "getsockaddrarg: flowinfo must be 0-1048575.");
1473 return 0;
1474 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 addr->sin6_family = s->sock_family;
1476 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001477 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 addr->sin6_scope_id = scope_id;
1479 *len_ret = sizeof *addr;
1480 return 1;
1481 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001482#endif
1483
Hye-Shik Chang81268602004-02-02 06:05:24 +00001484#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001485 case AF_BLUETOOTH:
1486 {
1487 switch (s->sock_proto) {
1488 case BTPROTO_L2CAP:
1489 {
1490 struct sockaddr_l2 *addr;
1491 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001493 addr = (struct sockaddr_l2 *)addr_ret;
1494 memset(addr, 0, sizeof(struct sockaddr_l2));
1495 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1496 if (!PyArg_ParseTuple(args, "si", &straddr,
1497 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001498 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001499 "wrong format");
1500 return 0;
1501 }
1502 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1503 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001505 *len_ret = sizeof *addr;
1506 return 1;
1507 }
1508 case BTPROTO_RFCOMM:
1509 {
1510 struct sockaddr_rc *addr;
1511 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001513 addr = (struct sockaddr_rc *)addr_ret;
1514 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1515 if (!PyArg_ParseTuple(args, "si", &straddr,
1516 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001517 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 "wrong format");
1519 return 0;
1520 }
1521 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1522 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001524 *len_ret = sizeof *addr;
1525 return 1;
1526 }
1527 case BTPROTO_HCI:
1528 {
1529 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001530#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001531 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001532
Alexander Belopolskye239d232010-12-08 23:31:48 +00001533 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001534 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001535 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001536 "wrong format");
1537 return 0;
1538 }
1539 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1540 return 0;
1541#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001542 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1543 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001544 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001545 "wrong format");
1546 return 0;
1547 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 *len_ret = sizeof *addr;
1550 return 1;
1551 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001552#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001553 case BTPROTO_SCO:
1554 {
1555 struct sockaddr_sco *addr;
1556 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 addr = (struct sockaddr_sco *)addr_ret;
1559 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1560 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001561 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001562 "wrong format");
1563 return 0;
1564 }
1565 straddr = PyBytes_AS_STRING(args);
1566 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1567 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001568
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001569 *len_ret = sizeof *addr;
1570 return 1;
1571 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001573 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001574 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 return 0;
1576 }
1577 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001578#endif
1579
Antoine Pitroub156a462010-10-27 20:13:57 +00001580#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001581 case AF_PACKET:
1582 {
1583 struct sockaddr_ll* addr;
1584 struct ifreq ifr;
1585 char *interfaceName;
1586 int protoNumber;
1587 int hatype = 0;
1588 int pkttype = 0;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001589 Py_buffer haddr = {NULL, NULL};
Guido van Rossum48a680c2001-03-02 06:34:14 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 if (!PyTuple_Check(args)) {
1592 PyErr_Format(
1593 PyExc_TypeError,
1594 "getsockaddrarg: "
1595 "AF_PACKET address must be tuple, not %.500s",
1596 Py_TYPE(args)->tp_name);
1597 return 0;
1598 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001599 if (!PyArg_ParseTuple(args, "si|iiy*", &interfaceName,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001600 &protoNumber, &pkttype, &hatype,
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001601 &haddr))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001602 return 0;
1603 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1604 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1605 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1606 s->errorhandler();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001607 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001608 return 0;
1609 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001610 if (haddr.buf && haddr.len > 8) {
1611 PyErr_SetString(PyExc_ValueError,
1612 "Hardware address must be 8 bytes or less");
1613 PyBuffer_Release(&haddr);
1614 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001615 }
1616 if (protoNumber < 0 || protoNumber > 0xffff) {
1617 PyErr_SetString(
1618 PyExc_OverflowError,
1619 "getsockaddrarg: protoNumber must be 0-65535.");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001620 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001621 return 0;
1622 }
1623 addr = (struct sockaddr_ll*)addr_ret;
1624 addr->sll_family = AF_PACKET;
1625 addr->sll_protocol = htons((short)protoNumber);
1626 addr->sll_ifindex = ifr.ifr_ifindex;
1627 addr->sll_pkttype = pkttype;
1628 addr->sll_hatype = hatype;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001629 if (haddr.buf) {
1630 memcpy(&addr->sll_addr, haddr.buf, haddr.len);
1631 addr->sll_halen = haddr.len;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001632 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001633 else
1634 addr->sll_halen = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001635 *len_ret = sizeof *addr;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001636 PyBuffer_Release(&haddr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 return 1;
1638 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001639#endif
1640
Christian Heimes043d6f62008-01-07 17:19:16 +00001641#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001642 case AF_TIPC:
1643 {
1644 unsigned int atype, v1, v2, v3;
1645 unsigned int scope = TIPC_CLUSTER_SCOPE;
1646 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001648 if (!PyTuple_Check(args)) {
1649 PyErr_Format(
1650 PyExc_TypeError,
1651 "getsockaddrarg: "
1652 "AF_TIPC address must be tuple, not %.500s",
1653 Py_TYPE(args)->tp_name);
1654 return 0;
1655 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001657 if (!PyArg_ParseTuple(args,
1658 "IIII|I;Invalid TIPC address format",
1659 &atype, &v1, &v2, &v3, &scope))
1660 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001661
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001662 addr = (struct sockaddr_tipc *) addr_ret;
1663 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001664
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001665 addr->family = AF_TIPC;
1666 addr->scope = scope;
1667 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001668
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001669 if (atype == TIPC_ADDR_NAMESEQ) {
1670 addr->addr.nameseq.type = v1;
1671 addr->addr.nameseq.lower = v2;
1672 addr->addr.nameseq.upper = v3;
1673 } else if (atype == TIPC_ADDR_NAME) {
1674 addr->addr.name.name.type = v1;
1675 addr->addr.name.name.instance = v2;
1676 } else if (atype == TIPC_ADDR_ID) {
1677 addr->addr.id.node = v1;
1678 addr->addr.id.ref = v2;
1679 } else {
1680 /* Shouldn't happen */
1681 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1682 return 0;
1683 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001685 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001687 return 1;
1688 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001689#endif
1690
Vinay Sajiped6783f2014-03-21 11:44:32 +00001691#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001692 case AF_CAN:
1693 switch (s->sock_proto) {
1694 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001695 /* fall-through */
1696 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001697 {
1698 struct sockaddr_can *addr;
1699 PyObject *interfaceName;
1700 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001701 Py_ssize_t len;
1702
Benjamin Peterson18b71912013-05-16 15:29:44 -05001703 addr = (struct sockaddr_can *)addr_ret;
1704
Charles-François Natali47413c12011-10-06 19:47:44 +02001705 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1706 &interfaceName))
1707 return 0;
1708
1709 len = PyBytes_GET_SIZE(interfaceName);
1710
1711 if (len == 0) {
1712 ifr.ifr_ifindex = 0;
Victor Stinner1a62a682014-08-17 19:33:28 +02001713 } else if ((size_t)len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001714 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1715 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001716 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1717 s->errorhandler();
1718 Py_DECREF(interfaceName);
1719 return 0;
1720 }
1721 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001722 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001723 "AF_CAN interface name too long");
1724 Py_DECREF(interfaceName);
1725 return 0;
1726 }
1727
1728 addr->can_family = AF_CAN;
1729 addr->can_ifindex = ifr.ifr_ifindex;
1730
1731 *len_ret = sizeof(*addr);
1732 Py_DECREF(interfaceName);
1733 return 1;
1734 }
1735 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001736 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001737 "getsockaddrarg: unsupported CAN protocol");
1738 return 0;
1739 }
1740#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001741
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001742#ifdef PF_SYSTEM
1743 case PF_SYSTEM:
1744 switch (s->sock_proto) {
1745#ifdef SYSPROTO_CONTROL
1746 case SYSPROTO_CONTROL:
1747 {
1748 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001749
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001750 addr = (struct sockaddr_ctl *)addr_ret;
1751 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001752 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001753
1754 if (PyUnicode_Check(args)) {
1755 struct ctl_info info;
1756 PyObject *ctl_name;
1757
1758 if (!PyArg_Parse(args, "O&",
1759 PyUnicode_FSConverter, &ctl_name)) {
1760 return 0;
1761 }
1762
Victor Stinnerf50e1872015-03-20 11:32:24 +01001763 if (PyBytes_GET_SIZE(ctl_name) > (Py_ssize_t)sizeof(info.ctl_name)) {
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001764 PyErr_SetString(PyExc_ValueError,
1765 "provided string is too long");
1766 Py_DECREF(ctl_name);
1767 return 0;
1768 }
1769 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1770 sizeof(info.ctl_name));
1771 Py_DECREF(ctl_name);
1772
1773 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1774 PyErr_SetString(PyExc_OSError,
1775 "cannot find kernel control with provided name");
1776 return 0;
1777 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001778
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001779 addr->sc_id = info.ctl_id;
1780 addr->sc_unit = 0;
1781 } else if (!PyArg_ParseTuple(args, "II",
1782 &(addr->sc_id), &(addr->sc_unit))) {
1783 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1784 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001785
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001786 return 0;
1787 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001788
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001789 *len_ret = sizeof(*addr);
1790 return 1;
1791 }
1792#endif
1793 default:
1794 PyErr_SetString(PyExc_OSError,
1795 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1796 return 0;
1797 }
1798#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001800 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001801
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001803 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001804 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001805
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001806 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001807}
1808
Guido van Rossum30a685f1991-06-27 15:51:29 +00001809
Guido van Rossum48a680c2001-03-02 06:34:14 +00001810/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001811 Return 1 if the family is known, 0 otherwise. The length is returned
1812 through len_ret. */
1813
1814static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001815getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001816{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001817 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001818
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001819#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001820 case AF_UNIX:
1821 {
1822 *len_ret = sizeof (struct sockaddr_un);
1823 return 1;
1824 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001825#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001826#if defined(AF_NETLINK)
1827 case AF_NETLINK:
1828 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001829 *len_ret = sizeof (struct sockaddr_nl);
1830 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001831 }
1832#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001833
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001834#ifdef AF_RDS
1835 case AF_RDS:
1836 /* RDS sockets use sockaddr_in: fall-through */
1837#endif
1838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001839 case AF_INET:
1840 {
1841 *len_ret = sizeof (struct sockaddr_in);
1842 return 1;
1843 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001844
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001845#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001846 case AF_INET6:
1847 {
1848 *len_ret = sizeof (struct sockaddr_in6);
1849 return 1;
1850 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001851#endif
1852
Hye-Shik Chang81268602004-02-02 06:05:24 +00001853#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001854 case AF_BLUETOOTH:
1855 {
1856 switch(s->sock_proto)
1857 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001859 case BTPROTO_L2CAP:
1860 *len_ret = sizeof (struct sockaddr_l2);
1861 return 1;
1862 case BTPROTO_RFCOMM:
1863 *len_ret = sizeof (struct sockaddr_rc);
1864 return 1;
1865 case BTPROTO_HCI:
1866 *len_ret = sizeof (struct sockaddr_hci);
1867 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001868#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 case BTPROTO_SCO:
1870 *len_ret = sizeof (struct sockaddr_sco);
1871 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001872#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001873 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001874 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001875 "unknown BT protocol");
1876 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001877
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001878 }
1879 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001880#endif
1881
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001882#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001883 case AF_PACKET:
1884 {
1885 *len_ret = sizeof (struct sockaddr_ll);
1886 return 1;
1887 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001888#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001889
Christian Heimes043d6f62008-01-07 17:19:16 +00001890#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001891 case AF_TIPC:
1892 {
1893 *len_ret = sizeof (struct sockaddr_tipc);
1894 return 1;
1895 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001896#endif
1897
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001898#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001899 case AF_CAN:
1900 {
1901 *len_ret = sizeof (struct sockaddr_can);
1902 return 1;
1903 }
1904#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001905
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001906#ifdef PF_SYSTEM
1907 case PF_SYSTEM:
1908 switch(s->sock_proto) {
1909#ifdef SYSPROTO_CONTROL
1910 case SYSPROTO_CONTROL:
1911 *len_ret = sizeof (struct sockaddr_ctl);
1912 return 1;
1913#endif
1914 default:
1915 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1916 "unknown PF_SYSTEM protocol");
1917 return 0;
1918 }
1919#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001923 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001924 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001925 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001927 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001928}
1929
1930
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001931/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1932 Currently, these methods are only compiled if the RFC 2292/3542
1933 CMSG_LEN() macro is available. Older systems seem to have used
1934 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1935 it may be possible to define CMSG_LEN() that way if it's not
1936 provided. Some architectures might need extra padding after the
1937 cmsghdr, however, and CMSG_LEN() would have to take account of
1938 this. */
1939#ifdef CMSG_LEN
1940/* If length is in range, set *result to CMSG_LEN(length) and return
1941 true; otherwise, return false. */
1942static int
1943get_CMSG_LEN(size_t length, size_t *result)
1944{
1945 size_t tmp;
1946
1947 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1948 return 0;
1949 tmp = CMSG_LEN(length);
1950 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1951 return 0;
1952 *result = tmp;
1953 return 1;
1954}
1955
1956#ifdef CMSG_SPACE
1957/* If length is in range, set *result to CMSG_SPACE(length) and return
1958 true; otherwise, return false. */
1959static int
1960get_CMSG_SPACE(size_t length, size_t *result)
1961{
1962 size_t tmp;
1963
1964 /* Use CMSG_SPACE(1) here in order to take account of the padding
1965 necessary before *and* after the data. */
1966 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1967 return 0;
1968 tmp = CMSG_SPACE(length);
1969 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1970 return 0;
1971 *result = tmp;
1972 return 1;
1973}
1974#endif
1975
1976/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1977 pointer in msg->msg_control with at least "space" bytes after it,
1978 and its cmsg_len member inside the buffer. */
1979static int
1980cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1981{
1982 size_t cmsg_offset;
1983 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1984 sizeof(cmsgh->cmsg_len));
1985
Charles-François Natali466517d2011-08-28 18:23:43 +02001986 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001987 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001988 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001989 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1990 annoying under OS X as it's unsigned there and so it triggers a
1991 tautological comparison warning under Clang when compared against 0.
1992 Since the check is valid on other platforms, silence the warning under
1993 Clang. */
1994 #ifdef __clang__
1995 #pragma clang diagnostic push
1996 #pragma clang diagnostic ignored "-Wtautological-compare"
1997 #endif
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02001998 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02001999 #pragma GCC diagnostic push
2000 #pragma GCC diagnostic ignored "-Wtype-limits"
2001 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002002 if (msg->msg_controllen < 0)
2003 return 0;
Serhiy Storchakacaa01f82015-03-05 23:42:24 +02002004 #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))
Serhiy Storchakab48af342015-02-26 15:27:57 +02002005 #pragma GCC diagnostic pop
2006 #endif
Brett Cannonb05cbe62014-01-07 17:01:01 -05002007 #ifdef __clang__
2008 #pragma clang diagnostic pop
2009 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002010 if (space < cmsg_len_end)
2011 space = cmsg_len_end;
2012 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
2013 return (cmsg_offset <= (size_t)-1 - space &&
2014 cmsg_offset + space <= msg->msg_controllen);
2015}
2016
2017/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
2018 *space to number of bytes following it in the buffer and return
2019 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
2020 msg->msg_controllen are valid. */
2021static int
2022get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
2023{
2024 size_t data_offset;
2025 char *data_ptr;
2026
2027 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
2028 return 0;
2029 data_offset = data_ptr - (char *)msg->msg_control;
2030 if (data_offset > msg->msg_controllen)
2031 return 0;
2032 *space = msg->msg_controllen - data_offset;
2033 return 1;
2034}
2035
2036/* If cmsgh is invalid or not contained in the buffer pointed to by
2037 msg->msg_control, return -1. If cmsgh is valid and its associated
2038 data is entirely contained in the buffer, set *data_len to the
2039 length of the associated data and return 0. If only part of the
2040 associated data is contained in the buffer but cmsgh is otherwise
2041 valid, set *data_len to the length contained in the buffer and
2042 return 1. */
2043static int
2044get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
2045{
2046 size_t space, cmsg_data_len;
2047
2048 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
2049 cmsgh->cmsg_len < CMSG_LEN(0))
2050 return -1;
2051 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
2052 if (!get_cmsg_data_space(msg, cmsgh, &space))
2053 return -1;
2054 if (space >= cmsg_data_len) {
2055 *data_len = cmsg_data_len;
2056 return 0;
2057 }
2058 *data_len = space;
2059 return 1;
2060}
2061#endif /* CMSG_LEN */
2062
2063
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002064/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002065
Guido van Rossum73624e91994-10-10 17:59:00 +00002066static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002067sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002069 sock_addr_t addrbuf;
2070 SOCKET_T newfd = INVALID_SOCKET;
2071 socklen_t addrlen;
2072 PyObject *sock = NULL;
2073 PyObject *addr = NULL;
2074 PyObject *res = NULL;
2075 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002076 int async_err = 0;
Victor Stinnerdaf45552013-08-28 00:53:59 +02002077#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2078 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
2079 static int accept4_works = -1;
2080#endif
2081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002082 if (!getsockaddrlen(s, &addrlen))
2083 return NULL;
2084 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002086 if (!IS_SELECTABLE(s))
2087 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00002088
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002089 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002090 do {
Victor Stinner391fa712015-03-31 13:15:31 +02002091 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002092
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002093 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002094 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02002095#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002096 if (accept4_works != 0) {
2097 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
2098 SOCK_CLOEXEC);
2099 if (newfd == INVALID_SOCKET && accept4_works == -1) {
2100 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
2101 accept4_works = (errno != ENOSYS);
2102 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02002103 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002104 if (accept4_works == 0)
2105 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002106#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002107 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002108#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002109 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002110 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002111 } while (newfd < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 if (timeout == 1) {
2113 PyErr_SetString(socket_timeout, "timed out");
2114 return NULL;
2115 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002116 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002118 if (newfd == INVALID_SOCKET)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002119 return (!async_err) ? s->errorhandler() : NULL;
Barry Warsaw752300b1997-01-03 17:18:10 +00002120
Victor Stinnerdaf45552013-08-28 00:53:59 +02002121#ifdef MS_WINDOWS
2122 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2123 PyErr_SetFromWindowsErr(0);
2124 SOCKETCLOSE(newfd);
2125 goto finally;
2126 }
2127#else
2128
2129#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2130 if (!accept4_works)
2131#endif
2132 {
2133 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2134 SOCKETCLOSE(newfd);
2135 goto finally;
2136 }
2137 }
2138#endif
2139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002140 sock = PyLong_FromSocket_t(newfd);
2141 if (sock == NULL) {
2142 SOCKETCLOSE(newfd);
2143 goto finally;
2144 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002145
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002146 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2147 addrlen, s->sock_proto);
2148 if (addr == NULL)
2149 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002150
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002151 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002152
Guido van Rossum67f7a382002-06-06 21:08:16 +00002153finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002154 Py_XDECREF(sock);
2155 Py_XDECREF(addr);
2156 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002157}
2158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002159PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002160"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002161\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002162Wait for an incoming connection. Return a new socket file descriptor\n\
2163representing the connection, and the address of the client.\n\
2164For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002165
Guido van Rossum11ba0942002-06-13 15:07:44 +00002166/* s.setblocking(flag) method. Argument:
2167 False -- non-blocking mode; same as settimeout(0)
2168 True -- blocking mode; same as settimeout(None)
2169*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002170
Guido van Rossum73624e91994-10-10 17:59:00 +00002171static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002172sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002173{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002174 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002176 block = PyLong_AsLong(arg);
2177 if (block == -1 && PyErr_Occurred())
2178 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002179
Victor Stinner71694d52015-03-28 01:18:54 +01002180 s->sock_timeout = block ? -1 : 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002183 Py_INCREF(Py_None);
2184 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002185}
Guido van Rossume4485b01994-09-07 14:32:49 +00002186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002187PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002188"setblocking(flag)\n\
2189\n\
2190Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002191setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002192setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002193
Victor Stinner71694d52015-03-28 01:18:54 +01002194static int
2195socket_parse_timeout(_PyTime_t *timeout, PyObject *timeout_obj)
2196{
2197#ifdef MS_WINDOWS
2198 struct timeval tv;
2199#endif
2200 int overflow = 0;
2201
2202 if (timeout_obj == Py_None) {
2203 *timeout = -1;
2204 return 0;
2205 }
2206
Victor Stinner869e1772015-03-30 03:49:14 +02002207 if (_PyTime_FromSecondsObject(timeout,
2208 timeout_obj, _PyTime_ROUND_CEILING) < 0)
Victor Stinner71694d52015-03-28 01:18:54 +01002209 return -1;
2210
2211 if (*timeout < 0) {
2212 PyErr_SetString(PyExc_ValueError, "Timeout value out of range");
2213 return -1;
2214 }
2215
2216#ifdef MS_WINDOWS
Victor Stinner869e1772015-03-30 03:49:14 +02002217 overflow = (_PyTime_AsTimeval(timeout, &tv, _PyTime_ROUND_CEILING) < 0);
Victor Stinner71694d52015-03-28 01:18:54 +01002218#endif
2219#ifndef HAVE_POLL
Victor Stinner869e1772015-03-30 03:49:14 +02002220 timeout = _PyTime_AsMilliseconds(timeout, _PyTime_ROUND_CEILING);
Victor Stinner71694d52015-03-28 01:18:54 +01002221 overflow = (timeout > INT_MAX);
2222#endif
2223 if (overflow) {
2224 PyErr_SetString(PyExc_OverflowError,
2225 "timeout doesn't fit into C timeval");
2226 return -1;
2227 }
2228
2229 return 0;
2230}
2231
Guido van Rossum11ba0942002-06-13 15:07:44 +00002232/* s.settimeout(timeout) method. Argument:
2233 None -- no timeout, blocking mode; same as setblocking(True)
2234 0.0 -- non-blocking mode; same as setblocking(False)
2235 > 0 -- timeout mode; operations time out after timeout seconds
2236 < 0 -- illegal; raises an exception
2237*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002238static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002239sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002240{
Victor Stinner71694d52015-03-28 01:18:54 +01002241 _PyTime_t timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002242
Victor Stinner71694d52015-03-28 01:18:54 +01002243 if (socket_parse_timeout(&timeout, arg) < 0)
2244 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 s->sock_timeout = timeout;
Victor Stinner71694d52015-03-28 01:18:54 +01002247 internal_setblocking(s, timeout < 0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002249 Py_INCREF(Py_None);
2250 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002251}
2252
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002253PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002254"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002255\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002256Set a timeout on socket operations. 'timeout' can be a float,\n\
2257giving in seconds, or None. Setting a timeout of None disables\n\
2258the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002259Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002260
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002261/* s.gettimeout() method.
2262 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002263static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002264sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002265{
Victor Stinner71694d52015-03-28 01:18:54 +01002266 if (s->sock_timeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002267 Py_INCREF(Py_None);
2268 return Py_None;
2269 }
Victor Stinner71694d52015-03-28 01:18:54 +01002270 else {
2271 double seconds = _PyTime_AsSecondsDouble(s->sock_timeout);
2272 return PyFloat_FromDouble(seconds);
2273 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002274}
2275
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002276PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002277"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002278\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002279Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002280operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002281operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002282
Guido van Rossumaee08791992-09-08 09:05:33 +00002283/* s.setsockopt() method.
2284 With an integer third argument, sets an integer option.
2285 With a string third argument, sets an option from a buffer;
2286 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002287
Guido van Rossum73624e91994-10-10 17:59:00 +00002288static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002289sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002291 int level;
2292 int optname;
2293 int res;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002294 Py_buffer optval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002295 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002297 if (PyArg_ParseTuple(args, "iii:setsockopt",
2298 &level, &optname, &flag)) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002299 res = setsockopt(s->sock_fd, level, optname, &flag, sizeof flag);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002300 }
2301 else {
2302 PyErr_Clear();
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002303 if (!PyArg_ParseTuple(args, "iiy*:setsockopt",
2304 &level, &optname, &optval))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002305 return NULL;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02002306 res = setsockopt(s->sock_fd, level, optname, optval.buf, optval.len);
2307 PyBuffer_Release(&optval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 if (res < 0)
2310 return s->errorhandler();
2311 Py_INCREF(Py_None);
2312 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002313}
2314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002315PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002316"setsockopt(level, option, value)\n\
2317\n\
2318Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002319The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002320
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002321
Guido van Rossumaee08791992-09-08 09:05:33 +00002322/* s.getsockopt() method.
2323 With two arguments, retrieves an integer option.
2324 With a third integer argument, retrieves a string buffer of that size;
2325 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002326
Guido van Rossum73624e91994-10-10 17:59:00 +00002327static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002328sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 int level;
2331 int optname;
2332 int res;
2333 PyObject *buf;
2334 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002335
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002336 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2337 &level, &optname, &buflen))
2338 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002339
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002340 if (buflen == 0) {
2341 int flag = 0;
2342 socklen_t flagsize = sizeof flag;
2343 res = getsockopt(s->sock_fd, level, optname,
2344 (void *)&flag, &flagsize);
2345 if (res < 0)
2346 return s->errorhandler();
2347 return PyLong_FromLong(flag);
2348 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002349 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002350 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002351 "getsockopt buflen out of range");
2352 return NULL;
2353 }
2354 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2355 if (buf == NULL)
2356 return NULL;
2357 res = getsockopt(s->sock_fd, level, optname,
2358 (void *)PyBytes_AS_STRING(buf), &buflen);
2359 if (res < 0) {
2360 Py_DECREF(buf);
2361 return s->errorhandler();
2362 }
2363 _PyBytes_Resize(&buf, buflen);
2364 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002365}
2366
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002367PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002368"getsockopt(level, option[, buffersize]) -> value\n\
2369\n\
2370Get a socket option. See the Unix manual for level and option.\n\
2371If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002372string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002373
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002374
Fred Drake728819a2000-07-01 03:40:12 +00002375/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002376
Guido van Rossum73624e91994-10-10 17:59:00 +00002377static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002378sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002379{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002380 sock_addr_t addrbuf;
2381 int addrlen;
2382 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2385 return NULL;
2386 Py_BEGIN_ALLOW_THREADS
2387 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2388 Py_END_ALLOW_THREADS
2389 if (res < 0)
2390 return s->errorhandler();
2391 Py_INCREF(Py_None);
2392 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002393}
2394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002395PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002396"bind(address)\n\
2397\n\
2398Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002399pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002400sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002401
Guido van Rossum30a685f1991-06-27 15:51:29 +00002402
2403/* s.close() method.
2404 Set the file descriptor to -1 so operations tried subsequently
2405 will surely fail. */
2406
Guido van Rossum73624e91994-10-10 17:59:00 +00002407static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002408sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002409{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002411
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002412 /* We do not want to retry upon EINTR: see http://lwn.net/Articles/576478/
2413 * and http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-09/3000.html
2414 * for more details.
2415 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002416 if ((fd = s->sock_fd) != -1) {
2417 s->sock_fd = -1;
2418 Py_BEGIN_ALLOW_THREADS
2419 (void) SOCKETCLOSE(fd);
2420 Py_END_ALLOW_THREADS
2421 }
2422 Py_INCREF(Py_None);
2423 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002424}
2425
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002426PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002427"close()\n\
2428\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002429Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002430
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002431static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002432sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002433{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002434 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002435 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002436 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002437}
2438
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002439PyDoc_STRVAR(detach_doc,
2440"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002441\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002442Close the socket object without closing the underlying file descriptor.\n\
2443The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002444can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002445
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002446static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002447internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002448 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 timeout = 0;
Victor Stinnerb7df3142015-03-27 22:59:32 +01002453
2454 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002455 res = connect(s->sock_fd, addr, addrlen);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002456 Py_END_ALLOW_THREADS
2457
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002458#ifdef MS_WINDOWS
2459
Victor Stinner71694d52015-03-28 01:18:54 +01002460 if (s->sock_timeout > 0
Victor Stinnerb7df3142015-03-27 22:59:32 +01002461 && res < 0 && WSAGetLastError() == WSAEWOULDBLOCK
2462 && IS_SELECTABLE(s)) {
2463 /* This is a mess. Best solution: trust select */
2464 fd_set fds;
2465 fd_set fds_exc;
2466 struct timeval tv;
Victor Stinner71694d52015-03-28 01:18:54 +01002467 int conv;
2468
Victor Stinner869e1772015-03-30 03:49:14 +02002469 _PyTime_AsTimeval_noraise(s->sock_timeout, &tv, _PyTime_ROUND_CEILING);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002470
2471 Py_BEGIN_ALLOW_THREADS
Victor Stinnerb7df3142015-03-27 22:59:32 +01002472 FD_ZERO(&fds);
2473 FD_SET(s->sock_fd, &fds);
2474 FD_ZERO(&fds_exc);
2475 FD_SET(s->sock_fd, &fds_exc);
2476 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2477 NULL, &fds, &fds_exc, &tv);
2478 Py_END_ALLOW_THREADS
2479
2480 if (res == 0) {
2481 res = WSAEWOULDBLOCK;
2482 timeout = 1;
2483 } else if (res > 0) {
2484 if (FD_ISSET(s->sock_fd, &fds))
2485 /* The socket is in the writable set - this
2486 means connected */
2487 res = 0;
2488 else {
2489 /* As per MS docs, we need to call getsockopt()
2490 to get the underlying error */
2491 int res_size = sizeof res;
2492 /* It must be in the exception set */
2493 assert(FD_ISSET(s->sock_fd, &fds_exc));
2494 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2495 (char *)&res, &res_size))
2496 /* getsockopt also clears WSAGetLastError,
2497 so reset it back. */
2498 WSASetLastError(res);
2499 else
2500 res = WSAGetLastError();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002501 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002502 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01002503 /* else if (res < 0) an error occurred */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002504 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002505
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002506 if (res < 0)
2507 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002508
2509#else
2510
Victor Stinner71694d52015-03-28 01:18:54 +01002511 if (s->sock_timeout > 0
Victor Stinnerb7df3142015-03-27 22:59:32 +01002512 && res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2513
Victor Stinnere6951c62015-03-31 13:50:44 +02002514 timeout = internal_connect_select(s);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002515
2516 if (timeout == 0) {
2517 /* Bug #1019808: in case of an EINPROGRESS,
2518 use getsockopt(SO_ERROR) to get the real
2519 error. */
2520 socklen_t res_size = sizeof res;
2521 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2522 SO_ERROR, &res, &res_size);
2523 if (res == EISCONN)
2524 res = 0;
2525 errno = res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002526 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01002527 else if (timeout == -1) {
2528 res = errno; /* had error */
2529 }
2530 else
2531 res = EWOULDBLOCK; /* timed out */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002532 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002534 if (res < 0)
2535 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002536
2537#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002538 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002539
Victor Stinner71694d52015-03-28 01:18:54 +01002540 assert(res >= 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002541 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002542}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002543
Fred Drake728819a2000-07-01 03:40:12 +00002544/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002545
Guido van Rossum73624e91994-10-10 17:59:00 +00002546static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002547sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002548{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002549 sock_addr_t addrbuf;
2550 int addrlen;
2551 int res;
2552 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2555 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002556
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002557 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002559 if (timeout == 1) {
2560 PyErr_SetString(socket_timeout, "timed out");
2561 return NULL;
2562 }
Victor Stinner71694d52015-03-28 01:18:54 +01002563 if (res < 0)
2564 return NULL;
2565 if (res != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 return s->errorhandler();
Victor Stinner71694d52015-03-28 01:18:54 +01002567 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002568 Py_INCREF(Py_None);
2569 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002570}
2571
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002572PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002573"connect(address)\n\
2574\n\
2575Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002576is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002577
Guido van Rossum30a685f1991-06-27 15:51:29 +00002578
Fred Drake728819a2000-07-01 03:40:12 +00002579/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002580
2581static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002582sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002583{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002584 sock_addr_t addrbuf;
2585 int addrlen;
2586 int res;
2587 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002589 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2590 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002591
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002593
Victor Stinner71694d52015-03-28 01:18:54 +01002594 if (res < 0)
2595 return NULL;
2596
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002597 /* Signals are not errors (though they may raise exceptions). Adapted
2598 from PyErr_SetFromErrnoWithFilenameObject(). */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002599 if (res == EINTR && PyErr_CheckSignals())
2600 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002601
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002602 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002603}
2604
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002605PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002606"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002607\n\
2608This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002609instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002610
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002611
Guido van Rossumed233a51992-06-23 09:07:03 +00002612/* s.fileno() method */
2613
Guido van Rossum73624e91994-10-10 17:59:00 +00002614static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002615sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002617 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002618}
2619
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002620PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002621"fileno() -> integer\n\
2622\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002623Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002624
Guido van Rossumed233a51992-06-23 09:07:03 +00002625
Guido van Rossumc89705d1992-11-26 08:54:07 +00002626/* s.getsockname() method */
2627
Guido van Rossum73624e91994-10-10 17:59:00 +00002628static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002629sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002631 sock_addr_t addrbuf;
2632 int res;
2633 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002634
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002635 if (!getsockaddrlen(s, &addrlen))
2636 return NULL;
2637 memset(&addrbuf, 0, addrlen);
2638 Py_BEGIN_ALLOW_THREADS
2639 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2640 Py_END_ALLOW_THREADS
2641 if (res < 0)
2642 return s->errorhandler();
2643 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2644 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002645}
2646
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002647PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002648"getsockname() -> address info\n\
2649\n\
2650Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002651info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002652
Guido van Rossumc89705d1992-11-26 08:54:07 +00002653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002654#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002655/* s.getpeername() method */
2656
Guido van Rossum73624e91994-10-10 17:59:00 +00002657static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002658sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002659{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002660 sock_addr_t addrbuf;
2661 int res;
2662 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002664 if (!getsockaddrlen(s, &addrlen))
2665 return NULL;
2666 memset(&addrbuf, 0, addrlen);
2667 Py_BEGIN_ALLOW_THREADS
2668 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2669 Py_END_ALLOW_THREADS
2670 if (res < 0)
2671 return s->errorhandler();
2672 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2673 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002674}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002675
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002676PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002677"getpeername() -> address info\n\
2678\n\
2679Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002680info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002681
Guido van Rossumb6775db1994-08-01 11:34:53 +00002682#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002683
2684
Guido van Rossum30a685f1991-06-27 15:51:29 +00002685/* s.listen(n) method */
2686
Guido van Rossum73624e91994-10-10 17:59:00 +00002687static PyObject *
Charles-François Natali644b8f52014-05-22 19:45:39 +01002688sock_listen(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002689{
Charles-François Natali644b8f52014-05-22 19:45:39 +01002690 /* We try to choose a default backlog high enough to avoid connection drops
2691 * for common workloads, yet not too high to limit resource usage. */
2692 int backlog = Py_MIN(SOMAXCONN, 128);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002693 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002694
Charles-François Natali644b8f52014-05-22 19:45:39 +01002695 if (!PyArg_ParseTuple(args, "|i:listen", &backlog))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002696 return NULL;
Charles-François Natali644b8f52014-05-22 19:45:39 +01002697
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002698 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002699 /* To avoid problems on systems that don't allow a negative backlog
2700 * (which doesn't make sense anyway) we force a minimum value of 0. */
2701 if (backlog < 0)
2702 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002703 res = listen(s->sock_fd, backlog);
2704 Py_END_ALLOW_THREADS
2705 if (res < 0)
2706 return s->errorhandler();
2707 Py_INCREF(Py_None);
2708 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002709}
2710
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002711PyDoc_STRVAR(listen_doc,
Charles-François Natali644b8f52014-05-22 19:45:39 +01002712"listen([backlog])\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002713\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002714Enable a server to accept connections. If backlog is specified, it must be\n\
2715at least 0 (if it is lower, it is set to 0); it specifies the number of\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002716unaccepted connections that the system will allow before refusing new\n\
Charles-François Natali644b8f52014-05-22 19:45:39 +01002717connections. If not specified, a default reasonable value is chosen.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002718
2719
Thomas Wouters477c8d52006-05-27 19:21:47 +00002720/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002721 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002722 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002723 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002724 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002725 * also possible that we return a number of bytes smaller than the request
2726 * bytes.
2727 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002728
Antoine Pitrou19467d22010-08-17 19:33:30 +00002729static Py_ssize_t
2730sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002731{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002732 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002733 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002734 int async_err = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002735
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002736 if (!IS_SELECTABLE(s)) {
2737 select_error();
2738 return -1;
2739 }
2740 if (len == 0) {
2741 /* If 0 bytes were requested, do nothing. */
2742 return 0;
2743 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002744
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002745 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002746 do {
Victor Stinner391fa712015-03-31 13:15:31 +02002747 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002748
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002749 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002750 Py_BEGIN_ALLOW_THREADS
Victor Stinner14b9b112013-06-25 00:37:25 +02002751#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002752 if (len > INT_MAX)
2753 len = INT_MAX;
2754 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002755#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002756 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002757#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002758 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002759 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002760 } while (outlen < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Thomas Wouters477c8d52006-05-27 19:21:47 +00002761
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 if (timeout == 1) {
2763 PyErr_SetString(socket_timeout, "timed out");
2764 return -1;
2765 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002766 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002767 if (outlen < 0) {
2768 /* Note: the call to errorhandler() ALWAYS indirectly returned
2769 NULL, so ignore its return value */
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002770 if (!async_err)
2771 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 return -1;
2773 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002774 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002775}
2776
Guido van Rossum48a680c2001-03-02 06:34:14 +00002777
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002778/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002779
Guido van Rossum73624e91994-10-10 17:59:00 +00002780static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002781sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002782{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002783 Py_ssize_t recvlen, outlen;
2784 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002785 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002786
Antoine Pitrou19467d22010-08-17 19:33:30 +00002787 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002790 if (recvlen < 0) {
2791 PyErr_SetString(PyExc_ValueError,
2792 "negative buffersize in recv");
2793 return NULL;
2794 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002795
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002796 /* Allocate a new string. */
2797 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2798 if (buf == NULL)
2799 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002801 /* Call the guts */
2802 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2803 if (outlen < 0) {
2804 /* An error occurred, release the string and return an
2805 error. */
2806 Py_DECREF(buf);
2807 return NULL;
2808 }
2809 if (outlen != recvlen) {
2810 /* We did not read as many bytes as we anticipated, resize the
2811 string if possible and be successful. */
2812 _PyBytes_Resize(&buf, outlen);
2813 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002816}
2817
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002818PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002819"recv(buffersize[, flags]) -> data\n\
2820\n\
2821Receive up to buffersize bytes from the socket. For the optional flags\n\
2822argument, see the Unix manual. When no data is available, block until\n\
2823at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002824the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002825
Guido van Rossum30a685f1991-06-27 15:51:29 +00002826
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002827/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002828
Thomas Wouters477c8d52006-05-27 19:21:47 +00002829static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002830sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002833
Antoine Pitrou19467d22010-08-17 19:33:30 +00002834 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002835 Py_buffer pbuf;
2836 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002837 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002839 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002840 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002841 &pbuf, &recvlen, &flags))
2842 return NULL;
2843 buf = pbuf.buf;
2844 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002845
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002846 if (recvlen < 0) {
2847 PyBuffer_Release(&pbuf);
2848 PyErr_SetString(PyExc_ValueError,
2849 "negative buffersize in recv_into");
2850 return NULL;
2851 }
2852 if (recvlen == 0) {
2853 /* If nbytes was not specified, use the buffer's length */
2854 recvlen = buflen;
2855 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002856
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002857 /* Check if the buffer is large enough */
2858 if (buflen < recvlen) {
2859 PyBuffer_Release(&pbuf);
2860 PyErr_SetString(PyExc_ValueError,
2861 "buffer too small for requested bytes");
2862 return NULL;
2863 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002864
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002865 /* Call the guts */
2866 readlen = sock_recv_guts(s, buf, recvlen, flags);
2867 if (readlen < 0) {
2868 /* Return an error. */
2869 PyBuffer_Release(&pbuf);
2870 return NULL;
2871 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 PyBuffer_Release(&pbuf);
2874 /* Return the number of bytes read. Note that we do not do anything
2875 special here in the case that readlen < recvlen. */
2876 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002877}
2878
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002879PyDoc_STRVAR(recv_into_doc,
2880"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002881\n\
2882A version of recv() that stores its data into a buffer rather than creating \n\
2883a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2884is not specified (or 0), receive up to the size available in the given buffer.\n\
2885\n\
2886See recv() for documentation about the flags.");
2887
2888
2889/*
Christian Heimes99170a52007-12-19 02:07:34 +00002890 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2891 * into a char buffer. If you have any inc/def ref to do to the objects that
2892 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002893 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002894 * that it is also possible that we return a number of bytes smaller than the
2895 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896 *
2897 * 'addr' is a return value for the address object. Note that you must decref
2898 * it yourself.
2899 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002900static Py_ssize_t
2901sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002902 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002903{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002904 sock_addr_t addrbuf;
2905 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002906 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002907 socklen_t addrlen;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002908 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002910 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002911
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002912 if (!getsockaddrlen(s, &addrlen))
2913 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002915 if (!IS_SELECTABLE(s)) {
2916 select_error();
2917 return -1;
2918 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002919
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002920 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002921 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002922 memset(&addrbuf, 0, addrlen);
Victor Stinner391fa712015-03-31 13:15:31 +02002923 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01002924
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002925 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01002926 Py_BEGIN_ALLOW_THREADS
Victor Stinnere990c6e2013-11-16 00:18:58 +01002927#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002928 if (len > INT_MAX)
2929 len = INT_MAX;
2930 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
2931 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002932#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002933 n = recvfrom(s->sock_fd, cbuf, len, flags,
2934 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002935#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01002936 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002937 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002938 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00002939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002940 if (timeout == 1) {
2941 PyErr_SetString(socket_timeout, "timed out");
2942 return -1;
2943 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002944 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002945 if (n < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00002946 if (!async_err)
2947 s->errorhandler();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002948 return -1;
2949 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002951 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2952 addrlen, s->sock_proto)))
2953 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002955 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002956}
2957
2958/* s.recvfrom(nbytes [,flags]) method */
2959
2960static PyObject *
2961sock_recvfrom(PySocketSockObject *s, PyObject *args)
2962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002963 PyObject *buf = NULL;
2964 PyObject *addr = NULL;
2965 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002966 int flags = 0;
2967 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002968
Antoine Pitrou19467d22010-08-17 19:33:30 +00002969 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002970 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002971
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002972 if (recvlen < 0) {
2973 PyErr_SetString(PyExc_ValueError,
2974 "negative buffersize in recvfrom");
2975 return NULL;
2976 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002978 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2979 if (buf == NULL)
2980 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002981
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002982 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2983 recvlen, flags, &addr);
2984 if (outlen < 0) {
2985 goto finally;
2986 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002988 if (outlen != recvlen) {
2989 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002990 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002991 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002992 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 goto finally;
2994 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002996 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002997
2998finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002999 Py_XDECREF(buf);
3000 Py_XDECREF(addr);
3001 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003002}
3003
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003004PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003005"recvfrom(buffersize[, flags]) -> (data, address info)\n\
3006\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003007Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003008
Thomas Wouters477c8d52006-05-27 19:21:47 +00003009
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003010/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003011
3012static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003013sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00003014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003015 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00003016
Antoine Pitrou19467d22010-08-17 19:33:30 +00003017 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003018 Py_buffer pbuf;
3019 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003020 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003022 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003023
Antoine Pitrou19467d22010-08-17 19:33:30 +00003024 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003025 kwlist, &pbuf,
3026 &recvlen, &flags))
3027 return NULL;
3028 buf = pbuf.buf;
3029 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003031 if (recvlen < 0) {
3032 PyBuffer_Release(&pbuf);
3033 PyErr_SetString(PyExc_ValueError,
3034 "negative buffersize in recvfrom_into");
3035 return NULL;
3036 }
3037 if (recvlen == 0) {
3038 /* If nbytes was not specified, use the buffer's length */
3039 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05003040 } else if (recvlen > buflen) {
3041 PyBuffer_Release(&pbuf);
3042 PyErr_SetString(PyExc_ValueError,
3043 "nbytes is greater than the length of the buffer");
3044 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003045 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003047 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
3048 if (readlen < 0) {
3049 PyBuffer_Release(&pbuf);
3050 /* Return an error */
3051 Py_XDECREF(addr);
3052 return NULL;
3053 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 PyBuffer_Release(&pbuf);
3056 /* Return the number of bytes read and the address. Note that we do
3057 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00003058 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003059}
3060
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003061PyDoc_STRVAR(recvfrom_into_doc,
3062"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00003063\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003064Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00003065
3066
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003067/* The sendmsg() and recvmsg[_into]() methods require a working
3068 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3069#ifdef CMSG_LEN
3070/*
3071 * Call recvmsg() with the supplied iovec structures, flags, and
3072 * ancillary data buffer size (controllen). Returns the tuple return
3073 * value for recvmsg() or recvmsg_into(), with the first item provided
3074 * by the supplied makeval() function. makeval() will be called with
3075 * the length read and makeval_data as arguments, and must return a
3076 * new reference (which will be decrefed if there is a subsequent
3077 * error). On error, closes any file descriptors received via
3078 * SCM_RIGHTS.
3079 */
3080static PyObject *
3081sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
3082 int flags, Py_ssize_t controllen,
3083 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
3084{
3085 ssize_t bytes_received = -1;
3086 int timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003087 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003088 sock_addr_t addrbuf;
3089 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003090 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003091 PyObject *cmsg_list = NULL, *retval = NULL;
3092 void *controlbuf = NULL;
3093 struct cmsghdr *cmsgh;
3094 size_t cmsgdatalen = 0;
3095 int cmsg_status;
3096
3097 /* XXX: POSIX says that msg_name and msg_namelen "shall be
3098 ignored" when the socket is connected (Linux fills them in
3099 anyway for AF_UNIX sockets at least). Normally msg_namelen
3100 seems to be set to 0 if there's no address, but try to
3101 initialize msg_name to something that won't be mistaken for a
3102 real address if that doesn't happen. */
3103 if (!getsockaddrlen(s, &addrbuflen))
3104 return NULL;
3105 memset(&addrbuf, 0, addrbuflen);
3106 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
3107
3108 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
3109 PyErr_SetString(PyExc_ValueError,
3110 "invalid ancillary data buffer length");
3111 return NULL;
3112 }
3113 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
3114 return PyErr_NoMemory();
3115
3116 /* Make the system call. */
3117 if (!IS_SELECTABLE(s)) {
3118 select_error();
3119 goto finally;
3120 }
3121
3122 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003123 do {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003124 msg.msg_name = SAS2SA(&addrbuf);
3125 msg.msg_namelen = addrbuflen;
3126 msg.msg_iov = iov;
3127 msg.msg_iovlen = iovlen;
3128 msg.msg_control = controlbuf;
3129 msg.msg_controllen = controllen;
Victor Stinner391fa712015-03-31 13:15:31 +02003130 timeout = internal_select(s, 0, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003131
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003132 if (timeout == 1) {
3133 PyErr_SetString(socket_timeout, "timed out");
3134 goto finally;
3135 }
Victor Stinnerb7df3142015-03-27 22:59:32 +01003136
3137 if (!timeout) {
3138 Py_BEGIN_ALLOW_THREADS;
3139 bytes_received = recvmsg(s->sock_fd, &msg, flags);
3140 Py_END_ALLOW_THREADS;
3141 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003142 } while (bytes_received < 0 && errno == EINTR &&
3143 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003144 END_SELECT_LOOP(s)
3145
3146 if (bytes_received < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003147 if (!async_err)
3148 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003149 goto finally;
3150 }
3151
3152 /* Make list of (level, type, data) tuples from control messages. */
3153 if ((cmsg_list = PyList_New(0)) == NULL)
3154 goto err_closefds;
3155 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
3156 implementations didn't do so. */
3157 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3158 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3159 PyObject *bytes, *tuple;
3160 int tmp;
3161
3162 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3163 if (cmsg_status != 0) {
3164 if (PyErr_WarnEx(PyExc_RuntimeWarning,
3165 "received malformed or improperly-truncated "
3166 "ancillary data", 1) == -1)
3167 goto err_closefds;
3168 }
3169 if (cmsg_status < 0)
3170 break;
3171 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003172 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003173 goto err_closefds;
3174 }
3175
3176 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3177 cmsgdatalen);
3178 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3179 (int)cmsgh->cmsg_type, bytes);
3180 if (tuple == NULL)
3181 goto err_closefds;
3182 tmp = PyList_Append(cmsg_list, tuple);
3183 Py_DECREF(tuple);
3184 if (tmp != 0)
3185 goto err_closefds;
3186
3187 if (cmsg_status != 0)
3188 break;
3189 }
3190
3191 retval = Py_BuildValue("NOiN",
3192 (*makeval)(bytes_received, makeval_data),
3193 cmsg_list,
3194 (int)msg.msg_flags,
3195 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3196 ((msg.msg_namelen > addrbuflen) ?
3197 addrbuflen : msg.msg_namelen),
3198 s->sock_proto));
3199 if (retval == NULL)
3200 goto err_closefds;
3201
3202finally:
3203 Py_XDECREF(cmsg_list);
3204 PyMem_Free(controlbuf);
3205 return retval;
3206
3207err_closefds:
3208#ifdef SCM_RIGHTS
3209 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3210 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3211 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3212 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3213 if (cmsg_status < 0)
3214 break;
3215 if (cmsgh->cmsg_level == SOL_SOCKET &&
3216 cmsgh->cmsg_type == SCM_RIGHTS) {
3217 size_t numfds;
3218 int *fdp;
3219
3220 numfds = cmsgdatalen / sizeof(int);
3221 fdp = (int *)CMSG_DATA(cmsgh);
3222 while (numfds-- > 0)
3223 close(*fdp++);
3224 }
3225 if (cmsg_status != 0)
3226 break;
3227 }
3228#endif /* SCM_RIGHTS */
3229 goto finally;
3230}
3231
3232
3233static PyObject *
3234makeval_recvmsg(ssize_t received, void *data)
3235{
3236 PyObject **buf = data;
3237
3238 if (received < PyBytes_GET_SIZE(*buf))
3239 _PyBytes_Resize(buf, received);
3240 Py_XINCREF(*buf);
3241 return *buf;
3242}
3243
3244/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3245
3246static PyObject *
3247sock_recvmsg(PySocketSockObject *s, PyObject *args)
3248{
3249 Py_ssize_t bufsize, ancbufsize = 0;
3250 int flags = 0;
3251 struct iovec iov;
3252 PyObject *buf = NULL, *retval = NULL;
3253
3254 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3255 return NULL;
3256
3257 if (bufsize < 0) {
3258 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3259 return NULL;
3260 }
3261 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3262 return NULL;
3263 iov.iov_base = PyBytes_AS_STRING(buf);
3264 iov.iov_len = bufsize;
3265
3266 /* Note that we're passing a pointer to *our pointer* to the bytes
3267 object here (&buf); makeval_recvmsg() may incref the object, or
3268 deallocate it and set our pointer to NULL. */
3269 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3270 &makeval_recvmsg, &buf);
3271 Py_XDECREF(buf);
3272 return retval;
3273}
3274
3275PyDoc_STRVAR(recvmsg_doc,
3276"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3277\n\
3278Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3279socket. The ancbufsize argument sets the size in bytes of the\n\
3280internal buffer used to receive the ancillary data; it defaults to 0,\n\
3281meaning that no ancillary data will be received. Appropriate buffer\n\
3282sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3283CMSG_LEN(), and items which do not fit into the buffer might be\n\
3284truncated or discarded. The flags argument defaults to 0 and has the\n\
3285same meaning as for recv().\n\
3286\n\
3287The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3288The data item is a bytes object holding the non-ancillary data\n\
3289received. The ancdata item is a list of zero or more tuples\n\
3290(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3291(control messages) received: cmsg_level and cmsg_type are integers\n\
3292specifying the protocol level and protocol-specific type respectively,\n\
3293and cmsg_data is a bytes object holding the associated data. The\n\
3294msg_flags item is the bitwise OR of various flags indicating\n\
3295conditions on the received message; see your system documentation for\n\
3296details. If the receiving socket is unconnected, address is the\n\
3297address of the sending socket, if available; otherwise, its value is\n\
3298unspecified.\n\
3299\n\
3300If recvmsg() raises an exception after the system call returns, it\n\
3301will first attempt to close any file descriptors received via the\n\
3302SCM_RIGHTS mechanism.");
3303
3304
3305static PyObject *
3306makeval_recvmsg_into(ssize_t received, void *data)
3307{
3308 return PyLong_FromSsize_t(received);
3309}
3310
3311/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3312
3313static PyObject *
3314sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3315{
3316 Py_ssize_t ancbufsize = 0;
3317 int flags = 0;
3318 struct iovec *iovs = NULL;
3319 Py_ssize_t i, nitems, nbufs = 0;
3320 Py_buffer *bufs = NULL;
3321 PyObject *buffers_arg, *fast, *retval = NULL;
3322
3323 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3324 &buffers_arg, &ancbufsize, &flags))
3325 return NULL;
3326
3327 if ((fast = PySequence_Fast(buffers_arg,
3328 "recvmsg_into() argument 1 must be an "
3329 "iterable")) == NULL)
3330 return NULL;
3331 nitems = PySequence_Fast_GET_SIZE(fast);
3332 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003333 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003334 goto finally;
3335 }
3336
3337 /* Fill in an iovec for each item, and save the Py_buffer
3338 structs to release afterwards. */
3339 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3340 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3341 PyErr_NoMemory();
3342 goto finally;
3343 }
3344 for (; nbufs < nitems; nbufs++) {
3345 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3346 "w*;recvmsg_into() argument 1 must be an iterable "
3347 "of single-segment read-write buffers",
3348 &bufs[nbufs]))
3349 goto finally;
3350 iovs[nbufs].iov_base = bufs[nbufs].buf;
3351 iovs[nbufs].iov_len = bufs[nbufs].len;
3352 }
3353
3354 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3355 &makeval_recvmsg_into, NULL);
3356finally:
3357 for (i = 0; i < nbufs; i++)
3358 PyBuffer_Release(&bufs[i]);
3359 PyMem_Free(bufs);
3360 PyMem_Free(iovs);
3361 Py_DECREF(fast);
3362 return retval;
3363}
3364
3365PyDoc_STRVAR(recvmsg_into_doc,
3366"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3367\n\
3368Receive normal data and ancillary data from the socket, scattering the\n\
3369non-ancillary data into a series of buffers. The buffers argument\n\
3370must be an iterable of objects that export writable buffers\n\
3371(e.g. bytearray objects); these will be filled with successive chunks\n\
3372of the non-ancillary data until it has all been written or there are\n\
3373no more buffers. The ancbufsize argument sets the size in bytes of\n\
3374the internal buffer used to receive the ancillary data; it defaults to\n\
33750, meaning that no ancillary data will be received. Appropriate\n\
3376buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3377or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3378truncated or discarded. The flags argument defaults to 0 and has the\n\
3379same meaning as for recv().\n\
3380\n\
3381The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3382The nbytes item is the total number of bytes of non-ancillary data\n\
3383written into the buffers. The ancdata item is a list of zero or more\n\
3384tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3385data (control messages) received: cmsg_level and cmsg_type are\n\
3386integers specifying the protocol level and protocol-specific type\n\
3387respectively, and cmsg_data is a bytes object holding the associated\n\
3388data. The msg_flags item is the bitwise OR of various flags\n\
3389indicating conditions on the received message; see your system\n\
3390documentation for details. If the receiving socket is unconnected,\n\
3391address is the address of the sending socket, if available; otherwise,\n\
3392its value is unspecified.\n\
3393\n\
3394If recvmsg_into() raises an exception after the system call returns,\n\
3395it will first attempt to close any file descriptors received via the\n\
3396SCM_RIGHTS mechanism.");
3397#endif /* CMSG_LEN */
3398
3399
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003400/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003401
Guido van Rossum73624e91994-10-10 17:59:00 +00003402static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003403sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003404{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003406 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003407 int async_err = 0;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003408 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003409 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003411 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3412 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003413
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003414 if (!IS_SELECTABLE(s)) {
3415 PyBuffer_Release(&pbuf);
3416 return select_error();
3417 }
3418 buf = pbuf.buf;
3419 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003420
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003421 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003422 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003423 timeout = internal_select(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003424
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003425 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003426 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003427#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003428 if (len > INT_MAX)
3429 len = INT_MAX;
3430 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003431#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003432 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003433#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003434 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003435 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003436 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003437 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003438 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003439 PyErr_SetString(socket_timeout, "timed out");
3440 return NULL;
3441 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003442 END_SELECT_LOOP(s)
3443
3444 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003445 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003446 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003447 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003448}
3449
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003450PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003451"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003452\n\
3453Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003454argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003455sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003456
3457
3458/* s.sendall(data [,flags]) method */
3459
3460static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003461sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003463 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003464 Py_ssize_t len, n = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003465 int async_err = 0;
3466 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003469 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3470 return NULL;
3471 buf = pbuf.buf;
3472 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003474 if (!IS_SELECTABLE(s)) {
3475 PyBuffer_Release(&pbuf);
3476 return select_error();
3477 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003479 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003480 timeout = internal_select(s, 1, s->sock_timeout);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003482 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003483 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003484 Py_BEGIN_ALLOW_THREADS
Christian Heimesaf01f662013-12-21 16:19:10 +01003485#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003486 if (len > INT_MAX)
3487 len = INT_MAX;
3488 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003489#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003490 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003491#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003492 Py_END_ALLOW_THREADS
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003493 }
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003494 if (timeout == 1) {
3495 PyBuffer_Release(&pbuf);
3496 PyErr_SetString(socket_timeout, "timed out");
3497 return NULL;
3498 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003499 if (n >= 0) {
3500 buf += n;
3501 len -= n;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003502 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003503 } while (len > 0 && (n >= 0 || errno == EINTR) &&
3504 !(async_err = PyErr_CheckSignals()));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003505 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003506
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003507 if (n < 0 || async_err)
3508 return (!async_err) ? s->errorhandler() : NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 Py_INCREF(Py_None);
3511 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003512}
3513
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003514PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003515"sendall(data[, flags])\n\
3516\n\
3517Send a data string to the socket. For the optional flags\n\
3518argument, see the Unix manual. This calls send() repeatedly\n\
3519until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003520to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003521
Guido van Rossum30a685f1991-06-27 15:51:29 +00003522
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003523/* s.sendto(data, [flags,] sockaddr) 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_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003528 Py_buffer pbuf;
3529 PyObject *addro;
3530 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003531 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003532 sock_addr_t addrbuf;
3533 int addrlen, n = -1, flags, timeout;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003534 int async_err = 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003536 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003537 arglen = PyTuple_Size(args);
3538 switch (arglen) {
3539 case 2:
3540 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3541 break;
3542 case 3:
3543 PyArg_ParseTuple(args, "y*iO:sendto",
3544 &pbuf, &flags, &addro);
3545 break;
3546 default:
3547 PyErr_Format(PyExc_TypeError,
3548 "sendto() takes 2 or 3 arguments (%d given)",
3549 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003550 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003552 if (PyErr_Occurred())
3553 return NULL;
3554
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003555 buf = pbuf.buf;
3556 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003558 if (!IS_SELECTABLE(s)) {
3559 PyBuffer_Release(&pbuf);
3560 return select_error();
3561 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003563 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3564 PyBuffer_Release(&pbuf);
3565 return NULL;
3566 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003567
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003568 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003569 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003570 timeout = internal_select(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003571
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003572 if (!timeout) {
Victor Stinnerb7df3142015-03-27 22:59:32 +01003573 Py_BEGIN_ALLOW_THREADS
Victor Stinner14b9b112013-06-25 00:37:25 +02003574#ifdef MS_WINDOWS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003575 if (len > INT_MAX)
3576 len = INT_MAX;
3577 n = sendto(s->sock_fd, buf, (int)len, flags,
3578 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003579#else
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003580 n = sendto(s->sock_fd, buf, len, flags,
3581 SAS2SA(&addrbuf), addrlen);
Victor Stinner9a644b22013-06-24 23:47:41 +02003582#endif
Victor Stinnerb7df3142015-03-27 22:59:32 +01003583 Py_END_ALLOW_THREADS
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003584 }
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003585 } while (n < 0 && errno == EINTR && !(async_err = PyErr_CheckSignals()));
Guido van Rossum67f7a382002-06-06 21:08:16 +00003586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003587 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003588 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003589 PyErr_SetString(socket_timeout, "timed out");
3590 return NULL;
3591 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003592 END_SELECT_LOOP(s)
3593 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003594 if (n < 0)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003595 return (!async_err) ? s->errorhandler() : NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003596 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003597}
3598
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003599PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003600"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003601\n\
3602Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003603For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003604
Guido van Rossum30a685f1991-06-27 15:51:29 +00003605
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003606/* The sendmsg() and recvmsg[_into]() methods require a working
3607 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3608#ifdef CMSG_LEN
3609/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3610
3611static PyObject *
3612sock_sendmsg(PySocketSockObject *s, PyObject *args)
3613{
3614 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3615 Py_buffer *databufs = NULL;
3616 struct iovec *iovs = NULL;
3617 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003618 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003619 struct cmsginfo {
3620 int level;
3621 int type;
3622 Py_buffer data;
3623 } *cmsgs = NULL;
3624 void *controlbuf = NULL;
3625 size_t controllen, controllen_last;
3626 ssize_t bytes_sent = -1;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003627 int async_err = 0;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003628 int addrlen, timeout, flags = 0;
3629 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3630 *cmsg_fast = NULL, *retval = NULL;
3631
3632 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3633 &data_arg, &cmsg_arg, &flags, &addr_arg))
3634 return NULL;
3635
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003636 /* Parse destination address. */
3637 if (addr_arg != NULL && addr_arg != Py_None) {
3638 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3639 goto finally;
3640 msg.msg_name = &addrbuf;
3641 msg.msg_namelen = addrlen;
3642 }
3643
3644 /* Fill in an iovec for each message part, and save the Py_buffer
3645 structs to release afterwards. */
3646 if ((data_fast = PySequence_Fast(data_arg,
3647 "sendmsg() argument 1 must be an "
3648 "iterable")) == NULL)
3649 goto finally;
3650 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3651 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003652 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003653 goto finally;
3654 }
3655 msg.msg_iovlen = ndataparts;
3656 if (ndataparts > 0 &&
3657 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3658 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3659 PyErr_NoMemory();
3660 goto finally;
3661 }
3662 for (; ndatabufs < ndataparts; ndatabufs++) {
3663 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3664 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003665 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003666 &databufs[ndatabufs]))
3667 goto finally;
3668 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3669 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3670 }
3671
3672 if (cmsg_arg == NULL)
3673 ncmsgs = 0;
3674 else {
3675 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3676 "sendmsg() argument 2 must be an "
3677 "iterable")) == NULL)
3678 goto finally;
3679 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3680 }
3681
3682#ifndef CMSG_SPACE
3683 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003684 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003685 "sending multiple control messages is not supported "
3686 "on this system");
3687 goto finally;
3688 }
3689#endif
3690 /* Save level, type and Py_buffer for each control message,
3691 and calculate total size. */
3692 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3693 PyErr_NoMemory();
3694 goto finally;
3695 }
3696 controllen = controllen_last = 0;
3697 while (ncmsgbufs < ncmsgs) {
3698 size_t bufsize, space;
3699
3700 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3701 "(iiy*):[sendmsg() ancillary data items]",
3702 &cmsgs[ncmsgbufs].level,
3703 &cmsgs[ncmsgbufs].type,
3704 &cmsgs[ncmsgbufs].data))
3705 goto finally;
3706 bufsize = cmsgs[ncmsgbufs++].data.len;
3707
3708#ifdef CMSG_SPACE
3709 if (!get_CMSG_SPACE(bufsize, &space)) {
3710#else
3711 if (!get_CMSG_LEN(bufsize, &space)) {
3712#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003713 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003714 goto finally;
3715 }
3716 controllen += space;
3717 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003718 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003719 goto finally;
3720 }
3721 controllen_last = controllen;
3722 }
3723
3724 /* Construct ancillary data block from control message info. */
3725 if (ncmsgbufs > 0) {
3726 struct cmsghdr *cmsgh = NULL;
3727
3728 if ((msg.msg_control = controlbuf =
3729 PyMem_Malloc(controllen)) == NULL) {
3730 PyErr_NoMemory();
3731 goto finally;
3732 }
3733 msg.msg_controllen = controllen;
3734
3735 /* Need to zero out the buffer as a workaround for glibc's
3736 CMSG_NXTHDR() implementation. After getting the pointer to
3737 the next header, it checks its (uninitialized) cmsg_len
3738 member to see if the "message" fits in the buffer, and
3739 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003740 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003741 memset(controlbuf, 0, controllen);
3742
3743 for (i = 0; i < ncmsgbufs; i++) {
3744 size_t msg_len, data_len = cmsgs[i].data.len;
3745 int enough_space = 0;
3746
3747 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3748 if (cmsgh == NULL) {
3749 PyErr_Format(PyExc_RuntimeError,
3750 "unexpected NULL result from %s()",
3751 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3752 goto finally;
3753 }
3754 if (!get_CMSG_LEN(data_len, &msg_len)) {
3755 PyErr_SetString(PyExc_RuntimeError,
3756 "item size out of range for CMSG_LEN()");
3757 goto finally;
3758 }
3759 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3760 size_t space;
3761
3762 cmsgh->cmsg_len = msg_len;
3763 if (get_cmsg_data_space(&msg, cmsgh, &space))
3764 enough_space = (space >= data_len);
3765 }
3766 if (!enough_space) {
3767 PyErr_SetString(PyExc_RuntimeError,
3768 "ancillary data does not fit in calculated "
3769 "space");
3770 goto finally;
3771 }
3772 cmsgh->cmsg_level = cmsgs[i].level;
3773 cmsgh->cmsg_type = cmsgs[i].type;
3774 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3775 }
3776 }
3777
3778 /* Make the system call. */
3779 if (!IS_SELECTABLE(s)) {
3780 select_error();
3781 goto finally;
3782 }
3783
3784 BEGIN_SELECT_LOOP(s)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003785 do {
Victor Stinner391fa712015-03-31 13:15:31 +02003786 timeout = internal_select(s, 1, interval);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003787
3788 if (!timeout) {
3789 Py_BEGIN_ALLOW_THREADS;
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003790 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
Victor Stinnerb7df3142015-03-27 22:59:32 +01003791 Py_END_ALLOW_THREADS;
3792 }
3793
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003794 if (timeout == 1) {
3795 PyErr_SetString(socket_timeout, "timed out");
3796 goto finally;
3797 }
3798 } while (bytes_sent < 0 && errno == EINTR &&
3799 !(async_err = PyErr_CheckSignals()));
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003800 END_SELECT_LOOP(s)
3801
3802 if (bytes_sent < 0) {
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003803 if (!async_err)
3804 s->errorhandler();
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003805 goto finally;
3806 }
3807 retval = PyLong_FromSsize_t(bytes_sent);
3808
3809finally:
3810 PyMem_Free(controlbuf);
3811 for (i = 0; i < ncmsgbufs; i++)
3812 PyBuffer_Release(&cmsgs[i].data);
3813 PyMem_Free(cmsgs);
3814 Py_XDECREF(cmsg_fast);
3815 for (i = 0; i < ndatabufs; i++)
3816 PyBuffer_Release(&databufs[i]);
3817 PyMem_Free(databufs);
3818 PyMem_Free(iovs);
3819 Py_XDECREF(data_fast);
3820 return retval;
3821}
3822
3823PyDoc_STRVAR(sendmsg_doc,
3824"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3825\n\
3826Send normal and ancillary data to the socket, gathering the\n\
3827non-ancillary data from a series of buffers and concatenating it into\n\
3828a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003829data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003830The ancdata argument specifies the ancillary data (control messages)\n\
3831as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3832cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3833protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003834is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003835argument defaults to 0 and has the same meaning as for send(). If\n\
3836address is supplied and not None, it sets a destination address for\n\
3837the message. The return value is the number of bytes of non-ancillary\n\
3838data sent.");
3839#endif /* CMSG_LEN */
3840
3841
Guido van Rossum30a685f1991-06-27 15:51:29 +00003842/* s.shutdown(how) method */
3843
Guido van Rossum73624e91994-10-10 17:59:00 +00003844static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003845sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003846{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003847 int how;
3848 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003849
Serhiy Storchaka78980432013-01-15 01:12:17 +02003850 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003851 if (how == -1 && PyErr_Occurred())
3852 return NULL;
3853 Py_BEGIN_ALLOW_THREADS
3854 res = shutdown(s->sock_fd, how);
3855 Py_END_ALLOW_THREADS
3856 if (res < 0)
3857 return s->errorhandler();
3858 Py_INCREF(Py_None);
3859 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003860}
3861
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003862PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003863"shutdown(flag)\n\
3864\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003865Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3866of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003867
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003868#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003869static PyObject*
3870sock_ioctl(PySocketSockObject *s, PyObject *arg)
3871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003872 unsigned long cmd = SIO_RCVALL;
3873 PyObject *argO;
3874 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003875
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003876 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3877 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 switch (cmd) {
3880 case SIO_RCVALL: {
3881 unsigned int option = RCVALL_ON;
3882 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3883 return NULL;
3884 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3885 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3886 return set_error();
3887 }
3888 return PyLong_FromUnsignedLong(recv); }
3889 case SIO_KEEPALIVE_VALS: {
3890 struct tcp_keepalive ka;
3891 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3892 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3893 return NULL;
3894 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3895 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3896 return set_error();
3897 }
3898 return PyLong_FromUnsignedLong(recv); }
3899 default:
3900 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3901 return NULL;
3902 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003903}
3904PyDoc_STRVAR(sock_ioctl_doc,
3905"ioctl(cmd, option) -> long\n\
3906\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003907Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3908SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3909SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003910#endif
3911
3912#if defined(MS_WINDOWS)
3913static PyObject*
3914sock_share(PySocketSockObject *s, PyObject *arg)
3915{
3916 WSAPROTOCOL_INFO info;
3917 DWORD processId;
3918 int result;
3919
3920 if (!PyArg_ParseTuple(arg, "I", &processId))
3921 return NULL;
3922
3923 Py_BEGIN_ALLOW_THREADS
3924 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3925 Py_END_ALLOW_THREADS
3926 if (result == SOCKET_ERROR)
3927 return set_error();
3928 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3929}
3930PyDoc_STRVAR(sock_share_doc,
3931"share(process_id) -> bytes\n\
3932\n\
3933Share the socket with another process. The target process id\n\
3934must be provided and the resulting bytes object passed to the target\n\
3935process. There the shared socket can be instantiated by calling\n\
3936socket.fromshare().");
3937
Christian Heimesfaf2f632008-01-06 16:59:19 +00003938
3939#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003940
3941/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003942
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003943static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3945 accept_doc},
3946 {"bind", (PyCFunction)sock_bind, METH_O,
3947 bind_doc},
3948 {"close", (PyCFunction)sock_close, METH_NOARGS,
3949 close_doc},
3950 {"connect", (PyCFunction)sock_connect, METH_O,
3951 connect_doc},
3952 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3953 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003954 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3955 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003956 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3957 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003958#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003959 {"getpeername", (PyCFunction)sock_getpeername,
3960 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003961#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003962 {"getsockname", (PyCFunction)sock_getsockname,
3963 METH_NOARGS, getsockname_doc},
3964 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3965 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003966#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3968 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003969#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003970#if defined(MS_WINDOWS)
3971 {"share", (PyCFunction)sock_share, METH_VARARGS,
3972 sock_share_doc},
3973#endif
Charles-François Natali644b8f52014-05-22 19:45:39 +01003974 {"listen", (PyCFunction)sock_listen, METH_VARARGS,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003975 listen_doc},
3976 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3977 recv_doc},
3978 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3979 recv_into_doc},
3980 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3981 recvfrom_doc},
3982 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3983 recvfrom_into_doc},
3984 {"send", (PyCFunction)sock_send, METH_VARARGS,
3985 send_doc},
3986 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3987 sendall_doc},
3988 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3989 sendto_doc},
3990 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3991 setblocking_doc},
3992 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3993 settimeout_doc},
3994 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3995 gettimeout_doc},
3996 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3997 setsockopt_doc},
3998 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3999 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004000#ifdef CMSG_LEN
4001 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
4002 recvmsg_doc},
4003 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
4004 recvmsg_into_doc,},
4005 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
4006 sendmsg_doc},
4007#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004009};
4010
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004011/* SockObject members */
4012static PyMemberDef sock_memberlist[] = {
4013 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
4014 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
4015 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004016 {0},
4017};
Guido van Rossum30a685f1991-06-27 15:51:29 +00004018
Victor Stinner71694d52015-03-28 01:18:54 +01004019static PyGetSetDef sock_getsetlist[] = {
4020 {"timeout", (getter)sock_gettimeout, NULL, PyDoc_STR("the socket timeout")},
4021 {NULL} /* sentinel */
4022};
4023
Guido van Rossum73624e91994-10-10 17:59:00 +00004024/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00004025 First close the file description. */
4026
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004027static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004028sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004029{
Antoine Pitroue033e062010-10-29 10:38:18 +00004030 if (s->sock_fd != -1) {
4031 PyObject *exc, *val, *tb;
4032 Py_ssize_t old_refcount = Py_REFCNT(s);
4033 ++Py_REFCNT(s);
4034 PyErr_Fetch(&exc, &val, &tb);
4035 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
4036 "unclosed %R", s))
4037 /* Spurious errors can appear at shutdown */
4038 if (PyErr_ExceptionMatches(PyExc_Warning))
4039 PyErr_WriteUnraisable((PyObject *) s);
4040 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004041 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00004042 Py_REFCNT(s) = old_refcount;
4043 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004044 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004045}
4046
Guido van Rossum30a685f1991-06-27 15:51:29 +00004047
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004048static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004049sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004050{
Victor Stinnere254e532014-07-26 14:36:55 +02004051 long sock_fd;
4052 /* On Windows, this test is needed because SOCKET_T is unsigned */
4053 if (s->sock_fd == INVALID_SOCKET) {
4054 sock_fd = -1;
4055 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004056#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02004057 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004058 /* this can occur on Win64, and actually there is a special
4059 ugly printf formatter for decimal pointer length integer
4060 printing, only bother if necessary*/
4061 PyErr_SetString(PyExc_OverflowError,
4062 "no printf formatter to display "
4063 "the socket descriptor in decimal");
4064 return NULL;
4065 }
Fred Drakea04eaad2000-06-30 02:46:07 +00004066#endif
Victor Stinnere254e532014-07-26 14:36:55 +02004067 else
4068 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004069 return PyUnicode_FromFormat(
4070 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02004071 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004072 s->sock_type,
4073 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004074}
4075
4076
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004077/* Create a new, uninitialized socket object. */
4078
4079static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004080sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004084 new = type->tp_alloc(type, 0);
4085 if (new != NULL) {
4086 ((PySocketSockObject *)new)->sock_fd = -1;
Victor Stinner71694d52015-03-28 01:18:54 +01004087 ((PySocketSockObject *)new)->sock_timeout = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004088 ((PySocketSockObject *)new)->errorhandler = &set_error;
4089 }
4090 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004091}
4092
4093
4094/* Initialize a new socket object. */
4095
Victor Stinnerdaf45552013-08-28 00:53:59 +02004096#ifdef SOCK_CLOEXEC
4097/* socket() and socketpair() fail with EINVAL on Linux kernel older
4098 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
4099static int sock_cloexec_works = -1;
4100#endif
4101
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004102/*ARGSUSED*/
4103static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00004104sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004105{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004106 PySocketSockObject *s = (PySocketSockObject *)self;
4107 PyObject *fdobj = NULL;
4108 SOCKET_T fd = INVALID_SOCKET;
4109 int family = AF_INET, type = SOCK_STREAM, proto = 0;
4110 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02004111#ifndef MS_WINDOWS
4112#ifdef SOCK_CLOEXEC
4113 int *atomic_flag_works = &sock_cloexec_works;
4114#else
4115 int *atomic_flag_works = NULL;
4116#endif
4117#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004119 if (!PyArg_ParseTupleAndKeywords(args, kwds,
4120 "|iiiO:socket", keywords,
4121 &family, &type, &proto, &fdobj))
4122 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004123
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004124 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00004125#ifdef MS_WINDOWS
4126 /* recreate a socket that was duplicated */
4127 if (PyBytes_Check(fdobj)) {
4128 WSAPROTOCOL_INFO info;
4129 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
4130 PyErr_Format(PyExc_ValueError,
4131 "socket descriptor string has wrong size, "
4132 "should be %zu bytes.", sizeof(info));
4133 return -1;
4134 }
4135 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
4136 Py_BEGIN_ALLOW_THREADS
4137 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4138 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
4139 Py_END_ALLOW_THREADS
4140 if (fd == INVALID_SOCKET) {
4141 set_error();
4142 return -1;
4143 }
4144 family = info.iAddressFamily;
4145 type = info.iSocketType;
4146 proto = info.iProtocol;
4147 }
4148 else
4149#endif
4150 {
4151 fd = PyLong_AsSocket_t(fdobj);
4152 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4153 return -1;
4154 if (fd == INVALID_SOCKET) {
4155 PyErr_SetString(PyExc_ValueError,
4156 "can't use invalid socket value");
4157 return -1;
4158 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 }
4160 }
4161 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02004162#ifdef MS_WINDOWS
4163 /* Windows implementation */
4164#ifndef WSA_FLAG_NO_HANDLE_INHERIT
4165#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
4166#endif
4167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004168 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02004169 if (support_wsa_no_inherit) {
4170 fd = WSASocket(family, type, proto,
4171 NULL, 0,
4172 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
4173 if (fd == INVALID_SOCKET) {
4174 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
4175 support_wsa_no_inherit = 0;
4176 fd = socket(family, type, proto);
4177 }
4178 }
4179 else {
4180 fd = socket(family, type, proto);
4181 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004182 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004184 if (fd == INVALID_SOCKET) {
4185 set_error();
4186 return -1;
4187 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004188
4189 if (!support_wsa_no_inherit) {
4190 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4191 closesocket(fd);
4192 PyErr_SetFromWindowsErr(0);
4193 return -1;
4194 }
4195 }
4196#else
4197 /* UNIX */
4198 Py_BEGIN_ALLOW_THREADS
4199#ifdef SOCK_CLOEXEC
4200 if (sock_cloexec_works != 0) {
4201 fd = socket(family, type | SOCK_CLOEXEC, proto);
4202 if (sock_cloexec_works == -1) {
4203 if (fd >= 0) {
4204 sock_cloexec_works = 1;
4205 }
4206 else if (errno == EINVAL) {
4207 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4208 sock_cloexec_works = 0;
4209 fd = socket(family, type, proto);
4210 }
4211 }
4212 }
4213 else
4214#endif
4215 {
4216 fd = socket(family, type, proto);
4217 }
4218 Py_END_ALLOW_THREADS
4219
4220 if (fd == INVALID_SOCKET) {
4221 set_error();
4222 return -1;
4223 }
4224
4225 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4226 SOCKETCLOSE(fd);
4227 return -1;
4228 }
4229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 }
4231 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004234
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004235}
4236
4237
Guido van Rossumb6775db1994-08-01 11:34:53 +00004238/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004239
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004240static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004241 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4242 "_socket.socket", /* tp_name */
4243 sizeof(PySocketSockObject), /* tp_basicsize */
4244 0, /* tp_itemsize */
4245 (destructor)sock_dealloc, /* tp_dealloc */
4246 0, /* tp_print */
4247 0, /* tp_getattr */
4248 0, /* tp_setattr */
4249 0, /* tp_reserved */
4250 (reprfunc)sock_repr, /* tp_repr */
4251 0, /* tp_as_number */
4252 0, /* tp_as_sequence */
4253 0, /* tp_as_mapping */
4254 0, /* tp_hash */
4255 0, /* tp_call */
4256 0, /* tp_str */
4257 PyObject_GenericGetAttr, /* tp_getattro */
4258 0, /* tp_setattro */
4259 0, /* tp_as_buffer */
4260 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4261 sock_doc, /* tp_doc */
4262 0, /* tp_traverse */
4263 0, /* tp_clear */
4264 0, /* tp_richcompare */
4265 0, /* tp_weaklistoffset */
4266 0, /* tp_iter */
4267 0, /* tp_iternext */
4268 sock_methods, /* tp_methods */
4269 sock_memberlist, /* tp_members */
Victor Stinner71694d52015-03-28 01:18:54 +01004270 sock_getsetlist, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004271 0, /* tp_base */
4272 0, /* tp_dict */
4273 0, /* tp_descr_get */
4274 0, /* tp_descr_set */
4275 0, /* tp_dictoffset */
4276 sock_initobj, /* tp_init */
4277 PyType_GenericAlloc, /* tp_alloc */
4278 sock_new, /* tp_new */
4279 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004280};
4281
Guido van Rossum30a685f1991-06-27 15:51:29 +00004282
Guido van Rossum81194471991-07-27 21:42:02 +00004283/* Python interface to gethostname(). */
4284
4285/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004286static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004287socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004288{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004289#ifdef MS_WINDOWS
4290 /* Don't use winsock's gethostname, as this returns the ANSI
4291 version of the hostname, whereas we need a Unicode string.
4292 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004293 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004294 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004295 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004296 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004297
4298 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004299 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004300
4301 if (GetLastError() != ERROR_MORE_DATA)
4302 return PyErr_SetFromWindowsErr(0);
4303
4304 if (size == 0)
4305 return PyUnicode_New(0, 0);
4306
4307 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4308 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004309 name = PyMem_New(wchar_t, size);
4310 if (!name) {
4311 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004312 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004313 }
Victor Stinner74168972011-11-17 01:11:36 +01004314 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4315 name,
4316 &size))
4317 {
4318 PyMem_Free(name);
4319 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004320 }
Victor Stinner74168972011-11-17 01:11:36 +01004321
4322 result = PyUnicode_FromWideChar(name, size);
4323 PyMem_Free(name);
4324 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004325#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004326 char buf[1024];
4327 int res;
4328 Py_BEGIN_ALLOW_THREADS
4329 res = gethostname(buf, (int) sizeof buf - 1);
4330 Py_END_ALLOW_THREADS
4331 if (res < 0)
4332 return set_error();
4333 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004334 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004335#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004336}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004337
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004338PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004339"gethostname() -> string\n\
4340\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004341Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004342
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004343#ifdef HAVE_SETHOSTNAME
4344PyDoc_STRVAR(sethostname_doc,
4345"sethostname(name)\n\n\
4346Sets the hostname to name.");
4347
4348static PyObject *
4349socket_sethostname(PyObject *self, PyObject *args)
4350{
4351 PyObject *hnobj;
4352 Py_buffer buf;
4353 int res, flag = 0;
4354
Christian Heimesd2774c72013-06-19 02:06:29 +02004355#ifdef _AIX
4356/* issue #18259, not declared in any useful header file */
4357extern int sethostname(const char *, size_t);
4358#endif
4359
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004360 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4361 PyErr_Clear();
4362 if (!PyArg_ParseTuple(args, "O&:sethostname",
4363 PyUnicode_FSConverter, &hnobj))
4364 return NULL;
4365 flag = 1;
4366 }
4367 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4368 if (!res) {
4369 res = sethostname(buf.buf, buf.len);
4370 PyBuffer_Release(&buf);
4371 }
4372 if (flag)
4373 Py_DECREF(hnobj);
4374 if (res)
4375 return set_error();
4376 Py_RETURN_NONE;
4377}
4378#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004379
Guido van Rossum30a685f1991-06-27 15:51:29 +00004380/* Python interface to gethostbyname(name). */
4381
4382/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004383static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004384socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004385{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004386 char *name;
4387 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004388 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004389
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004390 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 return NULL;
4392 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004393 goto finally;
4394 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4395finally:
4396 PyMem_Free(name);
4397 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004398}
4399
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004400PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004401"gethostbyname(host) -> address\n\
4402\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004403Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004404
4405
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004406/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4407
4408static PyObject *
Victor Stinner1a62a682014-08-17 19:33:28 +02004409gethost_common(struct hostent *h, struct sockaddr *addr, size_t alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004410{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004411 char **pch;
4412 PyObject *rtn_tuple = (PyObject *)NULL;
4413 PyObject *name_list = (PyObject *)NULL;
4414 PyObject *addr_list = (PyObject *)NULL;
4415 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 if (h == NULL) {
4418 /* Let's get real error message to return */
4419 set_herror(h_errno);
4420 return NULL;
4421 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004422
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004423 if (h->h_addrtype != af) {
4424 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004425 errno = EAFNOSUPPORT;
4426 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004427 return NULL;
4428 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004430 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004431
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 case AF_INET:
4433 if (alen < sizeof(struct sockaddr_in))
4434 return NULL;
4435 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004436
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004437#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 case AF_INET6:
4439 if (alen < sizeof(struct sockaddr_in6))
4440 return NULL;
4441 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004442#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004444 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004445
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004446 if ((name_list = PyList_New(0)) == NULL)
4447 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004448
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 if ((addr_list = PyList_New(0)) == NULL)
4450 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 /* SF #1511317: h_aliases can be NULL */
4453 if (h->h_aliases) {
4454 for (pch = h->h_aliases; *pch != NULL; pch++) {
4455 int status;
4456 tmp = PyUnicode_FromString(*pch);
4457 if (tmp == NULL)
4458 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004459
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004460 status = PyList_Append(name_list, tmp);
4461 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004462
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004463 if (status)
4464 goto err;
4465 }
4466 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004467
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004468 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4469 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004471 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004473 case AF_INET:
4474 {
4475 struct sockaddr_in sin;
4476 memset(&sin, 0, sizeof(sin));
4477 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004478#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004480#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004481 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4482 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004484 if (pch == h->h_addr_list && alen >= sizeof(sin))
4485 memcpy((char *) addr, &sin, sizeof(sin));
4486 break;
4487 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004488
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004489#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004490 case AF_INET6:
4491 {
4492 struct sockaddr_in6 sin6;
4493 memset(&sin6, 0, sizeof(sin6));
4494 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004495#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004497#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004498 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4499 tmp = makeipaddr((struct sockaddr *)&sin6,
4500 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004501
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4503 memcpy((char *) addr, &sin6, sizeof(sin6));
4504 break;
4505 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004506#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004508 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004509 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004510 "unsupported address family");
4511 return NULL;
4512 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004513
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004514 if (tmp == NULL)
4515 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004516
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004517 status = PyList_Append(addr_list, tmp);
4518 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004520 if (status)
4521 goto err;
4522 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004523
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004525
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004526 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 Py_XDECREF(name_list);
4528 Py_XDECREF(addr_list);
4529 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004530}
4531
4532
4533/* Python interface to gethostbyname_ex(name). */
4534
4535/*ARGSUSED*/
4536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004537socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 char *name;
4540 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004541 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004542 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004543 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004544#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004545 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004546#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004547 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004548#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004549 char buf[16384];
4550 int buf_len = (sizeof buf) - 1;
4551 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004552#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004553#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004555#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004556#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004557
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004558 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004560 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004561 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004563#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004564#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004565 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004566 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004567#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004568 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004569#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 memset((void *) &data, '\0', sizeof(data));
4571 result = gethostbyname_r(name, &hp_allocated, &data);
4572 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004573#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004574#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004575#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004576 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004578 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004579#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004580 Py_END_ALLOW_THREADS
4581 /* Some C libraries would require addr.__ss_family instead of
4582 addr.ss_family.
4583 Therefore, we cast the sockaddr_storage into sockaddr to
4584 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004585 sa = SAS2SA(&addr);
4586 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004587 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004588#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004589 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004590#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004591finally:
4592 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004593 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004594}
4595
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004596PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004597"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4598\n\
4599Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004600for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004601
4602
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004603/* Python interface to gethostbyaddr(IP). */
4604
4605/*ARGSUSED*/
4606static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004607socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004608{
Charles-François Natali8b759652011-12-23 16:44:51 +01004609 sock_addr_t addr;
4610 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004611 char *ip_num;
4612 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004613 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004614#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004615 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004616#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004618#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004619 /* glibcs up to 2.10 assume that the buf argument to
4620 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4621 does not ensure. The attribute below instructs the compiler
4622 to maintain this alignment. */
4623 char buf[16384] Py_ALIGNED(8);
4624 int buf_len = (sizeof buf) - 1;
4625 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004626#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004627#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004628 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004629#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004630#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004631 char *ap;
4632 int al;
4633 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004634
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004635 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 return NULL;
4637 af = AF_UNSPEC;
4638 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004639 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 af = sa->sa_family;
4641 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004642 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 switch (af) {
4644 case AF_INET:
4645 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4646 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4647 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004648#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004649 case AF_INET6:
4650 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4651 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4652 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004653#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004654 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004655 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004656 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004657 }
4658 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004659#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004660#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004661 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004662 &hp_allocated, buf, buf_len,
4663 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004664#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004665 h = gethostbyaddr_r(ap, al, af,
4666 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004667#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004668 memset((void *) &data, '\0', sizeof(data));
4669 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4670 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004671#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004672#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004673#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004674 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004676 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004677#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004678 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004679 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004680#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004681 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004682#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004683finally:
4684 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004686}
4687
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004688PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004689"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4690\n\
4691Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004692for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004693
Guido van Rossum30a685f1991-06-27 15:51:29 +00004694
4695/* Python interface to getservbyname(name).
4696 This only returns the port number, since the other info is already
4697 known or not useful (like the list of aliases). */
4698
4699/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004700static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004701socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 char *name, *proto=NULL;
4704 struct servent *sp;
4705 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4706 return NULL;
4707 Py_BEGIN_ALLOW_THREADS
4708 sp = getservbyname(name, proto);
4709 Py_END_ALLOW_THREADS
4710 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004711 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004712 return NULL;
4713 }
4714 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004715}
4716
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004717PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004718"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004719\n\
4720Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004721The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4722otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004723
Guido van Rossum30a685f1991-06-27 15:51:29 +00004724
Barry Warsaw11b91a02004-06-28 00:50:43 +00004725/* Python interface to getservbyport(port).
4726 This only returns the service name, since the other info is already
4727 known or not useful (like the list of aliases). */
4728
4729/*ARGSUSED*/
4730static PyObject *
4731socket_getservbyport(PyObject *self, PyObject *args)
4732{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004733 int port;
4734 char *proto=NULL;
4735 struct servent *sp;
4736 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4737 return NULL;
4738 if (port < 0 || port > 0xffff) {
4739 PyErr_SetString(
4740 PyExc_OverflowError,
4741 "getservbyport: port must be 0-65535.");
4742 return NULL;
4743 }
4744 Py_BEGIN_ALLOW_THREADS
4745 sp = getservbyport(htons((short)port), proto);
4746 Py_END_ALLOW_THREADS
4747 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004748 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004749 return NULL;
4750 }
4751 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004752}
4753
4754PyDoc_STRVAR(getservbyport_doc,
4755"getservbyport(port[, protocolname]) -> string\n\
4756\n\
4757Return the service name from a port number and protocol name.\n\
4758The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4759otherwise any protocol will match.");
4760
Guido van Rossum3901d851996-12-19 16:35:04 +00004761/* Python interface to getprotobyname(name).
4762 This only returns the protocol number, since the other info is
4763 already known or not useful (like the list of aliases). */
4764
4765/*ARGSUSED*/
4766static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004767socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004768{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004769 char *name;
4770 struct protoent *sp;
4771 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4772 return NULL;
4773 Py_BEGIN_ALLOW_THREADS
4774 sp = getprotobyname(name);
4775 Py_END_ALLOW_THREADS
4776 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004777 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004778 return NULL;
4779 }
4780 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004781}
4782
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004783PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004784"getprotobyname(name) -> integer\n\
4785\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004786Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004787
Guido van Rossum3901d851996-12-19 16:35:04 +00004788
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004789#ifndef NO_DUP
4790/* dup() function for socket fds */
4791
4792static PyObject *
4793socket_dup(PyObject *self, PyObject *fdobj)
4794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004795 SOCKET_T fd, newfd;
4796 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004797#ifdef MS_WINDOWS
4798 WSAPROTOCOL_INFO info;
4799#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 fd = PyLong_AsSocket_t(fdobj);
4802 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4803 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004804
Victor Stinnerdaf45552013-08-28 00:53:59 +02004805#ifdef MS_WINDOWS
4806 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4807 return set_error();
4808
4809 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4810 FROM_PROTOCOL_INFO,
4811 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004812 if (newfd == INVALID_SOCKET)
4813 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004814
Victor Stinnerdaf45552013-08-28 00:53:59 +02004815 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4816 closesocket(newfd);
4817 PyErr_SetFromWindowsErr(0);
4818 return NULL;
4819 }
4820#else
4821 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4822 newfd = _Py_dup(fd);
4823 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004824 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004825#endif
4826
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004827 newfdobj = PyLong_FromSocket_t(newfd);
4828 if (newfdobj == NULL)
4829 SOCKETCLOSE(newfd);
4830 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004831}
4832
4833PyDoc_STRVAR(dup_doc,
4834"dup(integer) -> integer\n\
4835\n\
4836Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4837sockets; on some platforms os.dup() won't work for socket file descriptors.");
4838#endif
4839
4840
Dave Cole331708b2004-08-09 04:51:41 +00004841#ifdef HAVE_SOCKETPAIR
4842/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004843 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004844 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004845
4846/*ARGSUSED*/
4847static PyObject *
4848socket_socketpair(PyObject *self, PyObject *args)
4849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 PySocketSockObject *s0 = NULL, *s1 = NULL;
4851 SOCKET_T sv[2];
4852 int family, type = SOCK_STREAM, proto = 0;
4853 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004854#ifdef SOCK_CLOEXEC
4855 int *atomic_flag_works = &sock_cloexec_works;
4856#else
4857 int *atomic_flag_works = NULL;
4858#endif
4859 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004860
4861#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004863#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004864 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004865#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004866 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4867 &family, &type, &proto))
4868 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004871 Py_BEGIN_ALLOW_THREADS
4872#ifdef SOCK_CLOEXEC
4873 if (sock_cloexec_works != 0) {
4874 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4875 if (sock_cloexec_works == -1) {
4876 if (ret >= 0) {
4877 sock_cloexec_works = 1;
4878 }
4879 else if (errno == EINVAL) {
4880 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4881 sock_cloexec_works = 0;
4882 ret = socketpair(family, type, proto, sv);
4883 }
4884 }
4885 }
4886 else
4887#endif
4888 {
4889 ret = socketpair(family, type, proto, sv);
4890 }
4891 Py_END_ALLOW_THREADS
4892
4893 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004894 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004895
4896 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4897 goto finally;
4898 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4899 goto finally;
4900
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004901 s0 = new_sockobject(sv[0], family, type, proto);
4902 if (s0 == NULL)
4903 goto finally;
4904 s1 = new_sockobject(sv[1], family, type, proto);
4905 if (s1 == NULL)
4906 goto finally;
4907 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004908
4909finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004910 if (res == NULL) {
4911 if (s0 == NULL)
4912 SOCKETCLOSE(sv[0]);
4913 if (s1 == NULL)
4914 SOCKETCLOSE(sv[1]);
4915 }
4916 Py_XDECREF(s0);
4917 Py_XDECREF(s1);
4918 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004919}
4920
4921PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004922"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004923\n\
4924Create a pair of socket objects from the sockets returned by the platform\n\
4925socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004926The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004927AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004928
4929#endif /* HAVE_SOCKETPAIR */
4930
4931
Guido van Rossum006bf911996-06-12 04:04:55 +00004932static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004933socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004935 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004936
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004937 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4938 return NULL;
4939 }
4940 if (x1 < 0) {
4941 PyErr_SetString(PyExc_OverflowError,
4942 "can't convert negative number to unsigned long");
4943 return NULL;
4944 }
4945 x2 = (unsigned int)ntohs((unsigned short)x1);
4946 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004947}
4948
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004949PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004950"ntohs(integer) -> integer\n\
4951\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004952Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004953
4954
Guido van Rossum006bf911996-06-12 04:04:55 +00004955static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004956socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004959
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004960 if (PyLong_Check(arg)) {
4961 x = PyLong_AsUnsignedLong(arg);
4962 if (x == (unsigned long) -1 && PyErr_Occurred())
4963 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004964#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004965 {
4966 unsigned long y;
4967 /* only want the trailing 32 bits */
4968 y = x & 0xFFFFFFFFUL;
4969 if (y ^ x)
4970 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004971 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004972 x = y;
4973 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004974#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004975 }
4976 else
4977 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004978 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004979 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004980 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004981}
4982
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004983PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004984"ntohl(integer) -> integer\n\
4985\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004986Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004987
4988
Guido van Rossum006bf911996-06-12 04:04:55 +00004989static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004990socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004992 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4995 return NULL;
4996 }
4997 if (x1 < 0) {
4998 PyErr_SetString(PyExc_OverflowError,
4999 "can't convert negative number to unsigned long");
5000 return NULL;
5001 }
5002 x2 = (unsigned int)htons((unsigned short)x1);
5003 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00005004}
5005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005006PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005007"htons(integer) -> integer\n\
5008\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005009Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005010
5011
Guido van Rossum006bf911996-06-12 04:04:55 +00005012static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005013socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00005014{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00005016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 if (PyLong_Check(arg)) {
5018 x = PyLong_AsUnsignedLong(arg);
5019 if (x == (unsigned long) -1 && PyErr_Occurred())
5020 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005021#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005022 {
5023 unsigned long y;
5024 /* only want the trailing 32 bits */
5025 y = x & 0xFFFFFFFFUL;
5026 if (y ^ x)
5027 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005028 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005029 x = y;
5030 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00005031#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005032 }
5033 else
5034 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03005035 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005036 Py_TYPE(arg)->tp_name);
5037 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00005038}
5039
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005040PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00005041"htonl(integer) -> integer\n\
5042\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005043Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005044
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005045/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005046
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005047PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005048"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005049\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005050Convert 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 +00005051binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005052
5053static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005054socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005055{
Neal Norwitz88f115b2003-02-13 02:15:42 +00005056#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005057 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00005058#endif
5059
5060#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00005061#if (SIZEOF_INT != 4)
5062#error "Not sure if in_addr_t exists and int is not 32-bits."
5063#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005064 /* Have to use inet_addr() instead */
5065 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00005066#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005067 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005068
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005069 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
5070 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005071
Tim Peters1df9fdd2003-02-13 03:13:40 +00005072
5073#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00005074
5075#ifdef USE_INET_ATON_WEAKLINK
5076 if (inet_aton != NULL) {
5077#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 if (inet_aton(ip_addr, &buf))
5079 return PyBytes_FromStringAndSize((char *)(&buf),
5080 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005081
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005082 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005083 "illegal IP address string passed to inet_aton");
5084 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005085
Thomas Wouters477c8d52006-05-27 19:21:47 +00005086#ifdef USE_INET_ATON_WEAKLINK
5087 } else {
5088#endif
5089
5090#endif
5091
5092#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
5093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005094 /* special-case this address as inet_addr might return INADDR_NONE
5095 * for this */
5096 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02005097 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005098 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00005099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005100 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00005101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005103 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005104 "illegal IP address string passed to inet_aton");
5105 return NULL;
5106 }
5107 }
5108 return PyBytes_FromStringAndSize((char *) &packed_addr,
5109 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00005110
5111#ifdef USE_INET_ATON_WEAKLINK
5112 }
5113#endif
5114
Guido van Rossumad05cdf2003-02-12 23:08:22 +00005115#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005116}
5117
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005118PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00005119"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005120\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005121Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005122
5123static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005124socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005125{
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005126 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005127 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005128
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005129 if (!PyArg_ParseTuple(args, "y*:inet_ntoa", &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005130 return NULL;
5131 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00005132
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005133 if (packed_ip.len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005134 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005135 "packed IP wrong length for inet_ntoa");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005136 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005137 return NULL;
5138 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005139
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005140 memcpy(&packed_addr, packed_ip.buf, packed_ip.len);
5141 PyBuffer_Release(&packed_ip);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005143 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00005144}
Guido van Rossum82a5c661998-07-07 20:45:43 +00005145
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005146#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005147
5148PyDoc_STRVAR(inet_pton_doc,
5149"inet_pton(af, ip) -> packed IP address string\n\
5150\n\
5151Convert an IP address from string format to a packed string suitable\n\
5152for use with low-level network functions.");
5153
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005154#endif
5155
5156#ifdef HAVE_INET_PTON
5157
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005158static PyObject *
5159socket_inet_pton(PyObject *self, PyObject *args)
5160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005161 int af;
5162 char* ip;
5163 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005164#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005165 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005166#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005167 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005168#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005169 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5170 return NULL;
5171 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005172
Martin v. Löwis04697e82004-06-02 12:35:29 +00005173#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005174 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005175 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005176 "can't use AF_INET6, IPv6 is disabled");
5177 return NULL;
5178 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00005179#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 retval = inet_pton(af, ip, packed);
5182 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005183 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005184 return NULL;
5185 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005186 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005187 "illegal IP address string passed to inet_pton");
5188 return NULL;
5189 } else if (af == AF_INET) {
5190 return PyBytes_FromStringAndSize(packed,
5191 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005192#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 } else if (af == AF_INET6) {
5194 return PyBytes_FromStringAndSize(packed,
5195 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005196#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005198 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005199 return NULL;
5200 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005201}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005202#elif defined(MS_WINDOWS)
5203
5204static PyObject *
5205socket_inet_pton(PyObject *self, PyObject *args)
5206{
5207 int af;
5208 char* ip;
5209 struct sockaddr_in6 addr;
5210 INT ret, size;
5211
5212 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5213 return NULL;
5214 }
5215
Victor Stinnere990c6e2013-11-16 00:18:58 +01005216 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005217 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5218
5219 if (ret) {
5220 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5221 return NULL;
5222 } else if(af == AF_INET) {
5223 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005224 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005225 sizeof(addr4->sin_addr));
5226 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005227 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005228 sizeof(addr.sin6_addr));
5229 } else {
5230 PyErr_SetString(PyExc_OSError, "unknown address family");
5231 return NULL;
5232 }
5233}
5234
5235#endif
5236
5237#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005238
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005239PyDoc_STRVAR(inet_ntop_doc,
5240"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5241\n\
5242Convert a packed IP address of the given family to string format.");
5243
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005244#endif
5245
5246
5247#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005248static PyObject *
5249socket_inet_ntop(PyObject *self, PyObject *args)
5250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005252 Py_buffer packed_ip;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005253 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005254#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005255 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005256#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005257 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005258#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005260 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5261 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005262
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005263 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005264 return NULL;
5265 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005267 if (af == AF_INET) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005268 if (packed_ip.len != sizeof(struct in_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005269 PyErr_SetString(PyExc_ValueError,
5270 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005271 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 return NULL;
5273 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005274#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005275 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005276 if (packed_ip.len != sizeof(struct in6_addr)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005277 PyErr_SetString(PyExc_ValueError,
5278 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005279 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005280 return NULL;
5281 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005282#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 } else {
5284 PyErr_Format(PyExc_ValueError,
5285 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005286 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 return NULL;
5288 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005289
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005290 retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
5291 PyBuffer_Release(&packed_ip);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005292 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005293 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005294 return NULL;
5295 } else {
5296 return PyUnicode_FromString(retval);
5297 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005298
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005299 /* NOTREACHED */
5300 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5301 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005302}
5303
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005304#elif defined(MS_WINDOWS)
5305
5306static PyObject *
5307socket_inet_ntop(PyObject *self, PyObject *args)
5308{
5309 int af;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005310 Py_buffer packed_ip;
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005311 struct sockaddr_in6 addr;
5312 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005313#ifdef ENABLE_IPV6
5314 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5315#else
5316 char ip[INET_ADDRSTRLEN + 1];
5317#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005318
5319 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5320 memset((void *) &ip[0], '\0', sizeof(ip));
5321
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005322 if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005323 return NULL;
5324 }
5325
5326 if (af == AF_INET) {
5327 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5328
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005329 if (packed_ip.len != sizeof(struct in_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005330 PyErr_SetString(PyExc_ValueError,
5331 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005332 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005333 return NULL;
5334 }
5335 memset(addr4, 0, sizeof(struct sockaddr_in));
5336 addr4->sin_family = AF_INET;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005337 memcpy(&(addr4->sin_addr), packed_ip.buf, sizeof(addr4->sin_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005338 addrlen = sizeof(struct sockaddr_in);
5339 } else if (af == AF_INET6) {
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005340 if (packed_ip.len != sizeof(struct in6_addr)) {
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005341 PyErr_SetString(PyExc_ValueError,
5342 "invalid length of packed IP address string");
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005343 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005344 return NULL;
5345 }
5346
5347 memset(&addr, 0, sizeof(addr));
5348 addr.sin6_family = AF_INET6;
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005349 memcpy(&(addr.sin6_addr), packed_ip.buf, sizeof(addr.sin6_addr));
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005350 addrlen = sizeof(addr);
5351 } else {
5352 PyErr_Format(PyExc_ValueError,
5353 "unknown address family %d", af);
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005354 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005355 return NULL;
5356 }
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02005357 PyBuffer_Release(&packed_ip);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005358
5359 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005360 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005361 ip, &retlen);
5362
5363 if (ret) {
5364 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5365 return NULL;
5366 } else {
5367 return PyUnicode_FromString(ip);
5368 }
5369}
5370
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005371#endif /* HAVE_INET_PTON */
5372
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005373/* Python interface to getaddrinfo(host, port). */
5374
5375/*ARGSUSED*/
5376static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005377socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005378{
Victor Stinner77af1722011-05-26 14:05:59 +02005379 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005380 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005381 struct addrinfo hints, *res;
5382 struct addrinfo *res0 = NULL;
5383 PyObject *hobj = NULL;
5384 PyObject *pobj = (PyObject *)NULL;
5385 char pbuf[30];
5386 char *hptr, *pptr;
5387 int family, socktype, protocol, flags;
5388 int error;
5389 PyObject *all = (PyObject *)NULL;
5390 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005391
Georg Brandl6083a4b2013-10-14 06:51:46 +02005392 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005394 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005395 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 &protocol, &flags)) {
5397 return NULL;
5398 }
5399 if (hobj == Py_None) {
5400 hptr = NULL;
5401 } else if (PyUnicode_Check(hobj)) {
Martin v. Löwisbd928fe2011-10-14 10:20:37 +02005402 _Py_IDENTIFIER(encode);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +02005403
5404 idna = _PyObject_CallMethodId(hobj, &PyId_encode, "s", "idna");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 if (!idna)
5406 return NULL;
5407 assert(PyBytes_Check(idna));
5408 hptr = PyBytes_AS_STRING(idna);
5409 } else if (PyBytes_Check(hobj)) {
5410 hptr = PyBytes_AsString(hobj);
5411 } else {
5412 PyErr_SetString(PyExc_TypeError,
5413 "getaddrinfo() argument 1 must be string or None");
5414 return NULL;
5415 }
5416 if (PyLong_CheckExact(pobj)) {
5417 long value = PyLong_AsLong(pobj);
5418 if (value == -1 && PyErr_Occurred())
5419 goto err;
5420 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5421 pptr = pbuf;
5422 } else if (PyUnicode_Check(pobj)) {
5423 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005424 if (pptr == NULL)
5425 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005427 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005428 } else if (pobj == Py_None) {
5429 pptr = (char *)NULL;
5430 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005431 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005432 goto err;
5433 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005434#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005435 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5436 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005437 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5438 * This workaround avoids a segfault in libsystem.
5439 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005440 pptr = "00";
5441 }
5442#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005443 memset(&hints, 0, sizeof(hints));
5444 hints.ai_family = family;
5445 hints.ai_socktype = socktype;
5446 hints.ai_protocol = protocol;
5447 hints.ai_flags = flags;
5448 Py_BEGIN_ALLOW_THREADS
5449 ACQUIRE_GETADDRINFO_LOCK
5450 error = getaddrinfo(hptr, pptr, &hints, &res0);
5451 Py_END_ALLOW_THREADS
5452 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5453 if (error) {
5454 set_gaierror(error);
5455 goto err;
5456 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005457
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005458 if ((all = PyList_New(0)) == NULL)
5459 goto err;
5460 for (res = res0; res; res = res->ai_next) {
5461 PyObject *single;
5462 PyObject *addr =
5463 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5464 if (addr == NULL)
5465 goto err;
5466 single = Py_BuildValue("iiisO", res->ai_family,
5467 res->ai_socktype, res->ai_protocol,
5468 res->ai_canonname ? res->ai_canonname : "",
5469 addr);
5470 Py_DECREF(addr);
5471 if (single == NULL)
5472 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005473
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005474 if (PyList_Append(all, single))
5475 goto err;
5476 Py_XDECREF(single);
5477 }
5478 Py_XDECREF(idna);
5479 if (res0)
5480 freeaddrinfo(res0);
5481 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005482 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005483 Py_XDECREF(all);
5484 Py_XDECREF(idna);
5485 if (res0)
5486 freeaddrinfo(res0);
5487 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005488}
5489
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005490PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005491"getaddrinfo(host, port [, family, type, proto, flags])\n\
5492 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005493\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005494Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005495
5496/* Python interface to getnameinfo(sa, flags). */
5497
5498/*ARGSUSED*/
5499static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005500socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005501{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005502 PyObject *sa = (PyObject *)NULL;
5503 int flags;
5504 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005505 int port;
5506 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005507 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5508 struct addrinfo hints, *res = NULL;
5509 int error;
5510 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005512 flags = flowinfo = scope_id = 0;
5513 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5514 return NULL;
5515 if (!PyTuple_Check(sa)) {
5516 PyErr_SetString(PyExc_TypeError,
5517 "getnameinfo() argument 1 must be a tuple");
5518 return NULL;
5519 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005520 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005521 &hostp, &port, &flowinfo, &scope_id))
5522 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005523 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005524 PyErr_SetString(PyExc_OverflowError,
5525 "getsockaddrarg: flowinfo must be 0-1048575.");
5526 return NULL;
5527 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005528 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5529 memset(&hints, 0, sizeof(hints));
5530 hints.ai_family = AF_UNSPEC;
5531 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005532 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005533 Py_BEGIN_ALLOW_THREADS
5534 ACQUIRE_GETADDRINFO_LOCK
5535 error = getaddrinfo(hostp, pbuf, &hints, &res);
5536 Py_END_ALLOW_THREADS
5537 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5538 if (error) {
5539 set_gaierror(error);
5540 goto fail;
5541 }
5542 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005543 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005544 "sockaddr resolved to multiple addresses");
5545 goto fail;
5546 }
5547 switch (res->ai_family) {
5548 case AF_INET:
5549 {
5550 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005551 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005552 "IPv4 sockaddr must be 2 tuple");
5553 goto fail;
5554 }
5555 break;
5556 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005557#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005558 case AF_INET6:
5559 {
5560 struct sockaddr_in6 *sin6;
5561 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005562 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005563 sin6->sin6_scope_id = scope_id;
5564 break;
5565 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005567 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005568 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005569 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5570 if (error) {
5571 set_gaierror(error);
5572 goto fail;
5573 }
5574 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005575
5576fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005577 if (res)
5578 freeaddrinfo(res);
5579 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005580}
5581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005582PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005583"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005584\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005585Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005586
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005587
5588/* Python API to getting and setting the default timeout value. */
5589
5590static PyObject *
5591socket_getdefaulttimeout(PyObject *self)
5592{
Victor Stinner71694d52015-03-28 01:18:54 +01005593 if (defaulttimeout < 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005594 Py_INCREF(Py_None);
5595 return Py_None;
5596 }
Victor Stinner71694d52015-03-28 01:18:54 +01005597 else {
5598 double seconds = _PyTime_AsSecondsDouble(defaulttimeout);
5599 return PyFloat_FromDouble(seconds);
5600 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005601}
5602
5603PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005604"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005605\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005606Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005607A value of None indicates that new socket objects have no timeout.\n\
5608When the socket module is first imported, the default is None.");
5609
5610static PyObject *
5611socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5612{
Victor Stinner71694d52015-03-28 01:18:54 +01005613 _PyTime_t timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005614
Victor Stinner71694d52015-03-28 01:18:54 +01005615 if (socket_parse_timeout(&timeout, arg) < 0)
5616 return NULL;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005619
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005620 Py_INCREF(Py_None);
5621 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005622}
5623
5624PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005625"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005626\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005627Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005628A value of None indicates that new socket objects have no timeout.\n\
5629When the socket module is first imported, the default is None.");
5630
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005631#ifdef HAVE_IF_NAMEINDEX
5632/* Python API for getting interface indices and names */
5633
5634static PyObject *
5635socket_if_nameindex(PyObject *self, PyObject *arg)
5636{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005637 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005638 int i;
5639 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005640
Charles-François Natali60713592011-05-20 16:55:06 +02005641 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005642 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005643 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005644 return NULL;
5645 }
5646
5647 list = PyList_New(0);
5648 if (list == NULL) {
5649 if_freenameindex(ni);
5650 return NULL;
5651 }
5652
Charles-François Natali60713592011-05-20 16:55:06 +02005653 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5654 PyObject *ni_tuple = Py_BuildValue("IO&",
5655 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005656
5657 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5658 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005659 Py_DECREF(list);
5660 if_freenameindex(ni);
5661 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005662 }
5663 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005664 }
5665
5666 if_freenameindex(ni);
5667 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005668}
5669
5670PyDoc_STRVAR(if_nameindex_doc,
5671"if_nameindex()\n\
5672\n\
5673Returns a list of network interface information (index, name) tuples.");
5674
Charles-François Natali60713592011-05-20 16:55:06 +02005675static PyObject *
5676socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005677{
Charles-François Natali60713592011-05-20 16:55:06 +02005678 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005679 unsigned long index;
5680
Charles-François Natali60713592011-05-20 16:55:06 +02005681 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5682 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005683 return NULL;
5684
Charles-François Natali60713592011-05-20 16:55:06 +02005685 index = if_nametoindex(PyBytes_AS_STRING(oname));
5686 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005687 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005688 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005689 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005690 return NULL;
5691 }
5692
5693 return PyLong_FromUnsignedLong(index);
5694}
5695
5696PyDoc_STRVAR(if_nametoindex_doc,
5697"if_nametoindex(if_name)\n\
5698\n\
5699Returns the interface index corresponding to the interface name if_name.");
5700
Charles-François Natali60713592011-05-20 16:55:06 +02005701static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005702socket_if_indextoname(PyObject *self, PyObject *arg)
5703{
Charles-François Natali60713592011-05-20 16:55:06 +02005704 unsigned long index;
5705 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005706
Charles-François Natali60713592011-05-20 16:55:06 +02005707 index = PyLong_AsUnsignedLong(arg);
5708 if (index == (unsigned long) -1)
5709 return NULL;
5710
5711 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005712 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005713 return NULL;
5714 }
5715
Charles-François Natali60713592011-05-20 16:55:06 +02005716 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005717}
5718
5719PyDoc_STRVAR(if_indextoname_doc,
5720"if_indextoname(if_index)\n\
5721\n\
5722Returns the interface name corresponding to the interface index if_index.");
5723
5724#endif /* HAVE_IF_NAMEINDEX */
5725
5726
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005727#ifdef CMSG_LEN
5728/* Python interface to CMSG_LEN(length). */
5729
5730static PyObject *
5731socket_CMSG_LEN(PyObject *self, PyObject *args)
5732{
5733 Py_ssize_t length;
5734 size_t result;
5735
5736 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5737 return NULL;
5738 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5739 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5740 return NULL;
5741 }
5742 return PyLong_FromSize_t(result);
5743}
5744
5745PyDoc_STRVAR(CMSG_LEN_doc,
5746"CMSG_LEN(length) -> control message length\n\
5747\n\
5748Return the total length, without trailing padding, of an ancillary\n\
5749data item with associated data of the given length. This value can\n\
5750often be used as the buffer size for recvmsg() to receive a single\n\
5751item of ancillary data, but RFC 3542 requires portable applications to\n\
5752use CMSG_SPACE() and thus include space for padding, even when the\n\
5753item will be the last in the buffer. Raises OverflowError if length\n\
5754is outside the permissible range of values.");
5755
5756
5757#ifdef CMSG_SPACE
5758/* Python interface to CMSG_SPACE(length). */
5759
5760static PyObject *
5761socket_CMSG_SPACE(PyObject *self, PyObject *args)
5762{
5763 Py_ssize_t length;
5764 size_t result;
5765
5766 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5767 return NULL;
5768 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5769 PyErr_SetString(PyExc_OverflowError,
5770 "CMSG_SPACE() argument out of range");
5771 return NULL;
5772 }
5773 return PyLong_FromSize_t(result);
5774}
5775
5776PyDoc_STRVAR(CMSG_SPACE_doc,
5777"CMSG_SPACE(length) -> buffer size\n\
5778\n\
5779Return the buffer size needed for recvmsg() to receive an ancillary\n\
5780data item with associated data of the given length, along with any\n\
5781trailing padding. The buffer space needed to receive multiple items\n\
5782is the sum of the CMSG_SPACE() values for their associated data\n\
5783lengths. Raises OverflowError if length is outside the permissible\n\
5784range of values.");
5785#endif /* CMSG_SPACE */
5786#endif /* CMSG_LEN */
5787
5788
Guido van Rossum30a685f1991-06-27 15:51:29 +00005789/* List of functions exported by this module. */
5790
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005791static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005792 {"gethostbyname", socket_gethostbyname,
5793 METH_VARARGS, gethostbyname_doc},
5794 {"gethostbyname_ex", socket_gethostbyname_ex,
5795 METH_VARARGS, ghbn_ex_doc},
5796 {"gethostbyaddr", socket_gethostbyaddr,
5797 METH_VARARGS, gethostbyaddr_doc},
5798 {"gethostname", socket_gethostname,
5799 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005800#ifdef HAVE_SETHOSTNAME
5801 {"sethostname", socket_sethostname,
5802 METH_VARARGS, sethostname_doc},
5803#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005804 {"getservbyname", socket_getservbyname,
5805 METH_VARARGS, getservbyname_doc},
5806 {"getservbyport", socket_getservbyport,
5807 METH_VARARGS, getservbyport_doc},
5808 {"getprotobyname", socket_getprotobyname,
5809 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005810#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005811 {"dup", socket_dup,
5812 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005813#endif
Dave Cole331708b2004-08-09 04:51:41 +00005814#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 {"socketpair", socket_socketpair,
5816 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005817#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005818 {"ntohs", socket_ntohs,
5819 METH_VARARGS, ntohs_doc},
5820 {"ntohl", socket_ntohl,
5821 METH_O, ntohl_doc},
5822 {"htons", socket_htons,
5823 METH_VARARGS, htons_doc},
5824 {"htonl", socket_htonl,
5825 METH_O, htonl_doc},
5826 {"inet_aton", socket_inet_aton,
5827 METH_VARARGS, inet_aton_doc},
5828 {"inet_ntoa", socket_inet_ntoa,
5829 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005830#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831 {"inet_pton", socket_inet_pton,
5832 METH_VARARGS, inet_pton_doc},
5833 {"inet_ntop", socket_inet_ntop,
5834 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005835#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005836 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5837 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005838 {"getnameinfo", socket_getnameinfo,
5839 METH_VARARGS, getnameinfo_doc},
5840 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5841 METH_NOARGS, getdefaulttimeout_doc},
5842 {"setdefaulttimeout", socket_setdefaulttimeout,
5843 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005844#ifdef HAVE_IF_NAMEINDEX
5845 {"if_nameindex", socket_if_nameindex,
5846 METH_NOARGS, if_nameindex_doc},
5847 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005848 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005849 {"if_indextoname", socket_if_indextoname,
5850 METH_O, if_indextoname_doc},
5851#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005852#ifdef CMSG_LEN
5853 {"CMSG_LEN", socket_CMSG_LEN,
5854 METH_VARARGS, CMSG_LEN_doc},
5855#ifdef CMSG_SPACE
5856 {"CMSG_SPACE", socket_CMSG_SPACE,
5857 METH_VARARGS, CMSG_SPACE_doc},
5858#endif
5859#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005860 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005861};
5862
Guido van Rossum30a685f1991-06-27 15:51:29 +00005863
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005864#ifdef MS_WINDOWS
5865#define OS_INIT_DEFINED
5866
5867/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005868
5869static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005870os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005871{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005872 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005873}
5874
5875static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005876os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005877{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005878 WSADATA WSAData;
5879 int ret;
5880 ret = WSAStartup(0x0101, &WSAData);
5881 switch (ret) {
5882 case 0: /* No error */
5883 Py_AtExit(os_cleanup);
5884 return 1; /* Success */
5885 case WSASYSNOTREADY:
5886 PyErr_SetString(PyExc_ImportError,
5887 "WSAStartup failed: network not ready");
5888 break;
5889 case WSAVERNOTSUPPORTED:
5890 case WSAEINVAL:
5891 PyErr_SetString(
5892 PyExc_ImportError,
5893 "WSAStartup failed: requested version not supported");
5894 break;
5895 default:
5896 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5897 break;
5898 }
5899 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005900}
5901
Guido van Rossum8d665e61996-06-26 18:22:49 +00005902#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005903
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005904
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005905
5906#ifndef OS_INIT_DEFINED
5907static int
5908os_init(void)
5909{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005910 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005911}
5912#endif
5913
5914
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005915/* C API table - always add new things to the end for binary
5916 compatibility. */
5917static
5918PySocketModule_APIObject PySocketModuleAPI =
5919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005920 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005921 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005922 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005923};
5924
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005925
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005926/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005927
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005928 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005929 "socket.py" which implements some additional functionality.
5930 The import of "_socket" may fail with an ImportError exception if
5931 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005932 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005933 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005934*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005936PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005937"Implementation module for socket operations.\n\
5938\n\
5939See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005940
Martin v. Löwis1a214512008-06-11 05:26:20 +00005941static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 PyModuleDef_HEAD_INIT,
5943 PySocket_MODULE_NAME,
5944 socket_doc,
5945 -1,
5946 socket_methods,
5947 NULL,
5948 NULL,
5949 NULL,
5950 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005951};
5952
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005953PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005954PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005955{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 if (!os_init())
5959 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005960
Victor Stinnerdaf45552013-08-28 00:53:59 +02005961#ifdef MS_WINDOWS
5962 if (support_wsa_no_inherit == -1) {
Steve Dower65e4cb12014-11-22 12:54:57 -08005963#if defined(_MSC_VER) && _MSC_VER >= 1800
5964 support_wsa_no_inherit = IsWindows7SP1OrGreater();
5965#else
Victor Stinnerdaf45552013-08-28 00:53:59 +02005966 DWORD version = GetVersion();
5967 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5968 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5969 /* need Windows 7 SP1, 2008 R2 SP1 or later */
Steve Dower65e4cb12014-11-22 12:54:57 -08005970 support_wsa_no_inherit = major > 6 || (major == 6 && minor >= 1);
5971#endif
Victor Stinnerdaf45552013-08-28 00:53:59 +02005972 }
5973#endif
5974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005975 Py_TYPE(&sock_type) = &PyType_Type;
5976 m = PyModule_Create(&socketmodule);
5977 if (m == NULL)
5978 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005979
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005980 Py_INCREF(PyExc_OSError);
5981 PySocketModuleAPI.error = PyExc_OSError;
5982 Py_INCREF(PyExc_OSError);
5983 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005985 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005986 if (socket_herror == NULL)
5987 return NULL;
5988 Py_INCREF(socket_herror);
5989 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005990 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005991 NULL);
5992 if (socket_gaierror == NULL)
5993 return NULL;
5994 Py_INCREF(socket_gaierror);
5995 PyModule_AddObject(m, "gaierror", socket_gaierror);
5996 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005997 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 if (socket_timeout == NULL)
5999 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00006000 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006001 Py_INCREF(socket_timeout);
6002 PyModule_AddObject(m, "timeout", socket_timeout);
6003 Py_INCREF((PyObject *)&sock_type);
6004 if (PyModule_AddObject(m, "SocketType",
6005 (PyObject *)&sock_type) != 0)
6006 return NULL;
6007 Py_INCREF((PyObject *)&sock_type);
6008 if (PyModule_AddObject(m, "socket",
6009 (PyObject *)&sock_type) != 0)
6010 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00006011
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006012#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006013 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006014#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006015 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006017 Py_INCREF(has_ipv6);
6018 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006020 /* Export C API */
6021 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
6022 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
6023 ) != 0)
6024 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00006025
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006026 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00006027#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006028 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00006029#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006030 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006031#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006032 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006033#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00006034#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006035 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00006036#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006037#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006039 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006040#endif
6041#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006042 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00006043#endif
6044#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006045 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006046 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006047#endif
6048#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006050 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006051#endif
6052#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006053 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006054 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006055#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006056#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006058 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006059#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006060#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006061 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006062 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00006063#endif
6064#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006065 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006066 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006067#endif
6068#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006069 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00006070#endif
6071#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006072 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006073 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006074#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006075#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006077 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006078#endif
6079#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006080 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006081 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006082#endif
6083#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006084 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006085 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006086#endif
6087#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006089 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006090#endif
6091#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006092 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006093 PyModule_AddIntMacro(m, AF_NETLINK);
6094 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006095#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006096 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006097#endif
6098#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006099 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006100#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006101 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
6102 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006103#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006104 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006105#endif
6106#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006107 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00006108#endif
Neal Norwitz65851662006-01-16 04:31:40 +00006109#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006110 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00006111#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006112#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006113 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006114#endif
6115#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006116 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006117#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006118 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00006119#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006120 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00006121#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006122#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006123 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006124#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006125#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006126#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006127 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006128 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006129#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02006130#ifdef AF_LINK
6131 PyModule_AddIntMacro(m, AF_LINK);
6132#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006133#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006135 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006136#endif
6137#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006139 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006140#endif
6141#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006143 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006144#endif
6145#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006146 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006147 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006148#endif
6149#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006151 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006152#endif
6153#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006154 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006155 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006156#endif
6157#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006159 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006160#endif
6161#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006163 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00006164#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00006165
Hye-Shik Chang81268602004-02-02 06:05:24 +00006166#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006167 PyModule_AddIntMacro(m, AF_BLUETOOTH);
6168 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
6169 PyModule_AddIntMacro(m, BTPROTO_HCI);
6170 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006171#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006173#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00006174#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006175#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006176 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00006177#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, HCI_DATA_DIR);
6179 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00006180#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006181 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006182 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
6183 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006184#endif
6185
Charles-François Natali47413c12011-10-06 19:47:44 +02006186#ifdef AF_CAN
6187 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006188 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006189#endif
6190#ifdef PF_CAN
6191 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006192 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006193#endif
6194
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006195/* Reliable Datagram Sockets */
6196#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006197 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006198#endif
6199#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006200 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006201#endif
6202
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006203/* Kernel event messages */
6204#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006205 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006206#endif
6207#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006208 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006209#endif
6210
Antoine Pitroub156a462010-10-27 20:13:57 +00006211#ifdef AF_PACKET
6212 PyModule_AddIntMacro(m, AF_PACKET);
6213#endif
6214#ifdef PF_PACKET
6215 PyModule_AddIntMacro(m, PF_PACKET);
6216#endif
6217#ifdef PACKET_HOST
6218 PyModule_AddIntMacro(m, PACKET_HOST);
6219#endif
6220#ifdef PACKET_BROADCAST
6221 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6222#endif
6223#ifdef PACKET_MULTICAST
6224 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6225#endif
6226#ifdef PACKET_OTHERHOST
6227 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6228#endif
6229#ifdef PACKET_OUTGOING
6230 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6231#endif
6232#ifdef PACKET_LOOPBACK
6233 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6234#endif
6235#ifdef PACKET_FASTROUTE
6236 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006237#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006238
Christian Heimes043d6f62008-01-07 17:19:16 +00006239#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006240 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006243 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6244 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6245 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006246
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006247 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6248 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6249 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006251 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, SOL_TIPC);
6253 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6254 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6255 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6256 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006257
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006258 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6259 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6260 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6261 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006263 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006264 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6265 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006266#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006268 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006269#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006270 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6271 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6272 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6273 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6274 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6275 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006276#endif
6277
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006278 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006279 PyModule_AddIntMacro(m, SOCK_STREAM);
6280 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006281/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006282 PyModule_AddIntMacro(m, SOCK_RAW);
6283 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006284#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006285 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006286#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006287#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006288 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006289#endif
6290#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006291 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006292#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006295 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006296#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006297#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006298 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006299#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006300#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006301 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006302#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006303#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006304 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006305#endif
6306
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006307#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006308 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006309#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006310#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006311 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006312#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006313#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006314 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006315#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006316#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006317 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006319#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006320 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006321#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006322#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006323 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006324#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006325#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006326 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006327#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006328#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006329 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006330#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006331#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006332 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006333#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006334#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006335 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006336#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006337#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006338 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006339#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006340#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006341 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006342#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006343#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006344 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006345#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006346#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006347 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006348#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006349#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006350 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006351#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006352#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006353 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006354#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006355#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006356 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006357#endif
6358#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006359 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006360#endif
6361#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006362 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006363#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006364#ifdef SO_BINDTODEVICE
6365 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6366#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006367#ifdef SO_PRIORITY
6368 PyModule_AddIntMacro(m, SO_PRIORITY);
6369#endif
Charles-François Nataliea07eb92014-09-18 23:18:46 +01006370#ifdef SO_MARK
6371 PyModule_AddIntMacro(m, SO_MARK);
6372#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006374 /* Maximum number of connections for "listen" */
6375#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006377#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006379#endif
6380
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006381 /* Ancilliary message types */
6382#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006383 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006384#endif
6385#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006386 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006387#endif
6388#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006389 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006390#endif
6391
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392 /* Flags for send, recv */
6393#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006394 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006395#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006396#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006397 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006399#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006400 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006401#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006402#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006403 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006404#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006405#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006406 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006407#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006408#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006409 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006410#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006411#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006412 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006413#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006414#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006415 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006416#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006417#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006418 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006419#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006420#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006421 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006422#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006423#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006424 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006425#endif
6426#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006427 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006428#endif
6429#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006430 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006431#endif
6432#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006433 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006434#endif
6435#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006436 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006437#endif
6438#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006439 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006440#endif
6441#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006442 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006443#endif
6444#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006445 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006446#endif
6447#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006448 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006449#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006450#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006451 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006452#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454 /* Protocol level and numbers, usable for [gs]etsockopt */
6455#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006456 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006457#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006458#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006459 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006460#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006461 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006462#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006463#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006464 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006468#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006469#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006470 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006471#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006472#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006473 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006477#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006478#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006479 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006480#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006481 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006482#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006484 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006485#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006486 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006487#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006488#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006489 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006490#endif
6491#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006492 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6493 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006494#endif
6495#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006496 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6497 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6498 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006499
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006500 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6501 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6502 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006503#endif
6504#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006505 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6506 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6507 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6508 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006509#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006510#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006511 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006512 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6513 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6514 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6515 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6516 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6517 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6518 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6519 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6520 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6521 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6522 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6523 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6524#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006525#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006526 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006527#endif
6528#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006529 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006530#endif
6531#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006532 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006533#endif
6534#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006536#endif
6537#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006539#endif
6540#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006542#endif
6543#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006548#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006550#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006551#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006552 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006553#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006554#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006555 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006556#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006557 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006558#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006559#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006560 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006561#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006562#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006563 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006564#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006565#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006566 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006568#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006569 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006570#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006571#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006572 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006573#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006574#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006575 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006576#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006577 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006581#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006582#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006584#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006585#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006586 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006587#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006588 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006606 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006607#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006608#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006609 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006610#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006611#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006612 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006613#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006614#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006615 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006616#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006617#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006618 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006619#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006620#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006621 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006622#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006623#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006624 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006625#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006626#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006627 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006628#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006629#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006630 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006631#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006632#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006633 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006634#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006635#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006636 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006638#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006639 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006640#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006641#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006642 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006643#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006644#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006645 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006646#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006647#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006648 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006649#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006650#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006651 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006652#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006653#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006654 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006655#endif
6656/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006657#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006658 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006659#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006660 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006661#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006662#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006663 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006664#endif
6665
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006666#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006667 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006668#endif
6669
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006670 /* Some port configuration */
6671#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006672 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006673#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006674 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006675#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006676#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006677 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006678#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006679 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006680#endif
6681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006682 /* Some reserved IP v.4 addresses */
6683#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006684 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006685#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006686 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006687#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006688#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006689 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006690#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006691 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006695#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006697#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006698#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006699 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006700#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006701 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006702#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006703#ifdef INADDR_ALLHOSTS_GROUP
6704 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6705 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006706#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006707 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006708#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006709#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006710 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006711#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006713#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006714#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006715 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006716#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006717 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006718#endif
6719
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006720 /* IPv4 [gs]etsockopt options */
6721#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006723#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006724#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006726#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006727#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006729#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006730#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006732#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006733#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006735#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006736#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006738#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006739#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006741#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006742#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006744#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006745#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006747#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006748#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006750#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006751#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006753#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006754#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006755 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006756#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006757#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006758 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006759#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006760#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006761 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006762#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006763#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006764 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006765#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006766#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006767 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006768#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006769#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006770 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006771#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006773 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6774#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006776#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006777#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006779#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006780#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006782#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006783#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006785#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006786#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006788#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006789#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006791#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006792 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006793#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006794 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006796 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006797#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006798 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006799#endif
6800#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006801 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006802#endif
6803#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006804 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006805#endif
6806#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006807 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006808#endif
6809#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006810 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006811#endif
6812#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006813 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006814#endif
6815#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006816 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006817#endif
6818#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006819 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006820#endif
6821#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006822 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006823#endif
6824#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006825 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006826#endif
6827#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006828 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006829#endif
6830#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006831 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006832#endif
6833#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006834 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006835#endif
6836#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006837 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006838#endif
6839#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006840 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006841#endif
6842#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006843 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006844#endif
6845#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006846 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006847#endif
6848#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006849 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006850#endif
6851#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006852 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006853#endif
6854#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006856#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006857
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006858 /* TCP options */
6859#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006860 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006861#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006862#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006863 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006864#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006865#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006866 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006867#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006868#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006870#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006872 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006873#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006874#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006875 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006876#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006878 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006879#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006880#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006881 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006882#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006883#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006884 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006885#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006886#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006887 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006888#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006889#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006890 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006891#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006892#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006894#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006895#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006897#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006898
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006899 /* IPX options */
6900#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006901 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006902#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006903
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006904/* Reliable Datagram Sockets */
6905#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006906 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006907#endif
6908#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006909 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006910#endif
6911#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006912 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006913#endif
6914#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006915 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006916#endif
6917#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006918 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006919#endif
6920#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006921 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006922#endif
6923#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006924 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006925#endif
6926#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006927 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006928#endif
6929#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006930 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006931#endif
6932#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006933 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006934#endif
6935#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006936 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006937#endif
6938#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006939 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006940#endif
6941
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006942 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006943#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006944 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006945#endif
6946#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006947 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006948#endif
6949#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006950 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006951#endif
6952#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006953 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006954#endif
6955#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006956 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006957#endif
6958#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006959 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006960#endif
6961#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006962 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006963#endif
6964#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006965 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006966#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006967#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006968 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006969#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006970#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006971 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006972#endif
6973#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006974 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006975#endif
6976#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006977 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006978#endif
6979#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006980 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006981#endif
6982#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006983 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006984#endif
6985#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006986 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006987#endif
6988#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006989 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006990#endif
6991#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006992 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006993#endif
6994#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006995 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006996#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006997#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006998 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006999#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007000#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007001 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007002#endif
7003#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007004 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007005#endif
7006#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007007 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007008#endif
7009#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007010 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007011#endif
7012#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007013 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007014#endif
7015#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007016 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007017#endif
7018#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007019 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007020#endif
7021#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007022 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007023#endif
7024#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007025 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007026#endif
7027#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007028 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007029#endif
7030#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007031 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007032#endif
7033#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007034 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007035#endif
7036#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007037 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00007038#endif
7039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007040 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007041#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007042 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007043#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007044 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007045#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007046 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007047#endif
7048#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007049 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007050#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007051 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007052#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007053 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007054#endif
7055#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007056 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007057#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007058 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007059#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007060 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00007061#endif
7062
Christian Heimesfaf2f632008-01-06 16:59:19 +00007063#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007064 {
7065 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
7066 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
7067 int i;
Victor Stinner63941882011-09-29 00:42:28 +02007068 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007069 PyObject *tmp;
7070 tmp = PyLong_FromUnsignedLong(codes[i]);
7071 if (tmp == NULL)
7072 return NULL;
7073 PyModule_AddObject(m, names[i], tmp);
7074 }
7075 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007076 PyModule_AddIntMacro(m, RCVALL_OFF);
7077 PyModule_AddIntMacro(m, RCVALL_ON);
7078 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007079#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007080 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007081#endif
7082#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02007083 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00007084#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00007085#endif /* _MSTCPIP_ */
7086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007087 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00007088#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007089 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00007090#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007091 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00007092}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007093
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007094
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007095#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00007096#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007097
7098/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00007099/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007100
Guido van Rossum3eede5a2002-06-07 02:08:35 +00007101int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007102inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007104 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00007105#if (SIZEOF_INT != 4)
7106#error "Not sure if in_addr_t exists and int is not 32-bits."
7107#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007108 unsigned int packed_addr;
7109 packed_addr = inet_addr(src);
7110 if (packed_addr == INADDR_NONE)
7111 return 0;
7112 memcpy(dst, &packed_addr, 4);
7113 return 1;
7114 }
7115 /* Should set errno to EAFNOSUPPORT */
7116 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007117}
7118
Martin v. Löwisc925b1532001-07-21 09:42:15 +00007119const char *
7120inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007121{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00007122 if (af == AF_INET) {
7123 struct in_addr packed_addr;
7124 if (size < 16)
7125 /* Should set errno to ENOSPC. */
7126 return NULL;
7127 memcpy(&packed_addr, src, sizeof(packed_addr));
7128 return strncpy(dst, inet_ntoa(packed_addr), size);
7129 }
7130 /* Should set errno to EAFNOSUPPORT */
7131 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007132}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00007133
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00007134#endif
Christian Heimesb6150692007-11-15 23:37:07 +00007135#endif