blob: 23019ee9a7af3df79f03d889fb02a47d9be77002 [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\
124listen(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
Jeremy Hylton22308652001-02-02 03:23:09 +0000287#endif
288
Skip Montanaro7befb992004-02-10 16:50:21 +0000289#include <stddef.h>
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000290
291#ifndef offsetof
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292# define offsetof(type, member) ((size_t)(&((type *)0)->member))
Martin v. Löwisa45ecae2001-06-24 21:28:42 +0000293#endif
294
Neal Norwitz39d22e52002-11-02 19:55:21 +0000295#ifndef O_NONBLOCK
296# define O_NONBLOCK O_NDELAY
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000297#endif
298
Trent Micka708d6e2004-09-07 17:48:26 +0000299/* include Python's addrinfo.h unless it causes trouble */
300#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)
301 /* Do not include addinfo.h on some newer IRIX versions.
302 * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,
303 * for example, but not by 6.5.10.
304 */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000305#elif defined(_MSC_VER) && _MSC_VER>1201
Trent Micka708d6e2004-09-07 17:48:26 +0000306 /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and
307 * EAI_* constants are defined in (the already included) ws2tcpip.h.
308 */
309#else
310# include "addrinfo.h"
311#endif
Jason Tishlerc246cb72004-08-09 13:25:59 +0000312
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000313#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +0000314#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000315int inet_pton(int af, const char *src, void *dst);
Martin v. Löwisc925b1532001-07-21 09:42:15 +0000316const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000317#endif
Christian Heimesb6150692007-11-15 23:37:07 +0000318#endif
Martin v. Löwisb9ab1592001-06-24 21:18:26 +0000319
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000320#ifdef __APPLE__
321/* On OS X, getaddrinfo returns no error indication of lookup
322 failure, so we must use the emulation instead of the libinfo
323 implementation. Unfortunately, performing an autoconf test
324 for this bug would require DNS access for the machine performing
325 the configuration, which is not acceptable. Therefore, we
326 determine the bug just by checking for __APPLE__. If this bug
327 gets ever fixed, perhaps checking for sys/version.h would be
328 appropriate, which is 10/0 on the system with the bug. */
Jack Jansen84262fb2002-07-02 14:40:42 +0000329#ifndef HAVE_GETNAMEINFO
330/* This bug seems to be fixed in Jaguar. Ths easiest way I could
331 Find to check for Jaguar is that it has getnameinfo(), which
332 older releases don't have */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000333#undef HAVE_GETADDRINFO
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000334#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +0000335
336#ifdef HAVE_INET_ATON
337#define USE_INET_ATON_WEAKLINK
338#endif
339
Jack Jansen84262fb2002-07-02 14:40:42 +0000340#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000341
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000342/* I know this is a bad practice, but it is the easiest... */
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000343#if !defined(HAVE_GETADDRINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000344/* avoid clashes with the C library definition of the symbol. */
345#define getaddrinfo fake_getaddrinfo
346#define gai_strerror fake_gai_strerror
347#define freeaddrinfo fake_freeaddrinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000348#include "getaddrinfo.c"
349#endif
Martin v. Löwisae26dc22001-08-03 10:02:29 +0000350#if !defined(HAVE_GETNAMEINFO)
Martin v. Löwisfccac2e2003-05-01 05:20:46 +0000351#define getnameinfo fake_getnameinfo
Martin v. Löwis01dfdb32001-06-23 16:30:13 +0000352#include "getnameinfo.c"
353#endif
354
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000355#ifdef MS_WINDOWS
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000356#define SOCKETCLOSE closesocket
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000357#endif
358
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000359#ifdef MS_WIN32
Kristján Valur Jónsson310052c2012-03-31 13:35:00 +0000360#undef EAFNOSUPPORT
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000361#define EAFNOSUPPORT WSAEAFNOSUPPORT
362#define snprintf _snprintf
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000363#endif
Fred Drakea04eaad2000-06-30 02:46:07 +0000364
Guido van Rossum2dd8ddd2000-04-21 20:33:00 +0000365#ifndef SOCKETCLOSE
366#define SOCKETCLOSE close
367#endif
368
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000369#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000370#define USE_BLUETOOTH 1
371#if defined(__FreeBSD__)
372#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP
373#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM
Thomas Wouterscf297e42007-02-23 15:07:44 +0000374#define BTPROTO_HCI BLUETOOTH_PROTO_HCI
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000375#define SOL_HCI SOL_HCI_RAW
376#define HCI_FILTER SO_HCI_RAW_FILTER
Hye-Shik Chang81268602004-02-02 06:05:24 +0000377#define sockaddr_l2 sockaddr_l2cap
378#define sockaddr_rc sockaddr_rfcomm
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000379#define hci_dev hci_node
Hye-Shik Chang81268602004-02-02 06:05:24 +0000380#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)
381#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000382#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000383#elif defined(__NetBSD__) || defined(__DragonFly__)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000384#define sockaddr_l2 sockaddr_bt
385#define sockaddr_rc sockaddr_bt
Thomas Wouterscf297e42007-02-23 15:07:44 +0000386#define sockaddr_hci sockaddr_bt
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000387#define sockaddr_sco sockaddr_bt
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +0000388#define SOL_HCI BTPROTO_HCI
389#define HCI_DATA_DIR SO_HCI_DIRECTION
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000390#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)
391#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000392#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000393#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000394#else
Hye-Shik Chang81268602004-02-02 06:05:24 +0000395#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)
396#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)
Thomas Wouterscf297e42007-02-23 15:07:44 +0000397#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)
Hye-Shik Chang81268602004-02-02 06:05:24 +0000398#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)
399#endif
400#endif
401
Charles-François Natali8b759652011-12-23 16:44:51 +0100402/* Convert "sock_addr_t *" to "struct sockaddr *". */
403#define SAS2SA(x) (&((x)->sa))
Thomas Wouters89f507f2006-12-13 04:49:30 +0000404
Martin v. Löwise9416172003-05-03 10:12:45 +0000405/*
406 * Constants for getnameinfo()
407 */
408#if !defined(NI_MAXHOST)
409#define NI_MAXHOST 1025
410#endif
411#if !defined(NI_MAXSERV)
412#define NI_MAXSERV 32
413#endif
414
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000415#ifndef INVALID_SOCKET /* MS defines this */
416#define INVALID_SOCKET (-1)
417#endif
418
Charles-François Natali0cc86852013-09-13 19:53:08 +0200419#ifndef INADDR_NONE
420#define INADDR_NONE (-1)
421#endif
422
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000423/* XXX There's a problem here: *static* functions are not supposed to have
424 a Py prefix (or use CapitalizedWords). Later... */
425
Guido van Rossum30a685f1991-06-27 15:51:29 +0000426/* Global variable holding the exception type for errors detected
427 by this module (but not argument type or memory errors, etc.). */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000428static PyObject *socket_herror;
429static PyObject *socket_gaierror;
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000430static PyObject *socket_timeout;
Guido van Rossum30a685f1991-06-27 15:51:29 +0000431
Tim Peters643a7fc2002-02-17 04:13:21 +0000432/* A forward reference to the socket type object.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000433 The sock_type variable contains pointers to various functions,
434 some of which call new_sockobject(), which uses sock_type, so
Tim Peters643a7fc2002-02-17 04:13:21 +0000435 there has to be a circular reference. */
Jeremy Hylton938ace62002-07-17 16:30:39 +0000436static PyTypeObject sock_type;
Guido van Rossum48a680c2001-03-02 06:34:14 +0000437
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000438#if defined(HAVE_POLL_H)
439#include <poll.h>
440#elif defined(HAVE_SYS_POLL_H)
441#include <sys/poll.h>
442#endif
443
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000444/* Largest value to try to store in a socklen_t (used when handling
445 ancillary data). POSIX requires socklen_t to hold at least
446 (2**31)-1 and recommends against storing larger values, but
447 socklen_t was originally int in the BSD interface, so to be on the
448 safe side we use the smaller of (2**31)-1 and INT_MAX. */
449#if INT_MAX > 0x7fffffff
450#define SOCKLEN_T_LIMIT 0x7fffffff
451#else
452#define SOCKLEN_T_LIMIT INT_MAX
453#endif
454
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200455#ifdef HAVE_POLL
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000456/* Instead of select(), we'll use poll() since poll() works on any fd. */
457#define IS_SELECTABLE(s) 1
458/* Can we call select() with this socket without a buffer overrun? */
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000459#else
Charles-François Nataliaa26b272011-08-28 17:51:43 +0200460/* If there's no timeout left, we don't have to call select, so it's a safe,
461 * little white lie. */
462#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)
Martin v. Löwisf84d1b92006-02-11 09:27:05 +0000463#endif
Neal Norwitz082b2df2006-02-07 07:04:46 +0000464
465static PyObject*
466select_error(void)
467{
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200468 PyErr_SetString(PyExc_OSError, "unable to select on socket");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 return NULL;
Neal Norwitz082b2df2006-02-07 07:04:46 +0000470}
471
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000472#ifdef MS_WINDOWS
Antoine Pitrouc8f01962010-09-28 22:03:27 +0000473#ifndef WSAEAGAIN
474#define WSAEAGAIN WSAEWOULDBLOCK
475#endif
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000476#define CHECK_ERRNO(expected) \
477 (WSAGetLastError() == WSA ## expected)
478#else
479#define CHECK_ERRNO(expected) \
480 (errno == expected)
481#endif
482
Victor Stinnerdaf45552013-08-28 00:53:59 +0200483#ifdef MS_WINDOWS
484/* Does WSASocket() support the WSA_FLAG_NO_HANDLE_INHERIT flag? */
485static int support_wsa_no_inherit = -1;
486#endif
487
Guido van Rossum30a685f1991-06-27 15:51:29 +0000488/* Convenience function to raise an error according to errno
489 and return a NULL pointer from a function. */
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000490
Guido van Rossum73624e91994-10-10 17:59:00 +0000491static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000492set_error(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000493{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000494#ifdef MS_WINDOWS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 int err_no = WSAGetLastError();
496 /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which
497 recognizes the error codes used by both GetLastError() and
498 WSAGetLastError */
499 if (err_no)
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200500 return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no);
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000501#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000502
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200503 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000504}
505
Guido van Rossum30a685f1991-06-27 15:51:29 +0000506
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000507static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000508set_herror(int h_error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000511
512#ifdef HAVE_HSTRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000514#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 v = Py_BuildValue("(is)", h_error, "host not found");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000516#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (v != NULL) {
518 PyErr_SetObject(socket_herror, v);
519 Py_DECREF(v);
520 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000521
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000523}
524
525
526static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000527set_gaierror(int error)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 PyObject *v;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000530
Martin v. Löwis272cb402002-03-01 08:31:07 +0000531#ifdef EAI_SYSTEM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 /* EAI_SYSTEM is not available on Windows XP. */
533 if (error == EAI_SYSTEM)
534 return set_error();
Martin v. Löwis272cb402002-03-01 08:31:07 +0000535#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000536
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000537#ifdef HAVE_GAI_STRERROR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 v = Py_BuildValue("(is)", error, gai_strerror(error));
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000539#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 v = Py_BuildValue("(is)", error, "getaddrinfo failed");
Martin v. Löwisf95dd0a2001-08-15 17:14:33 +0000541#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 if (v != NULL) {
543 PyErr_SetObject(socket_gaierror, v);
544 Py_DECREF(v);
545 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000546
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000547 return NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000548}
549
Guido van Rossum3eede5a2002-06-07 02:08:35 +0000550/* Function to perform the setting of socket blocking mode
551 internally. block = (1 | 0). */
Guido van Rossum67f7a382002-06-06 21:08:16 +0000552static int
553internal_setblocking(PySocketSockObject *s, int block)
554{
Victor Stinner9a954832013-12-04 00:41:24 +0100555#if !defined(MS_WINDOWS) \
Christian Heimesaf01f662013-12-21 16:19:10 +0100556 && !((defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO)))
Victor Stinner9a954832013-12-04 00:41:24 +0100557 int delay_flag, new_delay_flag;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000558#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +0000559#ifdef SOCK_NONBLOCK
560 if (block)
561 s->sock_type &= (~SOCK_NONBLOCK);
562 else
563 s->sock_type |= SOCK_NONBLOCK;
564#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 Py_BEGIN_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000567#ifndef MS_WINDOWS
Christian Heimesaf01f662013-12-21 16:19:10 +0100568#if (defined(HAVE_SYS_IOCTL_H) && defined(FIONBIO))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 block = !block;
570 ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);
Victor Stinner9a954832013-12-04 00:41:24 +0100571#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 delay_flag = fcntl(s->sock_fd, F_GETFL, 0);
573 if (block)
Victor Stinner9a954832013-12-04 00:41:24 +0100574 new_delay_flag = delay_flag & (~O_NONBLOCK);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 else
Victor Stinner9a954832013-12-04 00:41:24 +0100576 new_delay_flag = delay_flag | O_NONBLOCK;
577 if (new_delay_flag != delay_flag)
578 fcntl(s->sock_fd, F_SETFL, new_delay_flag);
579#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +0000580#else /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 block = !block;
582 ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);
Guido van Rossum67f7a382002-06-06 21:08:16 +0000583#endif /* MS_WINDOWS */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +0000585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 /* Since these don't return anything */
587 return 1;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000588}
589
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000590/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).
Guido van Rossum11ba0942002-06-13 15:07:44 +0000591 The argument writing indicates the direction.
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000592 This does not raise an exception; we'll let our caller do that
593 after they've reacquired the interpreter lock.
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000594 Returns 1 on timeout, -1 on error, 0 otherwise. */
Raymond Hettingeref7343c2003-06-29 03:08:05 +0000595static int
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000596internal_select_ex(PySocketSockObject *s, int writing, double interval)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000597{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 int n;
Guido van Rossum11ba0942002-06-13 15:07:44 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 /* Nothing to do unless we're in timeout mode (not non-blocking) */
601 if (s->sock_timeout <= 0.0)
602 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 /* Guard against closed socket */
605 if (s->sock_fd < 0)
606 return 0;
Guido van Rossumad654902002-07-19 12:44:59 +0000607
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000608 /* Handling this condition here simplifies the select loops */
609 if (interval < 0.0)
610 return 1;
611
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000612 /* Prefer poll, if available, since you can poll() any fd
613 * which can't be done with select(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000614#ifdef HAVE_POLL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 {
616 struct pollfd pollfd;
617 int timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000618
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000619 pollfd.fd = s->sock_fd;
620 pollfd.events = writing ? POLLOUT : POLLIN;
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 /* s->sock_timeout is in seconds, timeout in ms */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000623 timeout = (int)(interval * 1000 + 0.5);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 n = poll(&pollfd, 1, timeout);
625 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000626#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000627 {
628 /* Construct the arguments to select */
629 fd_set fds;
630 struct timeval tv;
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000631 tv.tv_sec = (int)interval;
632 tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 FD_ZERO(&fds);
634 FD_SET(s->sock_fd, &fds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000635
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 /* See if the socket is ready */
637 if (writing)
Antoine Pitrou19467d22010-08-17 19:33:30 +0000638 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
639 NULL, &fds, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 else
Antoine Pitrou19467d22010-08-17 19:33:30 +0000641 n = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
642 &fds, NULL, NULL, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000643 }
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000644#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000645
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 if (n < 0)
647 return -1;
648 if (n == 0)
649 return 1;
650 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000651}
652
Antoine Pitrou3e1fd272010-09-28 21:23:11 +0000653static int
654internal_select(PySocketSockObject *s, int writing)
655{
656 return internal_select_ex(s, writing, s->sock_timeout);
657}
658
659/*
660 Two macros for automatic retry of select() in case of false positives
661 (for example, select() could indicate a socket is ready for reading
662 but the data then discarded by the OS because of a wrong checksum).
663 Here is an example of use:
664
665 BEGIN_SELECT_LOOP(s)
666 Py_BEGIN_ALLOW_THREADS
667 timeout = internal_select_ex(s, 0, interval);
668 if (!timeout)
669 outlen = recv(s->sock_fd, cbuf, len, flags);
670 Py_END_ALLOW_THREADS
671 if (timeout == 1) {
672 PyErr_SetString(socket_timeout, "timed out");
673 return -1;
674 }
675 END_SELECT_LOOP(s)
676*/
677
678#define BEGIN_SELECT_LOOP(s) \
679 { \
680 _PyTime_timeval now, deadline = {0, 0}; \
681 double interval = s->sock_timeout; \
682 int has_timeout = s->sock_timeout > 0.0; \
683 if (has_timeout) { \
684 _PyTime_gettimeofday(&now); \
685 deadline = now; \
686 _PyTime_ADD_SECONDS(deadline, s->sock_timeout); \
687 } \
688 while (1) { \
689 errno = 0; \
690
691#define END_SELECT_LOOP(s) \
692 if (!has_timeout || \
693 (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \
694 break; \
695 _PyTime_gettimeofday(&now); \
696 interval = _PyTime_INTERVAL(now, deadline); \
697 } \
698 } \
699
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000700/* Initialize a new socket object. */
701
Tim Petersa12b4cf2002-07-18 22:38:44 +0000702static double defaulttimeout = -1.0; /* Default timeout for new sockets */
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000703
Martin v. Löwis1a214512008-06-11 05:26:20 +0000704static void
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000705init_sockobject(PySocketSockObject *s,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 SOCKET_T fd, int family, int type, int proto)
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000707{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708 s->sock_fd = fd;
709 s->sock_family = family;
710 s->sock_type = type;
711 s->sock_proto = proto;
Guido van Rossum67f7a382002-06-06 21:08:16 +0000712
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 s->errorhandler = &set_error;
Antoine Pitroub1c54962010-10-14 15:05:38 +0000714#ifdef SOCK_NONBLOCK
715 if (type & SOCK_NONBLOCK)
716 s->sock_timeout = 0.0;
717 else
718#endif
719 {
720 s->sock_timeout = defaulttimeout;
721 if (defaulttimeout >= 0.0)
722 internal_setblocking(s, 0);
723 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000724
Guido van Rossum384ca9c2001-10-27 22:20:47 +0000725}
726
727
Guido van Rossum30a685f1991-06-27 15:51:29 +0000728/* Create a new socket object.
729 This just creates the object and initializes it.
730 If the creation fails, return NULL and set an exception (implicit
731 in NEWOBJ()). */
732
Guido van Rossum73624e91994-10-10 17:59:00 +0000733static PySocketSockObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +0000734new_sockobject(SOCKET_T fd, int family, int type, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000735{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 PySocketSockObject *s;
737 s = (PySocketSockObject *)
738 PyType_GenericNew(&sock_type, NULL, NULL);
739 if (s != NULL)
740 init_sockobject(s, fd, family, type, proto);
741 return s;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000742}
743
Guido van Rossum30a685f1991-06-27 15:51:29 +0000744
Guido van Rossum48a680c2001-03-02 06:34:14 +0000745/* Lock to allow python interpreter to continue, but only allow one
Just van Rossum1040d2c2003-05-09 07:53:18 +0000746 thread to be in gethostbyname or getaddrinfo */
747#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Matthias Klosed182a6c2012-08-14 17:29:04 +0200748static PyThread_type_lock netdb_lock;
Guido van Rossum4f199ea1998-04-09 20:56:35 +0000749#endif
750
751
Guido van Rossum30a685f1991-06-27 15:51:29 +0000752/* Convert a string specifying a host name or one of a few symbolic
753 names to a numeric IP address. This usually calls gethostbyname()
754 to do the work; the names "" and "<broadcast>" are special.
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000755 Return the length (IPv4 should be 4 bytes), or negative if
Guido van Rossum30a685f1991-06-27 15:51:29 +0000756 an error occurred; then an exception is raised. */
757
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000758static int
Martin v. Löwisddc6f472002-07-28 16:10:31 +0000759setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 struct addrinfo hints, *res;
762 int error;
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 memset((void *) addr_ret, '\0', sizeof(*addr_ret));
765 if (name[0] == '\0') {
766 int siz;
767 memset(&hints, 0, sizeof(hints));
768 hints.ai_family = af;
769 hints.ai_socktype = SOCK_DGRAM; /*dummy*/
770 hints.ai_flags = AI_PASSIVE;
771 Py_BEGIN_ALLOW_THREADS
772 ACQUIRE_GETADDRINFO_LOCK
773 error = getaddrinfo(NULL, "0", &hints, &res);
774 Py_END_ALLOW_THREADS
775 /* We assume that those thread-unsafe getaddrinfo() versions
776 *are* safe regarding their return value, ie. that a
777 subsequent call to getaddrinfo() does not destroy the
778 outcome of the first call. */
779 RELEASE_GETADDRINFO_LOCK
780 if (error) {
781 set_gaierror(error);
782 return -1;
783 }
784 switch (res->ai_family) {
785 case AF_INET:
786 siz = 4;
787 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000788#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 case AF_INET6:
790 siz = 16;
791 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000792#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 default:
794 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200795 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 "unsupported address family");
797 return -1;
798 }
799 if (res->ai_next) {
800 freeaddrinfo(res);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200801 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 "wildcard resolved to multiple address");
803 return -1;
804 }
805 if (res->ai_addrlen < addr_ret_size)
806 addr_ret_size = res->ai_addrlen;
807 memcpy(addr_ret, res->ai_addr, addr_ret_size);
808 freeaddrinfo(res);
809 return siz;
810 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200811 /* special-case broadcast - inet_addr() below can return INADDR_NONE for
Victor Stinnere990c6e2013-11-16 00:18:58 +0100812 * this */
Charles-François Natali0cc86852013-09-13 19:53:08 +0200813 if (strcmp(name, "255.255.255.255") == 0 ||
814 strcmp(name, "<broadcast>") == 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 struct sockaddr_in *sin;
816 if (af != AF_INET && af != AF_UNSPEC) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200817 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 "address family mismatched");
819 return -1;
820 }
821 sin = (struct sockaddr_in *)addr_ret;
822 memset((void *) sin, '\0', sizeof(*sin));
823 sin->sin_family = AF_INET;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000824#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000825 sin->sin_len = sizeof(*sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000826#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 sin->sin_addr.s_addr = INADDR_BROADCAST;
828 return sizeof(sin->sin_addr);
829 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200830
831 /* avoid a name resolution in case of numeric address */
832#ifdef HAVE_INET_PTON
833 /* check for an IPv4 address */
834 if (af == AF_UNSPEC || af == AF_INET) {
835 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
836 memset(sin, 0, sizeof(*sin));
837 if (inet_pton(AF_INET, name, &sin->sin_addr) > 0) {
838 sin->sin_family = AF_INET;
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000839#ifdef HAVE_SOCKADDR_SA_LEN
Charles-François Natali0cc86852013-09-13 19:53:08 +0200840 sin->sin_len = sizeof(*sin);
Anthony Baxter0e85f9d2003-05-02 15:40:46 +0000841#endif
Charles-François Natali0cc86852013-09-13 19:53:08 +0200842 return 4;
843 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200845#ifdef ENABLE_IPV6
846 /* check for an IPv6 address - if the address contains a scope ID, we
847 * fallback to getaddrinfo(), which can handle translation from interface
848 * name to interface index */
849 if ((af == AF_UNSPEC || af == AF_INET6) && !strchr(name, '%')) {
850 struct sockaddr_in6 *sin = (struct sockaddr_in6 *)addr_ret;
851 memset(sin, 0, sizeof(*sin));
852 if (inet_pton(AF_INET6, name, &sin->sin6_addr) > 0) {
853 sin->sin6_family = AF_INET6;
854#ifdef HAVE_SOCKADDR_SA_LEN
855 sin->sin6_len = sizeof(*sin);
856#endif
857 return 16;
858 }
859 }
860#endif /* ENABLE_IPV6 */
861#else /* HAVE_INET_PTON */
862 /* check for an IPv4 address */
863 if (af == AF_INET || af == AF_UNSPEC) {
864 struct sockaddr_in *sin = (struct sockaddr_in *)addr_ret;
865 memset(sin, 0, sizeof(*sin));
866 if ((sin->sin_addr.s_addr = inet_addr(name)) != INADDR_NONE) {
867 sin->sin_family = AF_INET;
868#ifdef HAVE_SOCKADDR_SA_LEN
869 sin->sin_len = sizeof(*sin);
870#endif
871 return 4;
872 }
Victor Stinnere990c6e2013-11-16 00:18:58 +0100873 }
Charles-François Natali0cc86852013-09-13 19:53:08 +0200874#endif /* HAVE_INET_PTON */
875
876 /* perform a name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 memset(&hints, 0, sizeof(hints));
878 hints.ai_family = af;
879 Py_BEGIN_ALLOW_THREADS
880 ACQUIRE_GETADDRINFO_LOCK
881 error = getaddrinfo(name, NULL, &hints, &res);
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000882#if defined(__digital__) && defined(__unix__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 if (error == EAI_NONAME && af == AF_UNSPEC) {
884 /* On Tru64 V5.1, numeric-to-addr conversion fails
885 if no address family is given. Assume IPv4 for now.*/
886 hints.ai_family = AF_INET;
887 error = getaddrinfo(name, NULL, &hints, &res);
888 }
Martin v. Löwis7c4b5fa2001-10-25 09:04:03 +0000889#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 Py_END_ALLOW_THREADS
891 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
892 if (error) {
893 set_gaierror(error);
894 return -1;
895 }
896 if (res->ai_addrlen < addr_ret_size)
897 addr_ret_size = res->ai_addrlen;
898 memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);
899 freeaddrinfo(res);
900 switch (addr_ret->sa_family) {
901 case AF_INET:
902 return 4;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +0000903#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 case AF_INET6:
905 return 16;
Guido van Rossum955becc1999-03-22 20:14:53 +0000906#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200908 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000909 return -1;
910 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000911}
912
Guido van Rossum30a685f1991-06-27 15:51:29 +0000913
Guido van Rossum30a685f1991-06-27 15:51:29 +0000914/* Create a string object representing an IP address.
915 This is always a string of the form 'dd.dd.dd.dd' (with variable
916 size numbers). */
917
Guido van Rossum73624e91994-10-10 17:59:00 +0000918static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000919makeipaddr(struct sockaddr *addr, int addrlen)
Guido van Rossum30a685f1991-06-27 15:51:29 +0000920{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000921 char buf[NI_MAXHOST];
922 int error;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +0000923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000924 error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
925 NI_NUMERICHOST);
926 if (error) {
927 set_gaierror(error);
928 return NULL;
929 }
930 return PyUnicode_FromString(buf);
Guido van Rossum30a685f1991-06-27 15:51:29 +0000931}
932
933
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000934#ifdef USE_BLUETOOTH
935/* Convert a string representation of a Bluetooth address into a numeric
936 address. Returns the length (6), or raises an exception and returns -1 if
937 an error occurred. */
938
939static int
940setbdaddr(char *name, bdaddr_t *bdaddr)
941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 unsigned int b0, b1, b2, b3, b4, b5;
943 char ch;
944 int n;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000945
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",
947 &b5, &b4, &b3, &b2, &b1, &b0, &ch);
948 if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {
949 bdaddr->b[0] = b0;
950 bdaddr->b[1] = b1;
951 bdaddr->b[2] = b2;
952 bdaddr->b[3] = b3;
953 bdaddr->b[4] = b4;
954 bdaddr->b[5] = b5;
955 return 6;
956 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +0200957 PyErr_SetString(PyExc_OSError, "bad bluetooth address");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 return -1;
959 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000960}
961
962/* Create a string representation of the Bluetooth address. This is always a
963 string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal
964 value (zero padded if necessary). */
965
966static PyObject *
967makebdaddr(bdaddr_t *bdaddr)
968{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000969 char buf[(6 * 2) + 5 + 1];
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
972 bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
973 bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
974 return PyUnicode_FromString(buf);
Martin v. Löwis558d9bf2004-06-03 09:24:42 +0000975}
976#endif
977
978
Guido van Rossum30a685f1991-06-27 15:51:29 +0000979/* Create an object representing the given socket address,
980 suitable for passing it back to bind(), connect() etc.
981 The family field of the sockaddr structure is inspected
982 to determine what kind of address it really is. */
983
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000984/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +0000985static PyObject *
Antoine Pitrou19467d22010-08-17 19:33:30 +0000986makesockaddr(SOCKET_T sockfd, struct sockaddr *addr, size_t addrlen, int proto)
Guido van Rossum6574b3e1991-06-25 21:36:08 +0000987{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 if (addrlen == 0) {
989 /* No address -- may be recvfrom() from known socket */
990 Py_INCREF(Py_None);
991 return Py_None;
992 }
Guido van Rossum25bec8c1992-08-05 19:00:45 +0000993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 switch (addr->sa_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +0000995
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000996 case AF_INET:
997 {
998 struct sockaddr_in *a;
999 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1000 PyObject *ret = NULL;
1001 if (addrobj) {
1002 a = (struct sockaddr_in *)addr;
1003 ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
1004 Py_DECREF(addrobj);
1005 }
1006 return ret;
1007 }
Guido van Rossum30a685f1991-06-27 15:51:29 +00001008
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001009#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 case AF_UNIX:
1011 {
1012 struct sockaddr_un *a = (struct sockaddr_un *) addr;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001013#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001014 if (a->sun_path[0] == 0) { /* Linux abstract namespace */
1015 addrlen -= offsetof(struct sockaddr_un, sun_path);
Charles-François Natalib10c71d2013-05-21 10:45:46 +02001016 return PyBytes_FromStringAndSize(a->sun_path, addrlen);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001017 }
1018 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001019#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001020 {
1021 /* regular NULL-terminated string */
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001022 return PyUnicode_DecodeFSDefault(a->sun_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001023 }
1024 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001025#endif /* AF_UNIX */
1026
Martin v. Löwis11017b12006-01-14 18:12:57 +00001027#if defined(AF_NETLINK)
1028 case AF_NETLINK:
1029 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 struct sockaddr_nl *a = (struct sockaddr_nl *) addr;
1031 return Py_BuildValue("II", a->nl_pid, a->nl_groups);
Martin v. Löwis11017b12006-01-14 18:12:57 +00001032 }
1033#endif /* AF_NETLINK */
1034
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001035#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 case AF_INET6:
1037 {
1038 struct sockaddr_in6 *a;
1039 PyObject *addrobj = makeipaddr(addr, sizeof(*a));
1040 PyObject *ret = NULL;
1041 if (addrobj) {
1042 a = (struct sockaddr_in6 *)addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01001043 ret = Py_BuildValue("OiII",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001044 addrobj,
1045 ntohs(a->sin6_port),
Charles-François Natali366999a2012-01-02 15:47:29 +01001046 ntohl(a->sin6_flowinfo),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 a->sin6_scope_id);
1048 Py_DECREF(addrobj);
1049 }
1050 return ret;
1051 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001052#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00001053
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001054#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 case AF_BLUETOOTH:
1056 switch (proto) {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 case BTPROTO_L2CAP:
1059 {
1060 struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;
1061 PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));
1062 PyObject *ret = NULL;
1063 if (addrobj) {
1064 ret = Py_BuildValue("Oi",
1065 addrobj,
1066 _BT_L2_MEMB(a, psm));
1067 Py_DECREF(addrobj);
1068 }
1069 return ret;
1070 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 case BTPROTO_RFCOMM:
1073 {
1074 struct sockaddr_rc *a = (struct sockaddr_rc *) addr;
1075 PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));
1076 PyObject *ret = NULL;
1077 if (addrobj) {
1078 ret = Py_BuildValue("Oi",
1079 addrobj,
1080 _BT_RC_MEMB(a, channel));
1081 Py_DECREF(addrobj);
1082 }
1083 return ret;
1084 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001085
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 case BTPROTO_HCI:
1087 {
1088 struct sockaddr_hci *a = (struct sockaddr_hci *) addr;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001089#if defined(__NetBSD__) || defined(__DragonFly__)
1090 return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));
1091#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001092 PyObject *ret = NULL;
1093 ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));
1094 return ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001095#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001096 }
Thomas Wouterscf297e42007-02-23 15:07:44 +00001097
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001098#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001099 case BTPROTO_SCO:
1100 {
1101 struct sockaddr_sco *a = (struct sockaddr_sco *) addr;
1102 return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));
1103 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001104#endif
1105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001106 default:
1107 PyErr_SetString(PyExc_ValueError,
1108 "Unknown Bluetooth protocol");
1109 return NULL;
1110 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001111#endif
1112
Antoine Pitroub156a462010-10-27 20:13:57 +00001113#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001114 case AF_PACKET:
1115 {
1116 struct sockaddr_ll *a = (struct sockaddr_ll *)addr;
1117 char *ifname = "";
1118 struct ifreq ifr;
1119 /* need to look up interface name give index */
1120 if (a->sll_ifindex) {
1121 ifr.ifr_ifindex = a->sll_ifindex;
1122 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1123 ifname = ifr.ifr_name;
1124 }
1125 return Py_BuildValue("shbhy#",
1126 ifname,
1127 ntohs(a->sll_protocol),
1128 a->sll_pkttype,
1129 a->sll_hatype,
1130 a->sll_addr,
1131 a->sll_halen);
1132 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001133#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001134
Christian Heimes043d6f62008-01-07 17:19:16 +00001135#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001136 case AF_TIPC:
1137 {
1138 struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;
1139 if (a->addrtype == TIPC_ADDR_NAMESEQ) {
1140 return Py_BuildValue("IIIII",
1141 a->addrtype,
1142 a->addr.nameseq.type,
1143 a->addr.nameseq.lower,
1144 a->addr.nameseq.upper,
1145 a->scope);
1146 } else if (a->addrtype == TIPC_ADDR_NAME) {
1147 return Py_BuildValue("IIIII",
1148 a->addrtype,
1149 a->addr.name.name.type,
1150 a->addr.name.name.instance,
1151 a->addr.name.name.instance,
1152 a->scope);
1153 } else if (a->addrtype == TIPC_ADDR_ID) {
1154 return Py_BuildValue("IIIII",
1155 a->addrtype,
1156 a->addr.id.node,
1157 a->addr.id.ref,
1158 0,
1159 a->scope);
1160 } else {
1161 PyErr_SetString(PyExc_ValueError,
1162 "Invalid address type");
1163 return NULL;
1164 }
1165 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001166#endif
1167
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001168#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001169 case AF_CAN:
1170 {
1171 struct sockaddr_can *a = (struct sockaddr_can *)addr;
1172 char *ifname = "";
1173 struct ifreq ifr;
1174 /* need to look up interface name given index */
1175 if (a->can_ifindex) {
1176 ifr.ifr_ifindex = a->can_ifindex;
1177 if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)
1178 ifname = ifr.ifr_name;
1179 }
1180
1181 return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault,
1182 ifname,
1183 a->can_family);
1184 }
1185#endif
1186
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001187#ifdef PF_SYSTEM
1188 case PF_SYSTEM:
1189 switch(proto) {
1190#ifdef SYSPROTO_CONTROL
1191 case SYSPROTO_CONTROL:
1192 {
1193 struct sockaddr_ctl *a = (struct sockaddr_ctl *)addr;
1194 return Py_BuildValue("(II)", a->sc_id, a->sc_unit);
1195 }
1196#endif
1197 default:
1198 PyErr_SetString(PyExc_ValueError,
1199 "Invalid address type");
1200 return 0;
1201 }
1202#endif
1203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001204 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001206 default:
1207 /* If we don't know the address family, don't raise an
1208 exception -- return it as an (int, bytes) tuple. */
1209 return Py_BuildValue("iy#",
1210 addr->sa_family,
1211 addr->sa_data,
1212 sizeof(addr->sa_data));
Guido van Rossum25bec8c1992-08-05 19:00:45 +00001213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001214 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001215}
1216
Guido van Rossum30a685f1991-06-27 15:51:29 +00001217
1218/* Parse a socket address argument according to the socket object's
1219 address family. Return 1 if the address was in the proper format,
1220 0 of not. The address is returned through addr_ret, its length
1221 through len_ret. */
1222
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001223static int
Guido van Rossum48a680c2001-03-02 06:34:14 +00001224getsockaddrarg(PySocketSockObject *s, PyObject *args,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001225 struct sockaddr *addr_ret, int *len_ret)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001226{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001227 switch (s->sock_family) {
Guido van Rossum30a685f1991-06-27 15:51:29 +00001228
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001229#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001230 case AF_UNIX:
1231 {
1232 struct sockaddr_un* addr;
1233 char *path;
1234 int len;
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001235 int retval = 0;
1236
1237 /* PEP 383. Not using PyUnicode_FSConverter since we need to
1238 allow embedded nulls on Linux. */
1239 if (PyUnicode_Check(args)) {
1240 if ((args = PyUnicode_EncodeFSDefault(args)) == NULL)
1241 return 0;
1242 }
1243 else
1244 Py_INCREF(args);
1245 if (!PyArg_Parse(args, "y#", &path, &len))
1246 goto unix_out;
Thomas Wouters89f507f2006-12-13 04:49:30 +00001247
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001248 addr = (struct sockaddr_un*)addr_ret;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001249#ifdef linux
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001250 if (len > 0 && path[0] == 0) {
1251 /* Linux abstract namespace extension */
1252 if (len > sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001253 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001254 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001255 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001256 }
1257 }
1258 else
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001259#endif /* linux */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 {
1261 /* regular NULL-terminated string */
1262 if (len >= sizeof addr->sun_path) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001263 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001264 "AF_UNIX path too long");
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001265 goto unix_out;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001266 }
1267 addr->sun_path[len] = 0;
1268 }
1269 addr->sun_family = s->sock_family;
1270 memcpy(addr->sun_path, path, len);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001271 *len_ret = len + offsetof(struct sockaddr_un, sun_path);
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01001272 retval = 1;
1273 unix_out:
1274 Py_DECREF(args);
1275 return retval;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001276 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001277#endif /* AF_UNIX */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001278
Martin v. Löwis11017b12006-01-14 18:12:57 +00001279#if defined(AF_NETLINK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001280 case AF_NETLINK:
1281 {
1282 struct sockaddr_nl* addr;
1283 int pid, groups;
1284 addr = (struct sockaddr_nl *)addr_ret;
1285 if (!PyTuple_Check(args)) {
1286 PyErr_Format(
1287 PyExc_TypeError,
1288 "getsockaddrarg: "
1289 "AF_NETLINK address must be tuple, not %.500s",
1290 Py_TYPE(args)->tp_name);
1291 return 0;
1292 }
1293 if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))
1294 return 0;
1295 addr->nl_family = AF_NETLINK;
1296 addr->nl_pid = pid;
1297 addr->nl_groups = groups;
1298 *len_ret = sizeof(*addr);
1299 return 1;
1300 }
Martin v. Löwis11017b12006-01-14 18:12:57 +00001301#endif
1302
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001303#ifdef AF_RDS
1304 case AF_RDS:
1305 /* RDS sockets use sockaddr_in: fall-through */
1306#endif
1307
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001308 case AF_INET:
1309 {
1310 struct sockaddr_in* addr;
1311 char *host;
1312 int port, result;
1313 if (!PyTuple_Check(args)) {
1314 PyErr_Format(
1315 PyExc_TypeError,
1316 "getsockaddrarg: "
1317 "AF_INET address must be tuple, not %.500s",
1318 Py_TYPE(args)->tp_name);
1319 return 0;
1320 }
1321 if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",
1322 "idna", &host, &port))
1323 return 0;
1324 addr=(struct sockaddr_in*)addr_ret;
1325 result = setipaddr(host, (struct sockaddr *)addr,
1326 sizeof(*addr), AF_INET);
1327 PyMem_Free(host);
1328 if (result < 0)
1329 return 0;
1330 if (port < 0 || port > 0xffff) {
1331 PyErr_SetString(
1332 PyExc_OverflowError,
1333 "getsockaddrarg: port must be 0-65535.");
1334 return 0;
1335 }
1336 addr->sin_family = AF_INET;
1337 addr->sin_port = htons((short)port);
1338 *len_ret = sizeof *addr;
1339 return 1;
1340 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001341
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001342#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001343 case AF_INET6:
1344 {
1345 struct sockaddr_in6* addr;
1346 char *host;
Charles-François Natali366999a2012-01-02 15:47:29 +01001347 int port, result;
1348 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001349 flowinfo = scope_id = 0;
1350 if (!PyTuple_Check(args)) {
1351 PyErr_Format(
1352 PyExc_TypeError,
1353 "getsockaddrarg: "
1354 "AF_INET6 address must be tuple, not %.500s",
1355 Py_TYPE(args)->tp_name);
1356 return 0;
1357 }
Charles-François Natali366999a2012-01-02 15:47:29 +01001358 if (!PyArg_ParseTuple(args, "eti|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001359 "idna", &host, &port, &flowinfo,
1360 &scope_id)) {
1361 return 0;
1362 }
1363 addr = (struct sockaddr_in6*)addr_ret;
1364 result = setipaddr(host, (struct sockaddr *)addr,
1365 sizeof(*addr), AF_INET6);
1366 PyMem_Free(host);
1367 if (result < 0)
1368 return 0;
1369 if (port < 0 || port > 0xffff) {
1370 PyErr_SetString(
1371 PyExc_OverflowError,
1372 "getsockaddrarg: port must be 0-65535.");
1373 return 0;
1374 }
Charles-François Natali9b0c0062012-06-23 10:17:05 +02001375 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01001376 PyErr_SetString(
1377 PyExc_OverflowError,
1378 "getsockaddrarg: flowinfo must be 0-1048575.");
1379 return 0;
1380 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001381 addr->sin6_family = s->sock_family;
1382 addr->sin6_port = htons((short)port);
Charles-François Natali366999a2012-01-02 15:47:29 +01001383 addr->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001384 addr->sin6_scope_id = scope_id;
1385 *len_ret = sizeof *addr;
1386 return 1;
1387 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001388#endif
1389
Hye-Shik Chang81268602004-02-02 06:05:24 +00001390#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 case AF_BLUETOOTH:
1392 {
1393 switch (s->sock_proto) {
1394 case BTPROTO_L2CAP:
1395 {
1396 struct sockaddr_l2 *addr;
1397 char *straddr;
Martin v. Löwis12af0482004-01-31 12:34:17 +00001398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001399 addr = (struct sockaddr_l2 *)addr_ret;
1400 memset(addr, 0, sizeof(struct sockaddr_l2));
1401 _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;
1402 if (!PyArg_ParseTuple(args, "si", &straddr,
1403 &_BT_L2_MEMB(addr, psm))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001404 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 "wrong format");
1406 return 0;
1407 }
1408 if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)
1409 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001410
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001411 *len_ret = sizeof *addr;
1412 return 1;
1413 }
1414 case BTPROTO_RFCOMM:
1415 {
1416 struct sockaddr_rc *addr;
1417 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001419 addr = (struct sockaddr_rc *)addr_ret;
1420 _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;
1421 if (!PyArg_ParseTuple(args, "si", &straddr,
1422 &_BT_RC_MEMB(addr, channel))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001423 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001424 "wrong format");
1425 return 0;
1426 }
1427 if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)
1428 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001430 *len_ret = sizeof *addr;
1431 return 1;
1432 }
1433 case BTPROTO_HCI:
1434 {
1435 struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001436#if defined(__NetBSD__) || defined(__DragonFly__)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001437 char *straddr = PyBytes_AS_STRING(args);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001438
Alexander Belopolskye239d232010-12-08 23:31:48 +00001439 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001440 if (straddr == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001441 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001442 "wrong format");
1443 return 0;
1444 }
1445 if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)
1446 return 0;
1447#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001448 _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;
1449 if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001450 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001451 "wrong format");
1452 return 0;
1453 }
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00001454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001455 *len_ret = sizeof *addr;
1456 return 1;
1457 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001458#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 case BTPROTO_SCO:
1460 {
1461 struct sockaddr_sco *addr;
1462 char *straddr;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001464 addr = (struct sockaddr_sco *)addr_ret;
1465 _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;
1466 if (!PyBytes_Check(args)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001467 PyErr_SetString(PyExc_OSError, "getsockaddrarg: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001468 "wrong format");
1469 return 0;
1470 }
1471 straddr = PyBytes_AS_STRING(args);
1472 if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)
1473 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 *len_ret = sizeof *addr;
1476 return 1;
1477 }
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001478#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001479 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001480 PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001481 return 0;
1482 }
1483 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001484#endif
1485
Antoine Pitroub156a462010-10-27 20:13:57 +00001486#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001487 case AF_PACKET:
1488 {
1489 struct sockaddr_ll* addr;
1490 struct ifreq ifr;
1491 char *interfaceName;
1492 int protoNumber;
1493 int hatype = 0;
1494 int pkttype = 0;
1495 char *haddr = NULL;
1496 unsigned int halen = 0;
Guido van Rossum48a680c2001-03-02 06:34:14 +00001497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001498 if (!PyTuple_Check(args)) {
1499 PyErr_Format(
1500 PyExc_TypeError,
1501 "getsockaddrarg: "
1502 "AF_PACKET address must be tuple, not %.500s",
1503 Py_TYPE(args)->tp_name);
1504 return 0;
1505 }
1506 if (!PyArg_ParseTuple(args, "si|iiy#", &interfaceName,
1507 &protoNumber, &pkttype, &hatype,
1508 &haddr, &halen))
1509 return 0;
1510 strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));
1511 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
1512 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1513 s->errorhandler();
1514 return 0;
1515 }
1516 if (halen > 8) {
1517 PyErr_SetString(PyExc_ValueError,
1518 "Hardware address must be 8 bytes or less");
1519 return 0;
1520 }
1521 if (protoNumber < 0 || protoNumber > 0xffff) {
1522 PyErr_SetString(
1523 PyExc_OverflowError,
1524 "getsockaddrarg: protoNumber must be 0-65535.");
1525 return 0;
1526 }
1527 addr = (struct sockaddr_ll*)addr_ret;
1528 addr->sll_family = AF_PACKET;
1529 addr->sll_protocol = htons((short)protoNumber);
1530 addr->sll_ifindex = ifr.ifr_ifindex;
1531 addr->sll_pkttype = pkttype;
1532 addr->sll_hatype = hatype;
1533 if (halen != 0) {
1534 memcpy(&addr->sll_addr, haddr, halen);
1535 }
1536 addr->sll_halen = halen;
1537 *len_ret = sizeof *addr;
1538 return 1;
1539 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00001540#endif
1541
Christian Heimes043d6f62008-01-07 17:19:16 +00001542#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001543 case AF_TIPC:
1544 {
1545 unsigned int atype, v1, v2, v3;
1546 unsigned int scope = TIPC_CLUSTER_SCOPE;
1547 struct sockaddr_tipc *addr;
Christian Heimes043d6f62008-01-07 17:19:16 +00001548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001549 if (!PyTuple_Check(args)) {
1550 PyErr_Format(
1551 PyExc_TypeError,
1552 "getsockaddrarg: "
1553 "AF_TIPC address must be tuple, not %.500s",
1554 Py_TYPE(args)->tp_name);
1555 return 0;
1556 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001558 if (!PyArg_ParseTuple(args,
1559 "IIII|I;Invalid TIPC address format",
1560 &atype, &v1, &v2, &v3, &scope))
1561 return 0;
Christian Heimes043d6f62008-01-07 17:19:16 +00001562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001563 addr = (struct sockaddr_tipc *) addr_ret;
1564 memset(addr, 0, sizeof(struct sockaddr_tipc));
Christian Heimes043d6f62008-01-07 17:19:16 +00001565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001566 addr->family = AF_TIPC;
1567 addr->scope = scope;
1568 addr->addrtype = atype;
Christian Heimes043d6f62008-01-07 17:19:16 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 if (atype == TIPC_ADDR_NAMESEQ) {
1571 addr->addr.nameseq.type = v1;
1572 addr->addr.nameseq.lower = v2;
1573 addr->addr.nameseq.upper = v3;
1574 } else if (atype == TIPC_ADDR_NAME) {
1575 addr->addr.name.name.type = v1;
1576 addr->addr.name.name.instance = v2;
1577 } else if (atype == TIPC_ADDR_ID) {
1578 addr->addr.id.node = v1;
1579 addr->addr.id.ref = v2;
1580 } else {
1581 /* Shouldn't happen */
1582 PyErr_SetString(PyExc_TypeError, "Invalid address type");
1583 return 0;
1584 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001586 *len_ret = sizeof(*addr);
Christian Heimes043d6f62008-01-07 17:19:16 +00001587
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001588 return 1;
1589 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001590#endif
1591
Vinay Sajiped6783f2014-03-21 11:44:32 +00001592#if defined(AF_CAN) && defined(CAN_RAW) && defined(CAN_BCM)
Charles-François Natali47413c12011-10-06 19:47:44 +02001593 case AF_CAN:
1594 switch (s->sock_proto) {
1595 case CAN_RAW:
Charles-François Natali773e42d2013-02-05 19:42:01 +01001596 /* fall-through */
1597 case CAN_BCM:
Charles-François Natali47413c12011-10-06 19:47:44 +02001598 {
1599 struct sockaddr_can *addr;
1600 PyObject *interfaceName;
1601 struct ifreq ifr;
Charles-François Natali47413c12011-10-06 19:47:44 +02001602 Py_ssize_t len;
1603
Benjamin Peterson18b71912013-05-16 15:29:44 -05001604 addr = (struct sockaddr_can *)addr_ret;
1605
Charles-François Natali47413c12011-10-06 19:47:44 +02001606 if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter,
1607 &interfaceName))
1608 return 0;
1609
1610 len = PyBytes_GET_SIZE(interfaceName);
1611
1612 if (len == 0) {
1613 ifr.ifr_ifindex = 0;
1614 } else if (len < sizeof(ifr.ifr_name)) {
Christian Heimes15b68852012-09-10 01:25:50 +02001615 strncpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName), sizeof(ifr.ifr_name));
1616 ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';
Charles-François Natali47413c12011-10-06 19:47:44 +02001617 if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {
1618 s->errorhandler();
1619 Py_DECREF(interfaceName);
1620 return 0;
1621 }
1622 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001623 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001624 "AF_CAN interface name too long");
1625 Py_DECREF(interfaceName);
1626 return 0;
1627 }
1628
1629 addr->can_family = AF_CAN;
1630 addr->can_ifindex = ifr.ifr_ifindex;
1631
1632 *len_ret = sizeof(*addr);
1633 Py_DECREF(interfaceName);
1634 return 1;
1635 }
1636 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001637 PyErr_SetString(PyExc_OSError,
Charles-François Natali47413c12011-10-06 19:47:44 +02001638 "getsockaddrarg: unsupported CAN protocol");
1639 return 0;
1640 }
1641#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001642
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001643#ifdef PF_SYSTEM
1644 case PF_SYSTEM:
1645 switch (s->sock_proto) {
1646#ifdef SYSPROTO_CONTROL
1647 case SYSPROTO_CONTROL:
1648 {
1649 struct sockaddr_ctl *addr;
Victor Stinnera534fc42013-06-03 22:07:27 +02001650
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001651 addr = (struct sockaddr_ctl *)addr_ret;
1652 addr->sc_family = AF_SYSTEM;
Victor Stinnera534fc42013-06-03 22:07:27 +02001653 addr->ss_sysaddr = AF_SYS_CONTROL;
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001654
1655 if (PyUnicode_Check(args)) {
1656 struct ctl_info info;
1657 PyObject *ctl_name;
1658
1659 if (!PyArg_Parse(args, "O&",
1660 PyUnicode_FSConverter, &ctl_name)) {
1661 return 0;
1662 }
1663
1664 if (PyBytes_GET_SIZE(ctl_name) > sizeof(info.ctl_name)) {
1665 PyErr_SetString(PyExc_ValueError,
1666 "provided string is too long");
1667 Py_DECREF(ctl_name);
1668 return 0;
1669 }
1670 strncpy(info.ctl_name, PyBytes_AS_STRING(ctl_name),
1671 sizeof(info.ctl_name));
1672 Py_DECREF(ctl_name);
1673
1674 if (ioctl(s->sock_fd, CTLIOCGINFO, &info)) {
1675 PyErr_SetString(PyExc_OSError,
1676 "cannot find kernel control with provided name");
1677 return 0;
1678 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001679
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001680 addr->sc_id = info.ctl_id;
1681 addr->sc_unit = 0;
1682 } else if (!PyArg_ParseTuple(args, "II",
1683 &(addr->sc_id), &(addr->sc_unit))) {
1684 PyErr_SetString(PyExc_TypeError, "getsockaddrarg: "
1685 "expected str or tuple of two ints");
Victor Stinnera534fc42013-06-03 22:07:27 +02001686
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001687 return 0;
1688 }
Victor Stinnera534fc42013-06-03 22:07:27 +02001689
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001690 *len_ret = sizeof(*addr);
1691 return 1;
1692 }
1693#endif
1694 default:
1695 PyErr_SetString(PyExc_OSError,
1696 "getsockaddrarg: unsupported PF_SYSTEM protocol");
1697 return 0;
1698 }
1699#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 /* More cases here... */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001703 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001704 PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001705 return 0;
Guido van Rossum30a685f1991-06-27 15:51:29 +00001706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001707 }
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001708}
1709
Guido van Rossum30a685f1991-06-27 15:51:29 +00001710
Guido van Rossum48a680c2001-03-02 06:34:14 +00001711/* Get the address length according to the socket object's address family.
Guido van Rossum710e1df1992-06-12 10:39:36 +00001712 Return 1 if the family is known, 0 otherwise. The length is returned
1713 through len_ret. */
1714
1715static int
Peter Schneider-Kamp618e25d2000-07-11 23:00:12 +00001716getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)
Guido van Rossum710e1df1992-06-12 10:39:36 +00001717{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001718 switch (s->sock_family) {
Guido van Rossum710e1df1992-06-12 10:39:36 +00001719
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00001720#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001721 case AF_UNIX:
1722 {
1723 *len_ret = sizeof (struct sockaddr_un);
1724 return 1;
1725 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00001726#endif /* AF_UNIX */
Martin v. Löwis11017b12006-01-14 18:12:57 +00001727#if defined(AF_NETLINK)
1728 case AF_NETLINK:
1729 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001730 *len_ret = sizeof (struct sockaddr_nl);
1731 return 1;
Martin v. Löwis11017b12006-01-14 18:12:57 +00001732 }
1733#endif
Guido van Rossum710e1df1992-06-12 10:39:36 +00001734
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001735#ifdef AF_RDS
1736 case AF_RDS:
1737 /* RDS sockets use sockaddr_in: fall-through */
1738#endif
1739
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001740 case AF_INET:
1741 {
1742 *len_ret = sizeof (struct sockaddr_in);
1743 return 1;
1744 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001745
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00001746#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001747 case AF_INET6:
1748 {
1749 *len_ret = sizeof (struct sockaddr_in6);
1750 return 1;
1751 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00001752#endif
1753
Hye-Shik Chang81268602004-02-02 06:05:24 +00001754#ifdef USE_BLUETOOTH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001755 case AF_BLUETOOTH:
1756 {
1757 switch(s->sock_proto)
1758 {
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001759
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 case BTPROTO_L2CAP:
1761 *len_ret = sizeof (struct sockaddr_l2);
1762 return 1;
1763 case BTPROTO_RFCOMM:
1764 *len_ret = sizeof (struct sockaddr_rc);
1765 return 1;
1766 case BTPROTO_HCI:
1767 *len_ret = sizeof (struct sockaddr_hci);
1768 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001769#if !defined(__FreeBSD__)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001770 case BTPROTO_SCO:
1771 *len_ret = sizeof (struct sockaddr_sco);
1772 return 1;
Hye-Shik Chang81268602004-02-02 06:05:24 +00001773#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001774 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001775 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001776 "unknown BT protocol");
1777 return 0;
Martin v. Löwis558d9bf2004-06-03 09:24:42 +00001778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001779 }
1780 }
Martin v. Löwis12af0482004-01-31 12:34:17 +00001781#endif
1782
Martin v. Löwis1ba3fd52001-08-10 20:29:40 +00001783#ifdef HAVE_NETPACKET_PACKET_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001784 case AF_PACKET:
1785 {
1786 *len_ret = sizeof (struct sockaddr_ll);
1787 return 1;
1788 }
Jeremy Hylton22308652001-02-02 03:23:09 +00001789#endif
Guido van Rossum48a680c2001-03-02 06:34:14 +00001790
Christian Heimes043d6f62008-01-07 17:19:16 +00001791#ifdef HAVE_LINUX_TIPC_H
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001792 case AF_TIPC:
1793 {
1794 *len_ret = sizeof (struct sockaddr_tipc);
1795 return 1;
1796 }
Christian Heimes043d6f62008-01-07 17:19:16 +00001797#endif
1798
Vinay Sajipecfc98c2014-03-20 12:42:42 +00001799#ifdef AF_CAN
Charles-François Natali47413c12011-10-06 19:47:44 +02001800 case AF_CAN:
1801 {
1802 *len_ret = sizeof (struct sockaddr_can);
1803 return 1;
1804 }
1805#endif
Victor Stinnera534fc42013-06-03 22:07:27 +02001806
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01001807#ifdef PF_SYSTEM
1808 case PF_SYSTEM:
1809 switch(s->sock_proto) {
1810#ifdef SYSPROTO_CONTROL
1811 case SYSPROTO_CONTROL:
1812 *len_ret = sizeof (struct sockaddr_ctl);
1813 return 1;
1814#endif
1815 default:
1816 PyErr_SetString(PyExc_OSError, "getsockaddrlen: "
1817 "unknown PF_SYSTEM protocol");
1818 return 0;
1819 }
1820#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02001821
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001822 /* More cases here... */
Guido van Rossum710e1df1992-06-12 10:39:36 +00001823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001824 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02001825 PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 return 0;
Guido van Rossum710e1df1992-06-12 10:39:36 +00001827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001828 }
Guido van Rossum710e1df1992-06-12 10:39:36 +00001829}
1830
1831
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001832/* Support functions for the sendmsg() and recvmsg[_into]() methods.
1833 Currently, these methods are only compiled if the RFC 2292/3542
1834 CMSG_LEN() macro is available. Older systems seem to have used
1835 sizeof(struct cmsghdr) + (length) where CMSG_LEN() is used now, so
1836 it may be possible to define CMSG_LEN() that way if it's not
1837 provided. Some architectures might need extra padding after the
1838 cmsghdr, however, and CMSG_LEN() would have to take account of
1839 this. */
1840#ifdef CMSG_LEN
1841/* If length is in range, set *result to CMSG_LEN(length) and return
1842 true; otherwise, return false. */
1843static int
1844get_CMSG_LEN(size_t length, size_t *result)
1845{
1846 size_t tmp;
1847
1848 if (length > (SOCKLEN_T_LIMIT - CMSG_LEN(0)))
1849 return 0;
1850 tmp = CMSG_LEN(length);
1851 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1852 return 0;
1853 *result = tmp;
1854 return 1;
1855}
1856
1857#ifdef CMSG_SPACE
1858/* If length is in range, set *result to CMSG_SPACE(length) and return
1859 true; otherwise, return false. */
1860static int
1861get_CMSG_SPACE(size_t length, size_t *result)
1862{
1863 size_t tmp;
1864
1865 /* Use CMSG_SPACE(1) here in order to take account of the padding
1866 necessary before *and* after the data. */
1867 if (length > (SOCKLEN_T_LIMIT - CMSG_SPACE(1)))
1868 return 0;
1869 tmp = CMSG_SPACE(length);
1870 if (tmp > SOCKLEN_T_LIMIT || tmp < length)
1871 return 0;
1872 *result = tmp;
1873 return 1;
1874}
1875#endif
1876
1877/* Return true iff msg->msg_controllen is valid, cmsgh is a valid
1878 pointer in msg->msg_control with at least "space" bytes after it,
1879 and its cmsg_len member inside the buffer. */
1880static int
1881cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space)
1882{
1883 size_t cmsg_offset;
1884 static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) +
1885 sizeof(cmsgh->cmsg_len));
1886
Charles-François Natali466517d2011-08-28 18:23:43 +02001887 /* Note that POSIX allows msg_controllen to be of signed type. */
Brett Cannonb05cbe62014-01-07 17:01:01 -05001888 if (cmsgh == NULL || msg->msg_control == NULL)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001889 return 0;
Brett Cannonb05cbe62014-01-07 17:01:01 -05001890 /* Note that POSIX allows msg_controllen to be of a signed type. This is
1891 annoying under OS X as it's unsigned there and so it triggers a
1892 tautological comparison warning under Clang when compared against 0.
1893 Since the check is valid on other platforms, silence the warning under
1894 Clang. */
1895 #ifdef __clang__
1896 #pragma clang diagnostic push
1897 #pragma clang diagnostic ignored "-Wtautological-compare"
1898 #endif
1899 if (msg->msg_controllen < 0)
1900 return 0;
1901 #ifdef __clang__
1902 #pragma clang diagnostic pop
1903 #endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001904 if (space < cmsg_len_end)
1905 space = cmsg_len_end;
1906 cmsg_offset = (char *)cmsgh - (char *)msg->msg_control;
1907 return (cmsg_offset <= (size_t)-1 - space &&
1908 cmsg_offset + space <= msg->msg_controllen);
1909}
1910
1911/* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set
1912 *space to number of bytes following it in the buffer and return
1913 true; otherwise, return false. Assumes cmsgh, msg->msg_control and
1914 msg->msg_controllen are valid. */
1915static int
1916get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space)
1917{
1918 size_t data_offset;
1919 char *data_ptr;
1920
1921 if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL)
1922 return 0;
1923 data_offset = data_ptr - (char *)msg->msg_control;
1924 if (data_offset > msg->msg_controllen)
1925 return 0;
1926 *space = msg->msg_controllen - data_offset;
1927 return 1;
1928}
1929
1930/* If cmsgh is invalid or not contained in the buffer pointed to by
1931 msg->msg_control, return -1. If cmsgh is valid and its associated
1932 data is entirely contained in the buffer, set *data_len to the
1933 length of the associated data and return 0. If only part of the
1934 associated data is contained in the buffer but cmsgh is otherwise
1935 valid, set *data_len to the length contained in the buffer and
1936 return 1. */
1937static int
1938get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len)
1939{
1940 size_t space, cmsg_data_len;
1941
1942 if (!cmsg_min_space(msg, cmsgh, CMSG_LEN(0)) ||
1943 cmsgh->cmsg_len < CMSG_LEN(0))
1944 return -1;
1945 cmsg_data_len = cmsgh->cmsg_len - CMSG_LEN(0);
1946 if (!get_cmsg_data_space(msg, cmsgh, &space))
1947 return -1;
1948 if (space >= cmsg_data_len) {
1949 *data_len = cmsg_data_len;
1950 return 0;
1951 }
1952 *data_len = space;
1953 return 1;
1954}
1955#endif /* CMSG_LEN */
1956
1957
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001958/* s._accept() -> (fd, address) */
Guido van Rossum30a685f1991-06-27 15:51:29 +00001959
Guido van Rossum73624e91994-10-10 17:59:00 +00001960static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00001961sock_accept(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00001962{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001963 sock_addr_t addrbuf;
1964 SOCKET_T newfd = INVALID_SOCKET;
1965 socklen_t addrlen;
1966 PyObject *sock = NULL;
1967 PyObject *addr = NULL;
1968 PyObject *res = NULL;
1969 int timeout;
Victor Stinnerdaf45552013-08-28 00:53:59 +02001970#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1971 /* accept4() is available on Linux 2.6.28+ and glibc 2.10 */
1972 static int accept4_works = -1;
1973#endif
1974
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001975 if (!getsockaddrlen(s, &addrlen))
1976 return NULL;
1977 memset(&addrbuf, 0, addrlen);
Guido van Rossum67f7a382002-06-06 21:08:16 +00001978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001979 if (!IS_SELECTABLE(s))
1980 return select_error();
Neal Norwitz082b2df2006-02-07 07:04:46 +00001981
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001982 BEGIN_SELECT_LOOP(s)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001984 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00001985 timeout = internal_select_ex(s, 0, interval);
Antoine Pitroub1c54962010-10-14 15:05:38 +00001986 if (!timeout) {
Victor Stinnerdaf45552013-08-28 00:53:59 +02001987#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
1988 if (accept4_works != 0) {
1989 newfd = accept4(s->sock_fd, SAS2SA(&addrbuf), &addrlen,
1990 SOCK_CLOEXEC);
1991 if (newfd == INVALID_SOCKET && accept4_works == -1) {
1992 /* On Linux older than 2.6.28, accept4() fails with ENOSYS */
1993 accept4_works = (errno != ENOSYS);
1994 }
1995 }
1996 if (accept4_works == 0)
1997 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
1998#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001999 newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
Victor Stinnerdaf45552013-08-28 00:53:59 +02002000#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00002001 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002002 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002003
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002004 if (timeout == 1) {
2005 PyErr_SetString(socket_timeout, "timed out");
2006 return NULL;
2007 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002008 END_SELECT_LOOP(s)
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 if (newfd == INVALID_SOCKET)
2011 return s->errorhandler();
Barry Warsaw752300b1997-01-03 17:18:10 +00002012
Victor Stinnerdaf45552013-08-28 00:53:59 +02002013#ifdef MS_WINDOWS
2014 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
2015 PyErr_SetFromWindowsErr(0);
2016 SOCKETCLOSE(newfd);
2017 goto finally;
2018 }
2019#else
2020
2021#if defined(HAVE_ACCEPT4) && defined(SOCK_CLOEXEC)
2022 if (!accept4_works)
2023#endif
2024 {
2025 if (_Py_set_inheritable(newfd, 0, NULL) < 0) {
2026 SOCKETCLOSE(newfd);
2027 goto finally;
2028 }
2029 }
2030#endif
2031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002032 sock = PyLong_FromSocket_t(newfd);
2033 if (sock == NULL) {
2034 SOCKETCLOSE(newfd);
2035 goto finally;
2036 }
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002038 addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2039 addrlen, s->sock_proto);
2040 if (addr == NULL)
2041 goto finally;
Barry Warsaw752300b1997-01-03 17:18:10 +00002042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002043 res = PyTuple_Pack(2, sock, addr);
Barry Warsaw752300b1997-01-03 17:18:10 +00002044
Guido van Rossum67f7a382002-06-06 21:08:16 +00002045finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002046 Py_XDECREF(sock);
2047 Py_XDECREF(addr);
2048 return res;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002049}
2050
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002051PyDoc_STRVAR(accept_doc,
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002052"_accept() -> (integer, address info)\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002053\n\
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002054Wait for an incoming connection. Return a new socket file descriptor\n\
2055representing the connection, and the address of the client.\n\
2056For IP sockets, the address info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002057
Guido van Rossum11ba0942002-06-13 15:07:44 +00002058/* s.setblocking(flag) method. Argument:
2059 False -- non-blocking mode; same as settimeout(0)
2060 True -- blocking mode; same as settimeout(None)
2061*/
Guido van Rossume4485b01994-09-07 14:32:49 +00002062
Guido van Rossum73624e91994-10-10 17:59:00 +00002063static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002064sock_setblocking(PySocketSockObject *s, PyObject *arg)
Guido van Rossume4485b01994-09-07 14:32:49 +00002065{
Serhiy Storchaka78980432013-01-15 01:12:17 +02002066 long block;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002068 block = PyLong_AsLong(arg);
2069 if (block == -1 && PyErr_Occurred())
2070 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002072 s->sock_timeout = block ? -1.0 : 0.0;
2073 internal_setblocking(s, block);
Guido van Rossume4485b01994-09-07 14:32:49 +00002074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002075 Py_INCREF(Py_None);
2076 return Py_None;
Guido van Rossume4485b01994-09-07 14:32:49 +00002077}
Guido van Rossume4485b01994-09-07 14:32:49 +00002078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002079PyDoc_STRVAR(setblocking_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002080"setblocking(flag)\n\
2081\n\
2082Set the socket to blocking (flag is true) or non-blocking (false).\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002083setblocking(True) is equivalent to settimeout(None);\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002084setblocking(False) is equivalent to settimeout(0.0).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002085
Guido van Rossum11ba0942002-06-13 15:07:44 +00002086/* s.settimeout(timeout) method. Argument:
2087 None -- no timeout, blocking mode; same as setblocking(True)
2088 0.0 -- non-blocking mode; same as setblocking(False)
2089 > 0 -- timeout mode; operations time out after timeout seconds
2090 < 0 -- illegal; raises an exception
2091*/
Guido van Rossum67f7a382002-06-06 21:08:16 +00002092static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002093sock_settimeout(PySocketSockObject *s, PyObject *arg)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002094{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002095 double timeout;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002096
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002097 if (arg == Py_None)
2098 timeout = -1.0;
2099 else {
2100 timeout = PyFloat_AsDouble(arg);
2101 if (timeout < 0.0) {
2102 if (!PyErr_Occurred())
2103 PyErr_SetString(PyExc_ValueError,
2104 "Timeout value out of range");
2105 return NULL;
2106 }
2107 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002109 s->sock_timeout = timeout;
2110 internal_setblocking(s, timeout < 0.0);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002112 Py_INCREF(Py_None);
2113 return Py_None;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002114}
2115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002116PyDoc_STRVAR(settimeout_doc,
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002117"settimeout(timeout)\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002118\n\
Guido van Rossum11ba0942002-06-13 15:07:44 +00002119Set a timeout on socket operations. 'timeout' can be a float,\n\
2120giving in seconds, or None. Setting a timeout of None disables\n\
2121the timeout feature and is equivalent to setblocking(1).\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002122Setting a timeout of zero is the same as setblocking(0).");
Guido van Rossum67f7a382002-06-06 21:08:16 +00002123
Guido van Rossum3eede5a2002-06-07 02:08:35 +00002124/* s.gettimeout() method.
2125 Returns the timeout associated with a socket. */
Guido van Rossum67f7a382002-06-06 21:08:16 +00002126static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002127sock_gettimeout(PySocketSockObject *s)
Guido van Rossum67f7a382002-06-06 21:08:16 +00002128{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002129 if (s->sock_timeout < 0.0) {
2130 Py_INCREF(Py_None);
2131 return Py_None;
2132 }
2133 else
2134 return PyFloat_FromDouble(s->sock_timeout);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002135}
2136
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002137PyDoc_STRVAR(gettimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002138"gettimeout() -> timeout\n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002139\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03002140Returns the timeout in seconds (float) associated with socket \n\
Guido van Rossum67f7a382002-06-06 21:08:16 +00002141operations. A timeout of None indicates that timeouts on socket \n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002142operations are disabled.");
Guido van Rossume4485b01994-09-07 14:32:49 +00002143
Guido van Rossumaee08791992-09-08 09:05:33 +00002144/* s.setsockopt() method.
2145 With an integer third argument, sets an integer option.
2146 With a string third argument, sets an option from a buffer;
2147 use optional built-in module 'struct' to encode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002148
Guido van Rossum73624e91994-10-10 17:59:00 +00002149static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002150sock_setsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002151{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002152 int level;
2153 int optname;
2154 int res;
2155 char *buf;
2156 int buflen;
2157 int flag;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002159 if (PyArg_ParseTuple(args, "iii:setsockopt",
2160 &level, &optname, &flag)) {
2161 buf = (char *) &flag;
2162 buflen = sizeof flag;
2163 }
2164 else {
2165 PyErr_Clear();
2166 if (!PyArg_ParseTuple(args, "iiy#:setsockopt",
2167 &level, &optname, &buf, &buflen))
2168 return NULL;
2169 }
2170 res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);
2171 if (res < 0)
2172 return s->errorhandler();
2173 Py_INCREF(Py_None);
2174 return Py_None;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002175}
2176
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002177PyDoc_STRVAR(setsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002178"setsockopt(level, option, value)\n\
2179\n\
2180Set a socket option. See the Unix manual for level and option.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002181The value argument can either be an integer or a string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002182
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002183
Guido van Rossumaee08791992-09-08 09:05:33 +00002184/* s.getsockopt() method.
2185 With two arguments, retrieves an integer option.
2186 With a third integer argument, retrieves a string buffer of that size;
2187 use optional built-in module 'struct' to decode the string. */
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002188
Guido van Rossum73624e91994-10-10 17:59:00 +00002189static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002190sock_getsockopt(PySocketSockObject *s, PyObject *args)
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002191{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 int level;
2193 int optname;
2194 int res;
2195 PyObject *buf;
2196 socklen_t buflen = 0;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002198 if (!PyArg_ParseTuple(args, "ii|i:getsockopt",
2199 &level, &optname, &buflen))
2200 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002202 if (buflen == 0) {
2203 int flag = 0;
2204 socklen_t flagsize = sizeof flag;
2205 res = getsockopt(s->sock_fd, level, optname,
2206 (void *)&flag, &flagsize);
2207 if (res < 0)
2208 return s->errorhandler();
2209 return PyLong_FromLong(flag);
2210 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002211 if (buflen <= 0 || buflen > 1024) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02002212 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002213 "getsockopt buflen out of range");
2214 return NULL;
2215 }
2216 buf = PyBytes_FromStringAndSize((char *)NULL, buflen);
2217 if (buf == NULL)
2218 return NULL;
2219 res = getsockopt(s->sock_fd, level, optname,
2220 (void *)PyBytes_AS_STRING(buf), &buflen);
2221 if (res < 0) {
2222 Py_DECREF(buf);
2223 return s->errorhandler();
2224 }
2225 _PyBytes_Resize(&buf, buflen);
2226 return buf;
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002227}
2228
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002229PyDoc_STRVAR(getsockopt_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002230"getsockopt(level, option[, buffersize]) -> value\n\
2231\n\
2232Get a socket option. See the Unix manual for level and option.\n\
2233If a nonzero buffersize argument is given, the return value is a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002234string of that length; otherwise it is an integer.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002235
Guido van Rossum0e69587d1992-06-05 15:11:30 +00002236
Fred Drake728819a2000-07-01 03:40:12 +00002237/* s.bind(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002238
Guido van Rossum73624e91994-10-10 17:59:00 +00002239static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002240sock_bind(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002242 sock_addr_t addrbuf;
2243 int addrlen;
2244 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002246 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2247 return NULL;
2248 Py_BEGIN_ALLOW_THREADS
2249 res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);
2250 Py_END_ALLOW_THREADS
2251 if (res < 0)
2252 return s->errorhandler();
2253 Py_INCREF(Py_None);
2254 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002255}
2256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002257PyDoc_STRVAR(bind_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002258"bind(address)\n\
2259\n\
2260Bind the socket to a local address. For IP sockets, the address is a\n\
Jeremy Hylton22308652001-02-02 03:23:09 +00002261pair (host, port); the host must refer to the local host. For raw packet\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002262sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002263
Guido van Rossum30a685f1991-06-27 15:51:29 +00002264
2265/* s.close() method.
2266 Set the file descriptor to -1 so operations tried subsequently
2267 will surely fail. */
2268
Guido van Rossum73624e91994-10-10 17:59:00 +00002269static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002270sock_close(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002271{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002272 SOCKET_T fd;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002274 if ((fd = s->sock_fd) != -1) {
2275 s->sock_fd = -1;
2276 Py_BEGIN_ALLOW_THREADS
2277 (void) SOCKETCLOSE(fd);
2278 Py_END_ALLOW_THREADS
2279 }
2280 Py_INCREF(Py_None);
2281 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002282}
2283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002284PyDoc_STRVAR(close_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002285"close()\n\
2286\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002287Close the socket. It cannot be used after this call.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002288
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002289static PyObject *
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002290sock_detach(PySocketSockObject *s)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002291{
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002292 SOCKET_T fd = s->sock_fd;
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002293 s->sock_fd = -1;
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002294 return PyLong_FromSocket_t(fd);
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002295}
2296
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002297PyDoc_STRVAR(detach_doc,
2298"detach()\n\
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002299\n\
Guido van Rossum638aebd2013-12-04 11:50:09 -08002300Close the socket object without closing the underlying file descriptor.\n\
2301The object cannot be used after this call, but the file descriptor\n\
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002302can be reused for other purposes. The file descriptor is returned.");
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002303
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002304static int
Raymond Hettingeref7343c2003-06-29 03:08:05 +00002305internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002306 int *timeoutp)
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002308 int res, timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002310 timeout = 0;
2311 res = connect(s->sock_fd, addr, addrlen);
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002312
2313#ifdef MS_WINDOWS
2314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002315 if (s->sock_timeout > 0.0) {
2316 if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&
2317 IS_SELECTABLE(s)) {
2318 /* This is a mess. Best solution: trust select */
2319 fd_set fds;
2320 fd_set fds_exc;
2321 struct timeval tv;
2322 tv.tv_sec = (int)s->sock_timeout;
2323 tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
2324 FD_ZERO(&fds);
2325 FD_SET(s->sock_fd, &fds);
2326 FD_ZERO(&fds_exc);
2327 FD_SET(s->sock_fd, &fds_exc);
Antoine Pitrou19467d22010-08-17 19:33:30 +00002328 res = select(Py_SAFE_DOWNCAST(s->sock_fd+1, SOCKET_T, int),
2329 NULL, &fds, &fds_exc, &tv);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002330 if (res == 0) {
2331 res = WSAEWOULDBLOCK;
2332 timeout = 1;
2333 } else if (res > 0) {
2334 if (FD_ISSET(s->sock_fd, &fds))
2335 /* The socket is in the writable set - this
2336 means connected */
2337 res = 0;
2338 else {
2339 /* As per MS docs, we need to call getsockopt()
2340 to get the underlying error */
2341 int res_size = sizeof res;
2342 /* It must be in the exception set */
2343 assert(FD_ISSET(s->sock_fd, &fds_exc));
2344 if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,
2345 (char *)&res, &res_size))
2346 /* getsockopt also clears WSAGetLastError,
2347 so reset it back. */
2348 WSASetLastError(res);
2349 else
2350 res = WSAGetLastError();
2351 }
2352 }
2353 /* else if (res < 0) an error occurred */
2354 }
2355 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002356
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002357 if (res < 0)
2358 res = WSAGetLastError();
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002359
2360#else
2361
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002362 if (s->sock_timeout > 0.0) {
2363 if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {
2364 timeout = internal_select(s, 1);
2365 if (timeout == 0) {
2366 /* Bug #1019808: in case of an EINPROGRESS,
2367 use getsockopt(SO_ERROR) to get the real
2368 error. */
2369 socklen_t res_size = sizeof res;
2370 (void)getsockopt(s->sock_fd, SOL_SOCKET,
2371 SO_ERROR, &res, &res_size);
2372 if (res == EISCONN)
2373 res = 0;
2374 errno = res;
2375 }
2376 else if (timeout == -1) {
2377 res = errno; /* had error */
2378 }
2379 else
2380 res = EWOULDBLOCK; /* timed out */
2381 }
2382 }
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002383
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002384 if (res < 0)
2385 res = errno;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002386
2387#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002388 *timeoutp = timeout;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 return res;
Guido van Rossum7b8bac12002-06-13 16:07:04 +00002391}
Guido van Rossum30a685f1991-06-27 15:51:29 +00002392
Fred Drake728819a2000-07-01 03:40:12 +00002393/* s.connect(sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002394
Guido van Rossum73624e91994-10-10 17:59:00 +00002395static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002396sock_connect(PySocketSockObject *s, PyObject *addro)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002397{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002398 sock_addr_t addrbuf;
2399 int addrlen;
2400 int res;
2401 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002402
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002403 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2404 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 Py_BEGIN_ALLOW_THREADS
2407 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2408 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 if (timeout == 1) {
2411 PyErr_SetString(socket_timeout, "timed out");
2412 return NULL;
2413 }
2414 if (res != 0)
2415 return s->errorhandler();
2416 Py_INCREF(Py_None);
2417 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002418}
2419
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002420PyDoc_STRVAR(connect_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002421"connect(address)\n\
2422\n\
2423Connect the socket to a remote address. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002424is a pair (host, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002425
Guido van Rossum30a685f1991-06-27 15:51:29 +00002426
Fred Drake728819a2000-07-01 03:40:12 +00002427/* s.connect_ex(sockaddr) method */
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002428
2429static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002430sock_connect_ex(PySocketSockObject *s, PyObject *addro)
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002431{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002432 sock_addr_t addrbuf;
2433 int addrlen;
2434 int res;
2435 int timeout;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002436
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002437 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))
2438 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002440 Py_BEGIN_ALLOW_THREADS
2441 res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);
2442 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002443
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002444 /* Signals are not errors (though they may raise exceptions). Adapted
2445 from PyErr_SetFromErrnoWithFilenameObject(). */
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002446#ifdef EINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002447 if (res == EINTR && PyErr_CheckSignals())
2448 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002449#endif
2450
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002451 return PyLong_FromLong((long) res);
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002452}
2453
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002454PyDoc_STRVAR(connect_ex_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00002455"connect_ex(address) -> errno\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00002456\n\
2457This is like connect(address), but returns an error code (the errno value)\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002458instead of raising an exception when an error occurs.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002459
Guido van Rossumfc4255d1997-11-19 18:57:13 +00002460
Guido van Rossumed233a51992-06-23 09:07:03 +00002461/* s.fileno() method */
2462
Guido van Rossum73624e91994-10-10 17:59:00 +00002463static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002464sock_fileno(PySocketSockObject *s)
Guido van Rossumed233a51992-06-23 09:07:03 +00002465{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002466 return PyLong_FromSocket_t(s->sock_fd);
Guido van Rossumed233a51992-06-23 09:07:03 +00002467}
2468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002469PyDoc_STRVAR(fileno_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002470"fileno() -> integer\n\
2471\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002472Return the integer file descriptor of the socket.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002473
Guido van Rossumed233a51992-06-23 09:07:03 +00002474
Guido van Rossumc89705d1992-11-26 08:54:07 +00002475/* s.getsockname() method */
2476
Guido van Rossum73624e91994-10-10 17:59:00 +00002477static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002478sock_getsockname(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002479{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002480 sock_addr_t addrbuf;
2481 int res;
2482 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002484 if (!getsockaddrlen(s, &addrlen))
2485 return NULL;
2486 memset(&addrbuf, 0, addrlen);
2487 Py_BEGIN_ALLOW_THREADS
2488 res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2489 Py_END_ALLOW_THREADS
2490 if (res < 0)
2491 return s->errorhandler();
2492 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2493 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002494}
2495
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002496PyDoc_STRVAR(getsockname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002497"getsockname() -> address info\n\
2498\n\
2499Return the address of the local endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002500info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002501
Guido van Rossumc89705d1992-11-26 08:54:07 +00002502
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503#ifdef HAVE_GETPEERNAME /* Cray APP doesn't have this :-( */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002504/* s.getpeername() method */
2505
Guido van Rossum73624e91994-10-10 17:59:00 +00002506static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002507sock_getpeername(PySocketSockObject *s)
Guido van Rossumc89705d1992-11-26 08:54:07 +00002508{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002509 sock_addr_t addrbuf;
2510 int res;
2511 socklen_t addrlen;
Guido van Rossumff3ab422000-04-24 15:16:03 +00002512
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002513 if (!getsockaddrlen(s, &addrlen))
2514 return NULL;
2515 memset(&addrbuf, 0, addrlen);
2516 Py_BEGIN_ALLOW_THREADS
2517 res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);
2518 Py_END_ALLOW_THREADS
2519 if (res < 0)
2520 return s->errorhandler();
2521 return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,
2522 s->sock_proto);
Guido van Rossumc89705d1992-11-26 08:54:07 +00002523}
Guido van Rossum82a5c661998-07-07 20:45:43 +00002524
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002525PyDoc_STRVAR(getpeername_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002526"getpeername() -> address info\n\
2527\n\
2528Return the address of the remote endpoint. For IP sockets, the address\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002529info is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002530
Guido van Rossumb6775db1994-08-01 11:34:53 +00002531#endif /* HAVE_GETPEERNAME */
Guido van Rossumc89705d1992-11-26 08:54:07 +00002532
2533
Guido van Rossum30a685f1991-06-27 15:51:29 +00002534/* s.listen(n) method */
2535
Guido van Rossum73624e91994-10-10 17:59:00 +00002536static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002537sock_listen(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 int backlog;
2540 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00002541
Serhiy Storchaka78980432013-01-15 01:12:17 +02002542 backlog = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002543 if (backlog == -1 && PyErr_Occurred())
2544 return NULL;
2545 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002546 /* To avoid problems on systems that don't allow a negative backlog
2547 * (which doesn't make sense anyway) we force a minimum value of 0. */
2548 if (backlog < 0)
2549 backlog = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 res = listen(s->sock_fd, backlog);
2551 Py_END_ALLOW_THREADS
2552 if (res < 0)
2553 return s->errorhandler();
2554 Py_INCREF(Py_None);
2555 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002556}
2557
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002558PyDoc_STRVAR(listen_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002559"listen(backlog)\n\
2560\n\
2561Enable a server to accept connections. The backlog argument must be at\n\
Antoine Pitrou1be815a2011-05-10 19:16:29 +02002562least 0 (if it is lower, it is set to 0); it specifies the number of\n\
2563unaccepted connections that the system will allow before refusing new\n\
2564connections.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002565
2566
Thomas Wouters477c8d52006-05-27 19:21:47 +00002567/*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002568 * This is the guts of the recv() and recv_into() methods, which reads into a
Thomas Wouters902d6eb2007-01-09 23:18:33 +00002569 * char buffer. If you have any inc/dec ref to do to the objects that contain
Thomas Wouters477c8d52006-05-27 19:21:47 +00002570 * the buffer, do it in the caller. This function returns the number of bytes
Ezio Melotti13925002011-03-16 11:05:33 +02002571 * successfully read. If there was an error, it returns -1. Note that it is
Thomas Wouters477c8d52006-05-27 19:21:47 +00002572 * also possible that we return a number of bytes smaller than the request
2573 * bytes.
2574 */
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002575
Antoine Pitrou19467d22010-08-17 19:33:30 +00002576static Py_ssize_t
2577sock_recv_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002578{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002579 Py_ssize_t outlen = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002580 int timeout;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002581
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002582 if (!IS_SELECTABLE(s)) {
2583 select_error();
2584 return -1;
2585 }
2586 if (len == 0) {
2587 /* If 0 bytes were requested, do nothing. */
2588 return 0;
2589 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002590
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002591 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002592 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002593 timeout = internal_select_ex(s, 0, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02002594 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02002595#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002596 if (len > INT_MAX)
2597 len = INT_MAX;
2598 outlen = recv(s->sock_fd, cbuf, (int)len, flags);
2599#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002600 outlen = recv(s->sock_fd, cbuf, len, flags);
Victor Stinner9a644b22013-06-24 23:47:41 +02002601#endif
2602 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002603 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002605 if (timeout == 1) {
2606 PyErr_SetString(socket_timeout, "timed out");
2607 return -1;
2608 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002609 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002610 if (outlen < 0) {
2611 /* Note: the call to errorhandler() ALWAYS indirectly returned
2612 NULL, so ignore its return value */
2613 s->errorhandler();
2614 return -1;
2615 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002616 return outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002617}
2618
Guido van Rossum48a680c2001-03-02 06:34:14 +00002619
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00002620/* s.recv(nbytes [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002621
Guido van Rossum73624e91994-10-10 17:59:00 +00002622static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00002623sock_recv(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00002624{
Antoine Pitrou19467d22010-08-17 19:33:30 +00002625 Py_ssize_t recvlen, outlen;
2626 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002627 PyObject *buf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002628
Antoine Pitrou19467d22010-08-17 19:33:30 +00002629 if (!PyArg_ParseTuple(args, "n|i:recv", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002630 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002631
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002632 if (recvlen < 0) {
2633 PyErr_SetString(PyExc_ValueError,
2634 "negative buffersize in recv");
2635 return NULL;
2636 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002638 /* Allocate a new string. */
2639 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2640 if (buf == NULL)
2641 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002643 /* Call the guts */
2644 outlen = sock_recv_guts(s, PyBytes_AS_STRING(buf), recvlen, flags);
2645 if (outlen < 0) {
2646 /* An error occurred, release the string and return an
2647 error. */
2648 Py_DECREF(buf);
2649 return NULL;
2650 }
2651 if (outlen != recvlen) {
2652 /* We did not read as many bytes as we anticipated, resize the
2653 string if possible and be successful. */
2654 _PyBytes_Resize(&buf, outlen);
2655 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00002656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002657 return buf;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002658}
2659
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002660PyDoc_STRVAR(recv_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002661"recv(buffersize[, flags]) -> data\n\
2662\n\
2663Receive up to buffersize bytes from the socket. For the optional flags\n\
2664argument, see the Unix manual. When no data is available, block until\n\
2665at least one byte is available or until the remote end is closed. When\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002666the remote end is closed and all data is read, return the empty string.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002667
Guido van Rossum30a685f1991-06-27 15:51:29 +00002668
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002669/* s.recv_into(buffer, [nbytes [,flags]]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00002670
Thomas Wouters477c8d52006-05-27 19:21:47 +00002671static PyObject*
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002672sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002673{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002674 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002675
Antoine Pitrou19467d22010-08-17 19:33:30 +00002676 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002677 Py_buffer pbuf;
2678 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002679 Py_ssize_t buflen, readlen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002680
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002681 /* Get the buffer's memory */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002682 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recv_into", kwlist,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002683 &pbuf, &recvlen, &flags))
2684 return NULL;
2685 buf = pbuf.buf;
2686 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002687
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002688 if (recvlen < 0) {
2689 PyBuffer_Release(&pbuf);
2690 PyErr_SetString(PyExc_ValueError,
2691 "negative buffersize in recv_into");
2692 return NULL;
2693 }
2694 if (recvlen == 0) {
2695 /* If nbytes was not specified, use the buffer's length */
2696 recvlen = buflen;
2697 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002699 /* Check if the buffer is large enough */
2700 if (buflen < recvlen) {
2701 PyBuffer_Release(&pbuf);
2702 PyErr_SetString(PyExc_ValueError,
2703 "buffer too small for requested bytes");
2704 return NULL;
2705 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002707 /* Call the guts */
2708 readlen = sock_recv_guts(s, buf, recvlen, flags);
2709 if (readlen < 0) {
2710 /* Return an error. */
2711 PyBuffer_Release(&pbuf);
2712 return NULL;
2713 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002714
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 PyBuffer_Release(&pbuf);
2716 /* Return the number of bytes read. Note that we do not do anything
2717 special here in the case that readlen < recvlen. */
2718 return PyLong_FromSsize_t(readlen);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002719}
2720
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002721PyDoc_STRVAR(recv_into_doc,
2722"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002723\n\
2724A version of recv() that stores its data into a buffer rather than creating \n\
2725a new string. Receive up to buffersize bytes from the socket. If buffersize \n\
2726is not specified (or 0), receive up to the size available in the given buffer.\n\
2727\n\
2728See recv() for documentation about the flags.");
2729
2730
2731/*
Christian Heimes99170a52007-12-19 02:07:34 +00002732 * This is the guts of the recvfrom() and recvfrom_into() methods, which reads
2733 * into a char buffer. If you have any inc/def ref to do to the objects that
2734 * contain the buffer, do it in the caller. This function returns the number
Ezio Melotti13925002011-03-16 11:05:33 +02002735 * of bytes successfully read. If there was an error, it returns -1. Note
Christian Heimes99170a52007-12-19 02:07:34 +00002736 * that it is also possible that we return a number of bytes smaller than the
2737 * request bytes.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002738 *
2739 * 'addr' is a return value for the address object. Note that you must decref
2740 * it yourself.
2741 */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002742static Py_ssize_t
2743sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, Py_ssize_t len, int flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002744 PyObject** addr)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002746 sock_addr_t addrbuf;
2747 int timeout;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002748 Py_ssize_t n = -1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002749 socklen_t addrlen;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002751 *addr = NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002753 if (!getsockaddrlen(s, &addrlen))
2754 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00002755
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002756 if (!IS_SELECTABLE(s)) {
2757 select_error();
2758 return -1;
2759 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00002760
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002761 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002762 Py_BEGIN_ALLOW_THREADS
2763 memset(&addrbuf, 0, addrlen);
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002764 timeout = internal_select_ex(s, 0, interval);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002765 if (!timeout) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01002766#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02002767 if (len > INT_MAX)
2768 len = INT_MAX;
2769 n = recvfrom(s->sock_fd, cbuf, (int)len, flags,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002770 (void *) &addrbuf, &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002771#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002772 n = recvfrom(s->sock_fd, cbuf, len, flags,
2773 SAS2SA(&addrbuf), &addrlen);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002774#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002775 }
2776 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00002777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002778 if (timeout == 1) {
2779 PyErr_SetString(socket_timeout, "timed out");
2780 return -1;
2781 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00002782 END_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002783 if (n < 0) {
2784 s->errorhandler();
2785 return -1;
2786 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00002787
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002788 if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
2789 addrlen, s->sock_proto)))
2790 return -1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 return n;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002793}
2794
2795/* s.recvfrom(nbytes [,flags]) method */
2796
2797static PyObject *
2798sock_recvfrom(PySocketSockObject *s, PyObject *args)
2799{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002800 PyObject *buf = NULL;
2801 PyObject *addr = NULL;
2802 PyObject *ret = NULL;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002803 int flags = 0;
2804 Py_ssize_t recvlen, outlen;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002805
Antoine Pitrou19467d22010-08-17 19:33:30 +00002806 if (!PyArg_ParseTuple(args, "n|i:recvfrom", &recvlen, &flags))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002807 return NULL;
Guido van Rossum48a680c2001-03-02 06:34:14 +00002808
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002809 if (recvlen < 0) {
2810 PyErr_SetString(PyExc_ValueError,
2811 "negative buffersize in recvfrom");
2812 return NULL;
2813 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00002814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002815 buf = PyBytes_FromStringAndSize((char *) 0, recvlen);
2816 if (buf == NULL)
2817 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002818
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 outlen = sock_recvfrom_guts(s, PyBytes_AS_STRING(buf),
2820 recvlen, flags, &addr);
2821 if (outlen < 0) {
2822 goto finally;
2823 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002825 if (outlen != recvlen) {
2826 /* We did not read as many bytes as we anticipated, resize the
Ezio Melotti13925002011-03-16 11:05:33 +02002827 string if possible and be successful. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002828 if (_PyBytes_Resize(&buf, outlen) < 0)
Ezio Melotti13925002011-03-16 11:05:33 +02002829 /* Oopsy, not so successful after all. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 goto finally;
2831 }
Barry Warsaw752300b1997-01-03 17:18:10 +00002832
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002833 ret = PyTuple_Pack(2, buf, addr);
Guido van Rossum67f7a382002-06-06 21:08:16 +00002834
2835finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002836 Py_XDECREF(buf);
2837 Py_XDECREF(addr);
2838 return ret;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00002839}
2840
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002841PyDoc_STRVAR(recvfrom_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00002842"recvfrom(buffersize[, flags]) -> (data, address info)\n\
2843\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002844Like recv(buffersize, flags) but also return the sender's address info.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00002845
Thomas Wouters477c8d52006-05-27 19:21:47 +00002846
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002847/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848
2849static PyObject *
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002850sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)
Thomas Wouters477c8d52006-05-27 19:21:47 +00002851{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002852 static char *kwlist[] = {"buffer", "nbytes", "flags", 0};
Thomas Wouters477c8d52006-05-27 19:21:47 +00002853
Antoine Pitrou19467d22010-08-17 19:33:30 +00002854 int flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002855 Py_buffer pbuf;
2856 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00002857 Py_ssize_t readlen, buflen, recvlen = 0;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002859 PyObject *addr = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002860
Antoine Pitrou19467d22010-08-17 19:33:30 +00002861 if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ni:recvfrom_into",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002862 kwlist, &pbuf,
2863 &recvlen, &flags))
2864 return NULL;
2865 buf = pbuf.buf;
2866 buflen = pbuf.len;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002868 if (recvlen < 0) {
2869 PyBuffer_Release(&pbuf);
2870 PyErr_SetString(PyExc_ValueError,
2871 "negative buffersize in recvfrom_into");
2872 return NULL;
2873 }
2874 if (recvlen == 0) {
2875 /* If nbytes was not specified, use the buffer's length */
2876 recvlen = buflen;
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05002877 } else if (recvlen > buflen) {
2878 PyBuffer_Release(&pbuf);
2879 PyErr_SetString(PyExc_ValueError,
2880 "nbytes is greater than the length of the buffer");
2881 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002882 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002883
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002884 readlen = sock_recvfrom_guts(s, buf, recvlen, flags, &addr);
2885 if (readlen < 0) {
2886 PyBuffer_Release(&pbuf);
2887 /* Return an error */
2888 Py_XDECREF(addr);
2889 return NULL;
2890 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00002891
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002892 PyBuffer_Release(&pbuf);
2893 /* Return the number of bytes read and the address. Note that we do
2894 not do anything special here in the case that readlen < recvlen. */
Antoine Pitrou19467d22010-08-17 19:33:30 +00002895 return Py_BuildValue("nN", readlen, addr);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002896}
2897
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002898PyDoc_STRVAR(recvfrom_into_doc,
2899"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\
Thomas Wouters477c8d52006-05-27 19:21:47 +00002900\n\
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00002901Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");
Thomas Wouters477c8d52006-05-27 19:21:47 +00002902
2903
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002904/* The sendmsg() and recvmsg[_into]() methods require a working
2905 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
2906#ifdef CMSG_LEN
2907/*
2908 * Call recvmsg() with the supplied iovec structures, flags, and
2909 * ancillary data buffer size (controllen). Returns the tuple return
2910 * value for recvmsg() or recvmsg_into(), with the first item provided
2911 * by the supplied makeval() function. makeval() will be called with
2912 * the length read and makeval_data as arguments, and must return a
2913 * new reference (which will be decrefed if there is a subsequent
2914 * error). On error, closes any file descriptors received via
2915 * SCM_RIGHTS.
2916 */
2917static PyObject *
2918sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen,
2919 int flags, Py_ssize_t controllen,
2920 PyObject *(*makeval)(ssize_t, void *), void *makeval_data)
2921{
2922 ssize_t bytes_received = -1;
2923 int timeout;
2924 sock_addr_t addrbuf;
2925 socklen_t addrbuflen;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02002926 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002927 PyObject *cmsg_list = NULL, *retval = NULL;
2928 void *controlbuf = NULL;
2929 struct cmsghdr *cmsgh;
2930 size_t cmsgdatalen = 0;
2931 int cmsg_status;
2932
2933 /* XXX: POSIX says that msg_name and msg_namelen "shall be
2934 ignored" when the socket is connected (Linux fills them in
2935 anyway for AF_UNIX sockets at least). Normally msg_namelen
2936 seems to be set to 0 if there's no address, but try to
2937 initialize msg_name to something that won't be mistaken for a
2938 real address if that doesn't happen. */
2939 if (!getsockaddrlen(s, &addrbuflen))
2940 return NULL;
2941 memset(&addrbuf, 0, addrbuflen);
2942 SAS2SA(&addrbuf)->sa_family = AF_UNSPEC;
2943
2944 if (controllen < 0 || controllen > SOCKLEN_T_LIMIT) {
2945 PyErr_SetString(PyExc_ValueError,
2946 "invalid ancillary data buffer length");
2947 return NULL;
2948 }
2949 if (controllen > 0 && (controlbuf = PyMem_Malloc(controllen)) == NULL)
2950 return PyErr_NoMemory();
2951
2952 /* Make the system call. */
2953 if (!IS_SELECTABLE(s)) {
2954 select_error();
2955 goto finally;
2956 }
2957
2958 BEGIN_SELECT_LOOP(s)
2959 Py_BEGIN_ALLOW_THREADS;
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002960 msg.msg_name = SAS2SA(&addrbuf);
2961 msg.msg_namelen = addrbuflen;
2962 msg.msg_iov = iov;
2963 msg.msg_iovlen = iovlen;
2964 msg.msg_control = controlbuf;
2965 msg.msg_controllen = controllen;
2966 timeout = internal_select_ex(s, 0, interval);
2967 if (!timeout)
2968 bytes_received = recvmsg(s->sock_fd, &msg, flags);
2969 Py_END_ALLOW_THREADS;
2970 if (timeout == 1) {
2971 PyErr_SetString(socket_timeout, "timed out");
2972 goto finally;
2973 }
2974 END_SELECT_LOOP(s)
2975
2976 if (bytes_received < 0) {
2977 s->errorhandler();
2978 goto finally;
2979 }
2980
2981 /* Make list of (level, type, data) tuples from control messages. */
2982 if ((cmsg_list = PyList_New(0)) == NULL)
2983 goto err_closefds;
2984 /* Check for empty ancillary data as old CMSG_FIRSTHDR()
2985 implementations didn't do so. */
2986 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
2987 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
2988 PyObject *bytes, *tuple;
2989 int tmp;
2990
2991 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
2992 if (cmsg_status != 0) {
2993 if (PyErr_WarnEx(PyExc_RuntimeWarning,
2994 "received malformed or improperly-truncated "
2995 "ancillary data", 1) == -1)
2996 goto err_closefds;
2997 }
2998 if (cmsg_status < 0)
2999 break;
3000 if (cmsgdatalen > PY_SSIZE_T_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003001 PyErr_SetString(PyExc_OSError, "control message too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003002 goto err_closefds;
3003 }
3004
3005 bytes = PyBytes_FromStringAndSize((char *)CMSG_DATA(cmsgh),
3006 cmsgdatalen);
3007 tuple = Py_BuildValue("iiN", (int)cmsgh->cmsg_level,
3008 (int)cmsgh->cmsg_type, bytes);
3009 if (tuple == NULL)
3010 goto err_closefds;
3011 tmp = PyList_Append(cmsg_list, tuple);
3012 Py_DECREF(tuple);
3013 if (tmp != 0)
3014 goto err_closefds;
3015
3016 if (cmsg_status != 0)
3017 break;
3018 }
3019
3020 retval = Py_BuildValue("NOiN",
3021 (*makeval)(bytes_received, makeval_data),
3022 cmsg_list,
3023 (int)msg.msg_flags,
3024 makesockaddr(s->sock_fd, SAS2SA(&addrbuf),
3025 ((msg.msg_namelen > addrbuflen) ?
3026 addrbuflen : msg.msg_namelen),
3027 s->sock_proto));
3028 if (retval == NULL)
3029 goto err_closefds;
3030
3031finally:
3032 Py_XDECREF(cmsg_list);
3033 PyMem_Free(controlbuf);
3034 return retval;
3035
3036err_closefds:
3037#ifdef SCM_RIGHTS
3038 /* Close all descriptors coming from SCM_RIGHTS, so they don't leak. */
3039 for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL);
3040 cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) {
3041 cmsg_status = get_cmsg_data_len(&msg, cmsgh, &cmsgdatalen);
3042 if (cmsg_status < 0)
3043 break;
3044 if (cmsgh->cmsg_level == SOL_SOCKET &&
3045 cmsgh->cmsg_type == SCM_RIGHTS) {
3046 size_t numfds;
3047 int *fdp;
3048
3049 numfds = cmsgdatalen / sizeof(int);
3050 fdp = (int *)CMSG_DATA(cmsgh);
3051 while (numfds-- > 0)
3052 close(*fdp++);
3053 }
3054 if (cmsg_status != 0)
3055 break;
3056 }
3057#endif /* SCM_RIGHTS */
3058 goto finally;
3059}
3060
3061
3062static PyObject *
3063makeval_recvmsg(ssize_t received, void *data)
3064{
3065 PyObject **buf = data;
3066
3067 if (received < PyBytes_GET_SIZE(*buf))
3068 _PyBytes_Resize(buf, received);
3069 Py_XINCREF(*buf);
3070 return *buf;
3071}
3072
3073/* s.recvmsg(bufsize[, ancbufsize[, flags]]) method */
3074
3075static PyObject *
3076sock_recvmsg(PySocketSockObject *s, PyObject *args)
3077{
3078 Py_ssize_t bufsize, ancbufsize = 0;
3079 int flags = 0;
3080 struct iovec iov;
3081 PyObject *buf = NULL, *retval = NULL;
3082
3083 if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags))
3084 return NULL;
3085
3086 if (bufsize < 0) {
3087 PyErr_SetString(PyExc_ValueError, "negative buffer size in recvmsg()");
3088 return NULL;
3089 }
3090 if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL)
3091 return NULL;
3092 iov.iov_base = PyBytes_AS_STRING(buf);
3093 iov.iov_len = bufsize;
3094
3095 /* Note that we're passing a pointer to *our pointer* to the bytes
3096 object here (&buf); makeval_recvmsg() may incref the object, or
3097 deallocate it and set our pointer to NULL. */
3098 retval = sock_recvmsg_guts(s, &iov, 1, flags, ancbufsize,
3099 &makeval_recvmsg, &buf);
3100 Py_XDECREF(buf);
3101 return retval;
3102}
3103
3104PyDoc_STRVAR(recvmsg_doc,
3105"recvmsg(bufsize[, ancbufsize[, flags]]) -> (data, ancdata, msg_flags, address)\n\
3106\n\
3107Receive normal data (up to bufsize bytes) and ancillary data from the\n\
3108socket. The ancbufsize argument sets the size in bytes of the\n\
3109internal buffer used to receive the ancillary data; it defaults to 0,\n\
3110meaning that no ancillary data will be received. Appropriate buffer\n\
3111sizes for ancillary data can be calculated using CMSG_SPACE() or\n\
3112CMSG_LEN(), and items which do not fit into the buffer might be\n\
3113truncated or discarded. The flags argument defaults to 0 and has the\n\
3114same meaning as for recv().\n\
3115\n\
3116The return value is a 4-tuple: (data, ancdata, msg_flags, address).\n\
3117The data item is a bytes object holding the non-ancillary data\n\
3118received. The ancdata item is a list of zero or more tuples\n\
3119(cmsg_level, cmsg_type, cmsg_data) representing the ancillary data\n\
3120(control messages) received: cmsg_level and cmsg_type are integers\n\
3121specifying the protocol level and protocol-specific type respectively,\n\
3122and cmsg_data is a bytes object holding the associated data. The\n\
3123msg_flags item is the bitwise OR of various flags indicating\n\
3124conditions on the received message; see your system documentation for\n\
3125details. If the receiving socket is unconnected, address is the\n\
3126address of the sending socket, if available; otherwise, its value is\n\
3127unspecified.\n\
3128\n\
3129If recvmsg() raises an exception after the system call returns, it\n\
3130will first attempt to close any file descriptors received via the\n\
3131SCM_RIGHTS mechanism.");
3132
3133
3134static PyObject *
3135makeval_recvmsg_into(ssize_t received, void *data)
3136{
3137 return PyLong_FromSsize_t(received);
3138}
3139
3140/* s.recvmsg_into(buffers[, ancbufsize[, flags]]) method */
3141
3142static PyObject *
3143sock_recvmsg_into(PySocketSockObject *s, PyObject *args)
3144{
3145 Py_ssize_t ancbufsize = 0;
3146 int flags = 0;
3147 struct iovec *iovs = NULL;
3148 Py_ssize_t i, nitems, nbufs = 0;
3149 Py_buffer *bufs = NULL;
3150 PyObject *buffers_arg, *fast, *retval = NULL;
3151
3152 if (!PyArg_ParseTuple(args, "O|ni:recvmsg_into",
3153 &buffers_arg, &ancbufsize, &flags))
3154 return NULL;
3155
3156 if ((fast = PySequence_Fast(buffers_arg,
3157 "recvmsg_into() argument 1 must be an "
3158 "iterable")) == NULL)
3159 return NULL;
3160 nitems = PySequence_Fast_GET_SIZE(fast);
3161 if (nitems > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003162 PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003163 goto finally;
3164 }
3165
3166 /* Fill in an iovec for each item, and save the Py_buffer
3167 structs to release afterwards. */
3168 if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL ||
3169 (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) {
3170 PyErr_NoMemory();
3171 goto finally;
3172 }
3173 for (; nbufs < nitems; nbufs++) {
3174 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(fast, nbufs),
3175 "w*;recvmsg_into() argument 1 must be an iterable "
3176 "of single-segment read-write buffers",
3177 &bufs[nbufs]))
3178 goto finally;
3179 iovs[nbufs].iov_base = bufs[nbufs].buf;
3180 iovs[nbufs].iov_len = bufs[nbufs].len;
3181 }
3182
3183 retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize,
3184 &makeval_recvmsg_into, NULL);
3185finally:
3186 for (i = 0; i < nbufs; i++)
3187 PyBuffer_Release(&bufs[i]);
3188 PyMem_Free(bufs);
3189 PyMem_Free(iovs);
3190 Py_DECREF(fast);
3191 return retval;
3192}
3193
3194PyDoc_STRVAR(recvmsg_into_doc,
3195"recvmsg_into(buffers[, ancbufsize[, flags]]) -> (nbytes, ancdata, msg_flags, address)\n\
3196\n\
3197Receive normal data and ancillary data from the socket, scattering the\n\
3198non-ancillary data into a series of buffers. The buffers argument\n\
3199must be an iterable of objects that export writable buffers\n\
3200(e.g. bytearray objects); these will be filled with successive chunks\n\
3201of the non-ancillary data until it has all been written or there are\n\
3202no more buffers. The ancbufsize argument sets the size in bytes of\n\
3203the internal buffer used to receive the ancillary data; it defaults to\n\
32040, meaning that no ancillary data will be received. Appropriate\n\
3205buffer sizes for ancillary data can be calculated using CMSG_SPACE()\n\
3206or CMSG_LEN(), and items which do not fit into the buffer might be\n\
3207truncated or discarded. The flags argument defaults to 0 and has the\n\
3208same meaning as for recv().\n\
3209\n\
3210The return value is a 4-tuple: (nbytes, ancdata, msg_flags, address).\n\
3211The nbytes item is the total number of bytes of non-ancillary data\n\
3212written into the buffers. The ancdata item is a list of zero or more\n\
3213tuples (cmsg_level, cmsg_type, cmsg_data) representing the ancillary\n\
3214data (control messages) received: cmsg_level and cmsg_type are\n\
3215integers specifying the protocol level and protocol-specific type\n\
3216respectively, and cmsg_data is a bytes object holding the associated\n\
3217data. The msg_flags item is the bitwise OR of various flags\n\
3218indicating conditions on the received message; see your system\n\
3219documentation for details. If the receiving socket is unconnected,\n\
3220address is the address of the sending socket, if available; otherwise,\n\
3221its value is unspecified.\n\
3222\n\
3223If recvmsg_into() raises an exception after the system call returns,\n\
3224it will first attempt to close any file descriptors received via the\n\
3225SCM_RIGHTS mechanism.");
3226#endif /* CMSG_LEN */
3227
3228
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003229/* s.send(data [,flags]) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003230
Guido van Rossum73624e91994-10-10 17:59:00 +00003231static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003232sock_send(PySocketSockObject *s, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00003233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003234 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003235 Py_ssize_t len, n = -1;
3236 int flags = 0, timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003238
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003239 if (!PyArg_ParseTuple(args, "y*|i:send", &pbuf, &flags))
3240 return NULL;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003242 if (!IS_SELECTABLE(s)) {
3243 PyBuffer_Release(&pbuf);
3244 return select_error();
3245 }
3246 buf = pbuf.buf;
3247 len = pbuf.len;
Neal Norwitz082b2df2006-02-07 07:04:46 +00003248
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003249 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003250 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003251 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003252 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003253#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003254 if (len > INT_MAX)
3255 len = INT_MAX;
3256 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003257#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003258 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003259#endif
Victor Stinner9a644b22013-06-24 23:47:41 +02003260 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003261 Py_END_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003262 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003263 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003264 PyErr_SetString(socket_timeout, "timed out");
3265 return NULL;
3266 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003267 END_SELECT_LOOP(s)
3268
3269 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003270 if (n < 0)
3271 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003272 return PyLong_FromSsize_t(n);
Guido van Rossum30a685f1991-06-27 15:51:29 +00003273}
3274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003275PyDoc_STRVAR(send_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003276"send(data[, flags]) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003277\n\
3278Send a data string to the socket. For the optional flags\n\
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003279argument, see the Unix manual. Return the number of bytes\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003280sent; this may be less than len(data) if the network is busy.");
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003281
3282
3283/* s.sendall(data [,flags]) method */
3284
3285static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003286sock_sendall(PySocketSockObject *s, PyObject *args)
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 char *buf;
Antoine Pitrou19467d22010-08-17 19:33:30 +00003289 Py_ssize_t len, n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003290 int flags = 0, timeout, saved_errno;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003291 Py_buffer pbuf;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003292
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003293 if (!PyArg_ParseTuple(args, "y*|i:sendall", &pbuf, &flags))
3294 return NULL;
3295 buf = pbuf.buf;
3296 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003298 if (!IS_SELECTABLE(s)) {
3299 PyBuffer_Release(&pbuf);
3300 return select_error();
3301 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003303 do {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003304 Py_BEGIN_ALLOW_THREADS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 timeout = internal_select(s, 1);
3306 n = -1;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003307 if (!timeout) {
Christian Heimesaf01f662013-12-21 16:19:10 +01003308#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003309 if (len > INT_MAX)
3310 len = INT_MAX;
3311 n = send(s->sock_fd, buf, (int)len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003312#else
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003313 n = send(s->sock_fd, buf, len, flags);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003314#endif
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003315 }
3316 Py_END_ALLOW_THREADS
3317 if (timeout == 1) {
3318 PyBuffer_Release(&pbuf);
3319 PyErr_SetString(socket_timeout, "timed out");
3320 return NULL;
3321 }
3322 /* PyErr_CheckSignals() might change errno */
3323 saved_errno = errno;
3324 /* We must run our signal handlers before looping again.
3325 send() can return a successful partial write when it is
3326 interrupted, so we can't restrict ourselves to EINTR. */
3327 if (PyErr_CheckSignals()) {
3328 PyBuffer_Release(&pbuf);
3329 return NULL;
3330 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 if (n < 0) {
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003332 /* If interrupted, try again */
3333 if (saved_errno == EINTR)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003334 continue;
Antoine Pitrou6d7df632010-09-27 17:52:25 +00003335 else
3336 break;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 }
3338 buf += n;
3339 len -= n;
3340 } while (len > 0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 PyBuffer_Release(&pbuf);
Guido van Rossum67f7a382002-06-06 21:08:16 +00003342
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003343 if (n < 0)
3344 return s->errorhandler();
Guido van Rossum67f7a382002-06-06 21:08:16 +00003345
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003346 Py_INCREF(Py_None);
3347 return Py_None;
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003348}
3349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003350PyDoc_STRVAR(sendall_doc,
Guido van Rossum9f7a5392001-10-26 03:25:00 +00003351"sendall(data[, flags])\n\
3352\n\
3353Send a data string to the socket. For the optional flags\n\
3354argument, see the Unix manual. This calls send() repeatedly\n\
3355until all data is sent. If an error occurs, it's impossible\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003356to tell how much data has been sent.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003357
Guido van Rossum30a685f1991-06-27 15:51:29 +00003358
Guido van Rossumeb6b33a1993-05-25 09:38:27 +00003359/* s.sendto(data, [flags,] sockaddr) method */
Guido van Rossum30a685f1991-06-27 15:51:29 +00003360
Guido van Rossum73624e91994-10-10 17:59:00 +00003361static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003362sock_sendto(PySocketSockObject *s, PyObject *args)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003363{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003364 Py_buffer pbuf;
3365 PyObject *addro;
3366 char *buf;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003367 Py_ssize_t len, arglen;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003368 sock_addr_t addrbuf;
Victor Stinner8e44aa52015-04-02 17:16:08 +02003369 int addrlen, flags, timeout;
3370 Py_ssize_t n = -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003371
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003372 flags = 0;
Antoine Pitrou5e981412011-03-17 22:38:37 +01003373 arglen = PyTuple_Size(args);
3374 switch (arglen) {
3375 case 2:
3376 PyArg_ParseTuple(args, "y*O:sendto", &pbuf, &addro);
3377 break;
3378 case 3:
3379 PyArg_ParseTuple(args, "y*iO:sendto",
3380 &pbuf, &flags, &addro);
3381 break;
3382 default:
3383 PyErr_Format(PyExc_TypeError,
3384 "sendto() takes 2 or 3 arguments (%d given)",
3385 arglen);
Victor Stinner77af1722011-05-26 14:05:59 +02003386 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003387 }
Antoine Pitrou5e981412011-03-17 22:38:37 +01003388 if (PyErr_Occurred())
3389 return NULL;
3390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003391 buf = pbuf.buf;
3392 len = pbuf.len;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003394 if (!IS_SELECTABLE(s)) {
3395 PyBuffer_Release(&pbuf);
3396 return select_error();
3397 }
Neal Norwitz082b2df2006-02-07 07:04:46 +00003398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003399 if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {
3400 PyBuffer_Release(&pbuf);
3401 return NULL;
3402 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00003403
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003404 BEGIN_SELECT_LOOP(s)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 Py_BEGIN_ALLOW_THREADS
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003406 timeout = internal_select_ex(s, 1, interval);
Victor Stinner9a644b22013-06-24 23:47:41 +02003407 if (!timeout) {
Victor Stinner14b9b112013-06-25 00:37:25 +02003408#ifdef MS_WINDOWS
Victor Stinner9a644b22013-06-24 23:47:41 +02003409 if (len > INT_MAX)
3410 len = INT_MAX;
3411 n = sendto(s->sock_fd, buf, (int)len, flags,
3412 SAS2SA(&addrbuf), addrlen);
3413#else
3414 n = sendto(s->sock_fd, buf, len, flags,
3415 SAS2SA(&addrbuf), addrlen);
3416#endif
3417 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003418 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00003419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003420 if (timeout == 1) {
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003421 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003422 PyErr_SetString(socket_timeout, "timed out");
3423 return NULL;
3424 }
Antoine Pitrou3e1fd272010-09-28 21:23:11 +00003425 END_SELECT_LOOP(s)
3426 PyBuffer_Release(&pbuf);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003427 if (n < 0)
3428 return s->errorhandler();
Antoine Pitrou19467d22010-08-17 19:33:30 +00003429 return PyLong_FromSsize_t(n);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003430}
3431
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003432PyDoc_STRVAR(sendto_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00003433"sendto(data[, flags], address) -> count\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00003434\n\
3435Like send(data, flags) but allows specifying the destination address.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003436For IP sockets, the address is a pair (hostaddr, port).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003437
Guido van Rossum30a685f1991-06-27 15:51:29 +00003438
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003439/* The sendmsg() and recvmsg[_into]() methods require a working
3440 CMSG_LEN(). See the comment near get_CMSG_LEN(). */
3441#ifdef CMSG_LEN
3442/* s.sendmsg(buffers[, ancdata[, flags[, address]]]) method */
3443
3444static PyObject *
3445sock_sendmsg(PySocketSockObject *s, PyObject *args)
3446{
3447 Py_ssize_t i, ndataparts, ndatabufs = 0, ncmsgs, ncmsgbufs = 0;
3448 Py_buffer *databufs = NULL;
3449 struct iovec *iovs = NULL;
3450 sock_addr_t addrbuf;
Charles-François Natalie9e95ae2011-08-24 21:40:53 +02003451 struct msghdr msg = {0};
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003452 struct cmsginfo {
3453 int level;
3454 int type;
3455 Py_buffer data;
3456 } *cmsgs = NULL;
3457 void *controlbuf = NULL;
3458 size_t controllen, controllen_last;
3459 ssize_t bytes_sent = -1;
3460 int addrlen, timeout, flags = 0;
3461 PyObject *data_arg, *cmsg_arg = NULL, *addr_arg = NULL, *data_fast = NULL,
3462 *cmsg_fast = NULL, *retval = NULL;
3463
3464 if (!PyArg_ParseTuple(args, "O|OiO:sendmsg",
3465 &data_arg, &cmsg_arg, &flags, &addr_arg))
3466 return NULL;
3467
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003468 /* Parse destination address. */
3469 if (addr_arg != NULL && addr_arg != Py_None) {
3470 if (!getsockaddrarg(s, addr_arg, SAS2SA(&addrbuf), &addrlen))
3471 goto finally;
3472 msg.msg_name = &addrbuf;
3473 msg.msg_namelen = addrlen;
3474 }
3475
3476 /* Fill in an iovec for each message part, and save the Py_buffer
3477 structs to release afterwards. */
3478 if ((data_fast = PySequence_Fast(data_arg,
3479 "sendmsg() argument 1 must be an "
3480 "iterable")) == NULL)
3481 goto finally;
3482 ndataparts = PySequence_Fast_GET_SIZE(data_fast);
3483 if (ndataparts > INT_MAX) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003484 PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003485 goto finally;
3486 }
3487 msg.msg_iovlen = ndataparts;
3488 if (ndataparts > 0 &&
3489 ((msg.msg_iov = iovs = PyMem_New(struct iovec, ndataparts)) == NULL ||
3490 (databufs = PyMem_New(Py_buffer, ndataparts)) == NULL)) {
3491 PyErr_NoMemory();
3492 goto finally;
3493 }
3494 for (; ndatabufs < ndataparts; ndatabufs++) {
3495 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(data_fast, ndatabufs),
3496 "y*;sendmsg() argument 1 must be an iterable of "
Serhiy Storchakab757c832014-12-05 22:25:22 +02003497 "bytes-like objects",
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003498 &databufs[ndatabufs]))
3499 goto finally;
3500 iovs[ndatabufs].iov_base = databufs[ndatabufs].buf;
3501 iovs[ndatabufs].iov_len = databufs[ndatabufs].len;
3502 }
3503
3504 if (cmsg_arg == NULL)
3505 ncmsgs = 0;
3506 else {
3507 if ((cmsg_fast = PySequence_Fast(cmsg_arg,
3508 "sendmsg() argument 2 must be an "
3509 "iterable")) == NULL)
3510 goto finally;
3511 ncmsgs = PySequence_Fast_GET_SIZE(cmsg_fast);
3512 }
3513
3514#ifndef CMSG_SPACE
3515 if (ncmsgs > 1) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003516 PyErr_SetString(PyExc_OSError,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003517 "sending multiple control messages is not supported "
3518 "on this system");
3519 goto finally;
3520 }
3521#endif
3522 /* Save level, type and Py_buffer for each control message,
3523 and calculate total size. */
3524 if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) {
3525 PyErr_NoMemory();
3526 goto finally;
3527 }
3528 controllen = controllen_last = 0;
3529 while (ncmsgbufs < ncmsgs) {
3530 size_t bufsize, space;
3531
3532 if (!PyArg_Parse(PySequence_Fast_GET_ITEM(cmsg_fast, ncmsgbufs),
3533 "(iiy*):[sendmsg() ancillary data items]",
3534 &cmsgs[ncmsgbufs].level,
3535 &cmsgs[ncmsgbufs].type,
3536 &cmsgs[ncmsgbufs].data))
3537 goto finally;
3538 bufsize = cmsgs[ncmsgbufs++].data.len;
3539
3540#ifdef CMSG_SPACE
3541 if (!get_CMSG_SPACE(bufsize, &space)) {
3542#else
3543 if (!get_CMSG_LEN(bufsize, &space)) {
3544#endif
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003545 PyErr_SetString(PyExc_OSError, "ancillary data item too large");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003546 goto finally;
3547 }
3548 controllen += space;
3549 if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02003550 PyErr_SetString(PyExc_OSError, "too much ancillary data");
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003551 goto finally;
3552 }
3553 controllen_last = controllen;
3554 }
3555
3556 /* Construct ancillary data block from control message info. */
3557 if (ncmsgbufs > 0) {
3558 struct cmsghdr *cmsgh = NULL;
3559
3560 if ((msg.msg_control = controlbuf =
3561 PyMem_Malloc(controllen)) == NULL) {
3562 PyErr_NoMemory();
3563 goto finally;
3564 }
3565 msg.msg_controllen = controllen;
3566
3567 /* Need to zero out the buffer as a workaround for glibc's
3568 CMSG_NXTHDR() implementation. After getting the pointer to
3569 the next header, it checks its (uninitialized) cmsg_len
3570 member to see if the "message" fits in the buffer, and
3571 returns NULL if it doesn't. Zero-filling the buffer
Terry Jan Reedy0f847642013-03-11 18:34:00 -04003572 ensures that this doesn't happen. */
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003573 memset(controlbuf, 0, controllen);
3574
3575 for (i = 0; i < ncmsgbufs; i++) {
3576 size_t msg_len, data_len = cmsgs[i].data.len;
3577 int enough_space = 0;
3578
3579 cmsgh = (i == 0) ? CMSG_FIRSTHDR(&msg) : CMSG_NXTHDR(&msg, cmsgh);
3580 if (cmsgh == NULL) {
3581 PyErr_Format(PyExc_RuntimeError,
3582 "unexpected NULL result from %s()",
3583 (i == 0) ? "CMSG_FIRSTHDR" : "CMSG_NXTHDR");
3584 goto finally;
3585 }
3586 if (!get_CMSG_LEN(data_len, &msg_len)) {
3587 PyErr_SetString(PyExc_RuntimeError,
3588 "item size out of range for CMSG_LEN()");
3589 goto finally;
3590 }
3591 if (cmsg_min_space(&msg, cmsgh, msg_len)) {
3592 size_t space;
3593
3594 cmsgh->cmsg_len = msg_len;
3595 if (get_cmsg_data_space(&msg, cmsgh, &space))
3596 enough_space = (space >= data_len);
3597 }
3598 if (!enough_space) {
3599 PyErr_SetString(PyExc_RuntimeError,
3600 "ancillary data does not fit in calculated "
3601 "space");
3602 goto finally;
3603 }
3604 cmsgh->cmsg_level = cmsgs[i].level;
3605 cmsgh->cmsg_type = cmsgs[i].type;
3606 memcpy(CMSG_DATA(cmsgh), cmsgs[i].data.buf, data_len);
3607 }
3608 }
3609
3610 /* Make the system call. */
3611 if (!IS_SELECTABLE(s)) {
3612 select_error();
3613 goto finally;
3614 }
3615
3616 BEGIN_SELECT_LOOP(s)
3617 Py_BEGIN_ALLOW_THREADS;
3618 timeout = internal_select_ex(s, 1, interval);
3619 if (!timeout)
3620 bytes_sent = sendmsg(s->sock_fd, &msg, flags);
3621 Py_END_ALLOW_THREADS;
3622 if (timeout == 1) {
3623 PyErr_SetString(socket_timeout, "timed out");
3624 goto finally;
3625 }
3626 END_SELECT_LOOP(s)
3627
3628 if (bytes_sent < 0) {
3629 s->errorhandler();
3630 goto finally;
3631 }
3632 retval = PyLong_FromSsize_t(bytes_sent);
3633
3634finally:
3635 PyMem_Free(controlbuf);
3636 for (i = 0; i < ncmsgbufs; i++)
3637 PyBuffer_Release(&cmsgs[i].data);
3638 PyMem_Free(cmsgs);
3639 Py_XDECREF(cmsg_fast);
3640 for (i = 0; i < ndatabufs; i++)
3641 PyBuffer_Release(&databufs[i]);
3642 PyMem_Free(databufs);
3643 PyMem_Free(iovs);
3644 Py_XDECREF(data_fast);
3645 return retval;
3646}
3647
3648PyDoc_STRVAR(sendmsg_doc,
3649"sendmsg(buffers[, ancdata[, flags[, address]]]) -> count\n\
3650\n\
3651Send normal and ancillary data to the socket, gathering the\n\
3652non-ancillary data from a series of buffers and concatenating it into\n\
3653a single message. The buffers argument specifies the non-ancillary\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003654data as an iterable of bytes-like objects (e.g. bytes objects).\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003655The ancdata argument specifies the ancillary data (control messages)\n\
3656as an iterable of zero or more tuples (cmsg_level, cmsg_type,\n\
3657cmsg_data), where cmsg_level and cmsg_type are integers specifying the\n\
3658protocol level and protocol-specific type respectively, and cmsg_data\n\
Serhiy Storchakab757c832014-12-05 22:25:22 +02003659is a bytes-like object holding the associated data. The flags\n\
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003660argument defaults to 0 and has the same meaning as for send(). If\n\
3661address is supplied and not None, it sets a destination address for\n\
3662the message. The return value is the number of bytes of non-ancillary\n\
3663data sent.");
3664#endif /* CMSG_LEN */
3665
3666
Guido van Rossum30a685f1991-06-27 15:51:29 +00003667/* s.shutdown(how) method */
3668
Guido van Rossum73624e91994-10-10 17:59:00 +00003669static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003670sock_shutdown(PySocketSockObject *s, PyObject *arg)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003671{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003672 int how;
3673 int res;
Jeremy Hyltonae0013d2001-10-11 16:36:35 +00003674
Serhiy Storchaka78980432013-01-15 01:12:17 +02003675 how = _PyLong_AsInt(arg);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003676 if (how == -1 && PyErr_Occurred())
3677 return NULL;
3678 Py_BEGIN_ALLOW_THREADS
3679 res = shutdown(s->sock_fd, how);
3680 Py_END_ALLOW_THREADS
3681 if (res < 0)
3682 return s->errorhandler();
3683 Py_INCREF(Py_None);
3684 return Py_None;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003685}
3686
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003687PyDoc_STRVAR(shutdown_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00003688"shutdown(flag)\n\
3689\n\
Martin v. Löwis94681fc2003-11-27 19:40:22 +00003690Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\
3691of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");
Guido van Rossum82a5c661998-07-07 20:45:43 +00003692
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003693#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Christian Heimesfaf2f632008-01-06 16:59:19 +00003694static PyObject*
3695sock_ioctl(PySocketSockObject *s, PyObject *arg)
3696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003697 unsigned long cmd = SIO_RCVALL;
3698 PyObject *argO;
3699 DWORD recv;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003701 if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))
3702 return NULL;
Christian Heimesfaf2f632008-01-06 16:59:19 +00003703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003704 switch (cmd) {
3705 case SIO_RCVALL: {
3706 unsigned int option = RCVALL_ON;
3707 if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))
3708 return NULL;
3709 if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),
3710 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3711 return set_error();
3712 }
3713 return PyLong_FromUnsignedLong(recv); }
3714 case SIO_KEEPALIVE_VALS: {
3715 struct tcp_keepalive ka;
3716 if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,
3717 &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))
3718 return NULL;
3719 if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),
3720 NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {
3721 return set_error();
3722 }
3723 return PyLong_FromUnsignedLong(recv); }
3724 default:
3725 PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);
3726 return NULL;
3727 }
Christian Heimesfaf2f632008-01-06 16:59:19 +00003728}
3729PyDoc_STRVAR(sock_ioctl_doc,
3730"ioctl(cmd, option) -> long\n\
3731\n\
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00003732Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\
3733SIO_RCVALL: 'option' must be one of the socket.RCVALL_* constants.\n\
3734SIO_KEEPALIVE_VALS: 'option' is a tuple of (onoff, timeout, interval).");
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003735#endif
3736
3737#if defined(MS_WINDOWS)
3738static PyObject*
3739sock_share(PySocketSockObject *s, PyObject *arg)
3740{
3741 WSAPROTOCOL_INFO info;
3742 DWORD processId;
3743 int result;
3744
3745 if (!PyArg_ParseTuple(arg, "I", &processId))
3746 return NULL;
3747
3748 Py_BEGIN_ALLOW_THREADS
3749 result = WSADuplicateSocket(s->sock_fd, processId, &info);
3750 Py_END_ALLOW_THREADS
3751 if (result == SOCKET_ERROR)
3752 return set_error();
3753 return PyBytes_FromStringAndSize((const char*)&info, sizeof(info));
3754}
3755PyDoc_STRVAR(sock_share_doc,
3756"share(process_id) -> bytes\n\
3757\n\
3758Share the socket with another process. The target process id\n\
3759must be provided and the resulting bytes object passed to the target\n\
3760process. There the shared socket can be instantiated by calling\n\
3761socket.fromshare().");
3762
Christian Heimesfaf2f632008-01-06 16:59:19 +00003763
3764#endif
Guido van Rossum30a685f1991-06-27 15:51:29 +00003765
3766/* List of methods for socket objects */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003767
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003768static PyMethodDef sock_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003769 {"_accept", (PyCFunction)sock_accept, METH_NOARGS,
3770 accept_doc},
3771 {"bind", (PyCFunction)sock_bind, METH_O,
3772 bind_doc},
3773 {"close", (PyCFunction)sock_close, METH_NOARGS,
3774 close_doc},
3775 {"connect", (PyCFunction)sock_connect, METH_O,
3776 connect_doc},
3777 {"connect_ex", (PyCFunction)sock_connect_ex, METH_O,
3778 connect_ex_doc},
Antoine Pitrou6e451df2010-08-09 20:39:54 +00003779 {"detach", (PyCFunction)sock_detach, METH_NOARGS,
3780 detach_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003781 {"fileno", (PyCFunction)sock_fileno, METH_NOARGS,
3782 fileno_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00003783#ifdef HAVE_GETPEERNAME
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003784 {"getpeername", (PyCFunction)sock_getpeername,
3785 METH_NOARGS, getpeername_doc},
Guido van Rossum9575a441993-04-07 14:06:14 +00003786#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003787 {"getsockname", (PyCFunction)sock_getsockname,
3788 METH_NOARGS, getsockname_doc},
3789 {"getsockopt", (PyCFunction)sock_getsockopt, METH_VARARGS,
3790 getsockopt_doc},
Amaury Forgeot d'Arc3d17a5c2008-06-13 01:09:34 +00003791#if defined(MS_WINDOWS) && defined(SIO_RCVALL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003792 {"ioctl", (PyCFunction)sock_ioctl, METH_VARARGS,
3793 sock_ioctl_doc},
Christian Heimesfaf2f632008-01-06 16:59:19 +00003794#endif
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003795#if defined(MS_WINDOWS)
3796 {"share", (PyCFunction)sock_share, METH_VARARGS,
3797 sock_share_doc},
3798#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003799 {"listen", (PyCFunction)sock_listen, METH_O,
3800 listen_doc},
3801 {"recv", (PyCFunction)sock_recv, METH_VARARGS,
3802 recv_doc},
3803 {"recv_into", (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,
3804 recv_into_doc},
3805 {"recvfrom", (PyCFunction)sock_recvfrom, METH_VARARGS,
3806 recvfrom_doc},
3807 {"recvfrom_into", (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,
3808 recvfrom_into_doc},
3809 {"send", (PyCFunction)sock_send, METH_VARARGS,
3810 send_doc},
3811 {"sendall", (PyCFunction)sock_sendall, METH_VARARGS,
3812 sendall_doc},
3813 {"sendto", (PyCFunction)sock_sendto, METH_VARARGS,
3814 sendto_doc},
3815 {"setblocking", (PyCFunction)sock_setblocking, METH_O,
3816 setblocking_doc},
3817 {"settimeout", (PyCFunction)sock_settimeout, METH_O,
3818 settimeout_doc},
3819 {"gettimeout", (PyCFunction)sock_gettimeout, METH_NOARGS,
3820 gettimeout_doc},
3821 {"setsockopt", (PyCFunction)sock_setsockopt, METH_VARARGS,
3822 setsockopt_doc},
3823 {"shutdown", (PyCFunction)sock_shutdown, METH_O,
3824 shutdown_doc},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003825#ifdef CMSG_LEN
3826 {"recvmsg", (PyCFunction)sock_recvmsg, METH_VARARGS,
3827 recvmsg_doc},
3828 {"recvmsg_into", (PyCFunction)sock_recvmsg_into, METH_VARARGS,
3829 recvmsg_into_doc,},
3830 {"sendmsg", (PyCFunction)sock_sendmsg, METH_VARARGS,
3831 sendmsg_doc},
3832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003833 {NULL, NULL} /* sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003834};
3835
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003836/* SockObject members */
3837static PyMemberDef sock_memberlist[] = {
3838 {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},
3839 {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},
3840 {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},
3841 {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},
3842 {0},
3843};
Guido van Rossum30a685f1991-06-27 15:51:29 +00003844
Guido van Rossum73624e91994-10-10 17:59:00 +00003845/* Deallocate a socket object in response to the last Py_DECREF().
Guido van Rossum30a685f1991-06-27 15:51:29 +00003846 First close the file description. */
3847
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003848static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003849sock_dealloc(PySocketSockObject *s)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003850{
Antoine Pitroue033e062010-10-29 10:38:18 +00003851 if (s->sock_fd != -1) {
3852 PyObject *exc, *val, *tb;
3853 Py_ssize_t old_refcount = Py_REFCNT(s);
3854 ++Py_REFCNT(s);
3855 PyErr_Fetch(&exc, &val, &tb);
3856 if (PyErr_WarnFormat(PyExc_ResourceWarning, 1,
3857 "unclosed %R", s))
3858 /* Spurious errors can appear at shutdown */
3859 if (PyErr_ExceptionMatches(PyExc_Warning))
3860 PyErr_WriteUnraisable((PyObject *) s);
3861 PyErr_Restore(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003862 (void) SOCKETCLOSE(s->sock_fd);
Antoine Pitroue033e062010-10-29 10:38:18 +00003863 Py_REFCNT(s) = old_refcount;
3864 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003865 Py_TYPE(s)->tp_free((PyObject *)s);
Guido van Rossum6574b3e1991-06-25 21:36:08 +00003866}
3867
Guido van Rossum30a685f1991-06-27 15:51:29 +00003868
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003869static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003870sock_repr(PySocketSockObject *s)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003871{
Victor Stinnere254e532014-07-26 14:36:55 +02003872 long sock_fd;
3873 /* On Windows, this test is needed because SOCKET_T is unsigned */
3874 if (s->sock_fd == INVALID_SOCKET) {
3875 sock_fd = -1;
3876 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003877#if SIZEOF_SOCKET_T > SIZEOF_LONG
Victor Stinnere254e532014-07-26 14:36:55 +02003878 else if (s->sock_fd > LONG_MAX) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003879 /* this can occur on Win64, and actually there is a special
3880 ugly printf formatter for decimal pointer length integer
3881 printing, only bother if necessary*/
3882 PyErr_SetString(PyExc_OverflowError,
3883 "no printf formatter to display "
3884 "the socket descriptor in decimal");
3885 return NULL;
3886 }
Fred Drakea04eaad2000-06-30 02:46:07 +00003887#endif
Victor Stinnere254e532014-07-26 14:36:55 +02003888 else
3889 sock_fd = (long)s->sock_fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003890 return PyUnicode_FromFormat(
3891 "<socket object, fd=%ld, family=%d, type=%d, proto=%d>",
Victor Stinnere254e532014-07-26 14:36:55 +02003892 sock_fd, s->sock_family,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003893 s->sock_type,
3894 s->sock_proto);
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00003895}
3896
3897
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003898/* Create a new, uninitialized socket object. */
3899
3900static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00003901sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003902{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 PyObject *new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003905 new = type->tp_alloc(type, 0);
3906 if (new != NULL) {
3907 ((PySocketSockObject *)new)->sock_fd = -1;
3908 ((PySocketSockObject *)new)->sock_timeout = -1.0;
3909 ((PySocketSockObject *)new)->errorhandler = &set_error;
3910 }
3911 return new;
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003912}
3913
3914
3915/* Initialize a new socket object. */
3916
Victor Stinnerdaf45552013-08-28 00:53:59 +02003917#ifdef SOCK_CLOEXEC
3918/* socket() and socketpair() fail with EINVAL on Linux kernel older
3919 * than 2.6.27 if SOCK_CLOEXEC flag is set in the socket type. */
3920static int sock_cloexec_works = -1;
3921#endif
3922
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003923/*ARGSUSED*/
3924static int
Andrew MacIntyre7aec4a22002-06-13 11:53:52 +00003925sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003926{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003927 PySocketSockObject *s = (PySocketSockObject *)self;
3928 PyObject *fdobj = NULL;
3929 SOCKET_T fd = INVALID_SOCKET;
3930 int family = AF_INET, type = SOCK_STREAM, proto = 0;
3931 static char *keywords[] = {"family", "type", "proto", "fileno", 0};
Victor Stinnerdaf45552013-08-28 00:53:59 +02003932#ifndef MS_WINDOWS
3933#ifdef SOCK_CLOEXEC
3934 int *atomic_flag_works = &sock_cloexec_works;
3935#else
3936 int *atomic_flag_works = NULL;
3937#endif
3938#endif
Guido van Rossum384ca9c2001-10-27 22:20:47 +00003939
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003940 if (!PyArg_ParseTupleAndKeywords(args, kwds,
3941 "|iiiO:socket", keywords,
3942 &family, &type, &proto, &fdobj))
3943 return -1;
Guido van Rossum67f7a382002-06-06 21:08:16 +00003944
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003945 if (fdobj != NULL && fdobj != Py_None) {
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00003946#ifdef MS_WINDOWS
3947 /* recreate a socket that was duplicated */
3948 if (PyBytes_Check(fdobj)) {
3949 WSAPROTOCOL_INFO info;
3950 if (PyBytes_GET_SIZE(fdobj) != sizeof(info)) {
3951 PyErr_Format(PyExc_ValueError,
3952 "socket descriptor string has wrong size, "
3953 "should be %zu bytes.", sizeof(info));
3954 return -1;
3955 }
3956 memcpy(&info, PyBytes_AS_STRING(fdobj), sizeof(info));
3957 Py_BEGIN_ALLOW_THREADS
3958 fd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
3959 FROM_PROTOCOL_INFO, &info, 0, WSA_FLAG_OVERLAPPED);
3960 Py_END_ALLOW_THREADS
3961 if (fd == INVALID_SOCKET) {
3962 set_error();
3963 return -1;
3964 }
3965 family = info.iAddressFamily;
3966 type = info.iSocketType;
3967 proto = info.iProtocol;
3968 }
3969 else
3970#endif
3971 {
3972 fd = PyLong_AsSocket_t(fdobj);
3973 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
3974 return -1;
3975 if (fd == INVALID_SOCKET) {
3976 PyErr_SetString(PyExc_ValueError,
3977 "can't use invalid socket value");
3978 return -1;
3979 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003980 }
3981 }
3982 else {
Victor Stinnerdaf45552013-08-28 00:53:59 +02003983#ifdef MS_WINDOWS
3984 /* Windows implementation */
3985#ifndef WSA_FLAG_NO_HANDLE_INHERIT
3986#define WSA_FLAG_NO_HANDLE_INHERIT 0x80
3987#endif
3988
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003989 Py_BEGIN_ALLOW_THREADS
Victor Stinnerdaf45552013-08-28 00:53:59 +02003990 if (support_wsa_no_inherit) {
3991 fd = WSASocket(family, type, proto,
3992 NULL, 0,
3993 WSA_FLAG_OVERLAPPED | WSA_FLAG_NO_HANDLE_INHERIT);
3994 if (fd == INVALID_SOCKET) {
3995 /* Windows 7 or Windows 2008 R2 without SP1 or the hotfix */
3996 support_wsa_no_inherit = 0;
3997 fd = socket(family, type, proto);
3998 }
3999 }
4000 else {
4001 fd = socket(family, type, proto);
4002 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004003 Py_END_ALLOW_THREADS
Guido van Rossum67f7a382002-06-06 21:08:16 +00004004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004005 if (fd == INVALID_SOCKET) {
4006 set_error();
4007 return -1;
4008 }
Victor Stinnerdaf45552013-08-28 00:53:59 +02004009
4010 if (!support_wsa_no_inherit) {
4011 if (!SetHandleInformation((HANDLE)fd, HANDLE_FLAG_INHERIT, 0)) {
4012 closesocket(fd);
4013 PyErr_SetFromWindowsErr(0);
4014 return -1;
4015 }
4016 }
4017#else
4018 /* UNIX */
4019 Py_BEGIN_ALLOW_THREADS
4020#ifdef SOCK_CLOEXEC
4021 if (sock_cloexec_works != 0) {
4022 fd = socket(family, type | SOCK_CLOEXEC, proto);
4023 if (sock_cloexec_works == -1) {
4024 if (fd >= 0) {
4025 sock_cloexec_works = 1;
4026 }
4027 else if (errno == EINVAL) {
4028 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4029 sock_cloexec_works = 0;
4030 fd = socket(family, type, proto);
4031 }
4032 }
4033 }
4034 else
4035#endif
4036 {
4037 fd = socket(family, type, proto);
4038 }
4039 Py_END_ALLOW_THREADS
4040
4041 if (fd == INVALID_SOCKET) {
4042 set_error();
4043 return -1;
4044 }
4045
4046 if (_Py_set_inheritable(fd, 0, atomic_flag_works) < 0) {
4047 SOCKETCLOSE(fd);
4048 return -1;
4049 }
4050#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004051 }
4052 init_sockobject(s, fd, family, type, proto);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004054 return 0;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004055
Guido van Rossum384ca9c2001-10-27 22:20:47 +00004056}
4057
4058
Guido van Rossumb6775db1994-08-01 11:34:53 +00004059/* Type object for socket objects. */
Guido van Rossum30a685f1991-06-27 15:51:29 +00004060
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004061static PyTypeObject sock_type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 PyVarObject_HEAD_INIT(0, 0) /* Must fill in type value later */
4063 "_socket.socket", /* tp_name */
4064 sizeof(PySocketSockObject), /* tp_basicsize */
4065 0, /* tp_itemsize */
4066 (destructor)sock_dealloc, /* tp_dealloc */
4067 0, /* tp_print */
4068 0, /* tp_getattr */
4069 0, /* tp_setattr */
4070 0, /* tp_reserved */
4071 (reprfunc)sock_repr, /* tp_repr */
4072 0, /* tp_as_number */
4073 0, /* tp_as_sequence */
4074 0, /* tp_as_mapping */
4075 0, /* tp_hash */
4076 0, /* tp_call */
4077 0, /* tp_str */
4078 PyObject_GenericGetAttr, /* tp_getattro */
4079 0, /* tp_setattro */
4080 0, /* tp_as_buffer */
4081 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
4082 sock_doc, /* tp_doc */
4083 0, /* tp_traverse */
4084 0, /* tp_clear */
4085 0, /* tp_richcompare */
4086 0, /* tp_weaklistoffset */
4087 0, /* tp_iter */
4088 0, /* tp_iternext */
4089 sock_methods, /* tp_methods */
4090 sock_memberlist, /* tp_members */
4091 0, /* tp_getset */
4092 0, /* tp_base */
4093 0, /* tp_dict */
4094 0, /* tp_descr_get */
4095 0, /* tp_descr_set */
4096 0, /* tp_dictoffset */
4097 sock_initobj, /* tp_init */
4098 PyType_GenericAlloc, /* tp_alloc */
4099 sock_new, /* tp_new */
4100 PyObject_Del, /* tp_free */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00004101};
4102
Guido van Rossum30a685f1991-06-27 15:51:29 +00004103
Guido van Rossum81194471991-07-27 21:42:02 +00004104/* Python interface to gethostname(). */
4105
4106/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004107static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004108socket_gethostname(PyObject *self, PyObject *unused)
Guido van Rossum81194471991-07-27 21:42:02 +00004109{
Martin v. Löwis72f48422010-10-29 18:20:08 +00004110#ifdef MS_WINDOWS
4111 /* Don't use winsock's gethostname, as this returns the ANSI
4112 version of the hostname, whereas we need a Unicode string.
4113 Otherwise, gethostname apparently also returns the DNS name. */
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004114 wchar_t buf[MAX_COMPUTERNAME_LENGTH + 1];
Victor Stinner63941882011-09-29 00:42:28 +02004115 DWORD size = Py_ARRAY_LENGTH(buf);
Victor Stinner74168972011-11-17 01:11:36 +01004116 wchar_t *name;
Hirokazu Yamamoto09fff7a2010-11-05 17:24:13 +00004117 PyObject *result;
Victor Stinner74168972011-11-17 01:11:36 +01004118
4119 if (GetComputerNameExW(ComputerNamePhysicalDnsHostname, buf, &size))
Victor Stinner9d3b93b2011-11-22 02:27:30 +01004120 return PyUnicode_FromWideChar(buf, size);
Victor Stinner74168972011-11-17 01:11:36 +01004121
4122 if (GetLastError() != ERROR_MORE_DATA)
4123 return PyErr_SetFromWindowsErr(0);
4124
4125 if (size == 0)
4126 return PyUnicode_New(0, 0);
4127
4128 /* MSDN says ERROR_MORE_DATA may occur because DNS allows longer
4129 names */
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004130 name = PyMem_New(wchar_t, size);
4131 if (!name) {
4132 PyErr_NoMemory();
Victor Stinner74168972011-11-17 01:11:36 +01004133 return NULL;
Serhiy Storchaka1a1ff292015-02-16 13:28:22 +02004134 }
Victor Stinner74168972011-11-17 01:11:36 +01004135 if (!GetComputerNameExW(ComputerNamePhysicalDnsHostname,
4136 name,
4137 &size))
4138 {
4139 PyMem_Free(name);
4140 return PyErr_SetFromWindowsErr(0);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004141 }
Victor Stinner74168972011-11-17 01:11:36 +01004142
4143 result = PyUnicode_FromWideChar(name, size);
4144 PyMem_Free(name);
4145 return result;
Martin v. Löwis72f48422010-10-29 18:20:08 +00004146#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004147 char buf[1024];
4148 int res;
4149 Py_BEGIN_ALLOW_THREADS
4150 res = gethostname(buf, (int) sizeof buf - 1);
4151 Py_END_ALLOW_THREADS
4152 if (res < 0)
4153 return set_error();
4154 buf[sizeof buf - 1] = '\0';
Victor Stinnera534fc42013-06-03 22:07:27 +02004155 return PyUnicode_DecodeFSDefault(buf);
Martin v. Löwis72f48422010-10-29 18:20:08 +00004156#endif
Guido van Rossum81194471991-07-27 21:42:02 +00004157}
Guido van Rossumff4949e1992-08-05 19:58:53 +00004158
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004159PyDoc_STRVAR(gethostname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004160"gethostname() -> string\n\
4161\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004162Return the current host name.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004163
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004164#ifdef HAVE_SETHOSTNAME
4165PyDoc_STRVAR(sethostname_doc,
4166"sethostname(name)\n\n\
4167Sets the hostname to name.");
4168
4169static PyObject *
4170socket_sethostname(PyObject *self, PyObject *args)
4171{
4172 PyObject *hnobj;
4173 Py_buffer buf;
4174 int res, flag = 0;
4175
Christian Heimesd2774c72013-06-19 02:06:29 +02004176#ifdef _AIX
4177/* issue #18259, not declared in any useful header file */
4178extern int sethostname(const char *, size_t);
4179#endif
4180
Antoine Pitrou061cfb52011-02-28 22:25:22 +00004181 if (!PyArg_ParseTuple(args, "S:sethostname", &hnobj)) {
4182 PyErr_Clear();
4183 if (!PyArg_ParseTuple(args, "O&:sethostname",
4184 PyUnicode_FSConverter, &hnobj))
4185 return NULL;
4186 flag = 1;
4187 }
4188 res = PyObject_GetBuffer(hnobj, &buf, PyBUF_SIMPLE);
4189 if (!res) {
4190 res = sethostname(buf.buf, buf.len);
4191 PyBuffer_Release(&buf);
4192 }
4193 if (flag)
4194 Py_DECREF(hnobj);
4195 if (res)
4196 return set_error();
4197 Py_RETURN_NONE;
4198}
4199#endif
Guido van Rossumff4949e1992-08-05 19:58:53 +00004200
Guido van Rossum30a685f1991-06-27 15:51:29 +00004201/* Python interface to gethostbyname(name). */
4202
4203/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004204static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004205socket_gethostbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004207 char *name;
4208 sock_addr_t addrbuf;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004209 PyObject *ret = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004210
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004211 if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004212 return NULL;
4213 if (setipaddr(name, SAS2SA(&addrbuf), sizeof(addrbuf), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004214 goto finally;
4215 ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
4216finally:
4217 PyMem_Free(name);
4218 return ret;
Guido van Rossum30a685f1991-06-27 15:51:29 +00004219}
4220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004221PyDoc_STRVAR(gethostbyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004222"gethostbyname(host) -> address\n\
4223\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004224Return the IP address (a string of the form '255.255.255.255') for a host.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004225
4226
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004227/* Convenience function common to gethostbyname_ex and gethostbyaddr */
4228
4229static PyObject *
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004230gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004231{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004232 char **pch;
4233 PyObject *rtn_tuple = (PyObject *)NULL;
4234 PyObject *name_list = (PyObject *)NULL;
4235 PyObject *addr_list = (PyObject *)NULL;
4236 PyObject *tmp;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004238 if (h == NULL) {
4239 /* Let's get real error message to return */
4240 set_herror(h_errno);
4241 return NULL;
4242 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004244 if (h->h_addrtype != af) {
4245 /* Let's get real error message to return */
Victor Stinner1f33f2b2011-12-17 04:45:09 +01004246 errno = EAFNOSUPPORT;
4247 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 return NULL;
4249 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004251 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004253 case AF_INET:
4254 if (alen < sizeof(struct sockaddr_in))
4255 return NULL;
4256 break;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004257
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004258#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004259 case AF_INET6:
4260 if (alen < sizeof(struct sockaddr_in6))
4261 return NULL;
4262 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004263#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004265 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 if ((name_list = PyList_New(0)) == NULL)
4268 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 if ((addr_list = PyList_New(0)) == NULL)
4271 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004273 /* SF #1511317: h_aliases can be NULL */
4274 if (h->h_aliases) {
4275 for (pch = h->h_aliases; *pch != NULL; pch++) {
4276 int status;
4277 tmp = PyUnicode_FromString(*pch);
4278 if (tmp == NULL)
4279 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 status = PyList_Append(name_list, tmp);
4282 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 if (status)
4285 goto err;
4286 }
4287 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004288
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004289 for (pch = h->h_addr_list; *pch != NULL; pch++) {
4290 int status;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004292 switch (af) {
Guido van Rossum67f7a382002-06-06 21:08:16 +00004293
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004294 case AF_INET:
4295 {
4296 struct sockaddr_in sin;
4297 memset(&sin, 0, sizeof(sin));
4298 sin.sin_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004299#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 sin.sin_len = sizeof(sin);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004301#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004302 memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
4303 tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004305 if (pch == h->h_addr_list && alen >= sizeof(sin))
4306 memcpy((char *) addr, &sin, sizeof(sin));
4307 break;
4308 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004309
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004310#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004311 case AF_INET6:
4312 {
4313 struct sockaddr_in6 sin6;
4314 memset(&sin6, 0, sizeof(sin6));
4315 sin6.sin6_family = af;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004316#ifdef HAVE_SOCKADDR_SA_LEN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 sin6.sin6_len = sizeof(sin6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004318#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
4320 tmp = makeipaddr((struct sockaddr *)&sin6,
4321 sizeof(sin6));
Guido van Rossum67f7a382002-06-06 21:08:16 +00004322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004323 if (pch == h->h_addr_list && alen >= sizeof(sin6))
4324 memcpy((char *) addr, &sin6, sizeof(sin6));
4325 break;
4326 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004327#endif
Guido van Rossum67f7a382002-06-06 21:08:16 +00004328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004329 default: /* can't happen */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004330 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004331 "unsupported address family");
4332 return NULL;
4333 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004335 if (tmp == NULL)
4336 goto err;
Guido van Rossum67f7a382002-06-06 21:08:16 +00004337
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004338 status = PyList_Append(addr_list, tmp);
4339 Py_DECREF(tmp);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004340
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004341 if (status)
4342 goto err;
4343 }
Guido van Rossum67f7a382002-06-06 21:08:16 +00004344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004345 rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);
Guido van Rossum67f7a382002-06-06 21:08:16 +00004346
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004347 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004348 Py_XDECREF(name_list);
4349 Py_XDECREF(addr_list);
4350 return rtn_tuple;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004351}
4352
4353
4354/* Python interface to gethostbyname_ex(name). */
4355
4356/*ARGSUSED*/
4357static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004358socket_gethostbyname_ex(PyObject *self, PyObject *args)
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004360 char *name;
4361 struct hostent *h;
Charles-François Natali8b759652011-12-23 16:44:51 +01004362 sock_addr_t addr;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 struct sockaddr *sa;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004364 PyObject *ret = NULL;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004365#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004367#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004368 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004369#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 char buf[16384];
4371 int buf_len = (sizeof buf) - 1;
4372 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004373#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004374#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004375 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004376#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004377#endif /* HAVE_GETHOSTBYNAME_R */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004378
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004379 if (!PyArg_ParseTuple(args, "et:gethostbyname_ex", "idna", &name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004380 return NULL;
Charles-François Natali8b759652011-12-23 16:44:51 +01004381 if (setipaddr(name, SAS2SA(&addr), sizeof(addr), AF_INET) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004382 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004383 Py_BEGIN_ALLOW_THREADS
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004384#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004385#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004386 gethostbyname_r(name, &hp_allocated, buf, buf_len,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004388#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004389 h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004390#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 memset((void *) &data, '\0', sizeof(data));
4392 result = gethostbyname_r(name, &hp_allocated, &data);
4393 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004394#endif
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004395#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004396#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004397 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004398#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004399 h = gethostbyname(name);
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004400#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004401 Py_END_ALLOW_THREADS
4402 /* Some C libraries would require addr.__ss_family instead of
4403 addr.ss_family.
4404 Therefore, we cast the sockaddr_storage into sockaddr to
4405 access sa_family. */
Charles-François Natali8b759652011-12-23 16:44:51 +01004406 sa = SAS2SA(&addr);
4407 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr),
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004408 sa->sa_family);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004409#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004410 PyThread_release_lock(netdb_lock);
Guido van Rossum955becc1999-03-22 20:14:53 +00004411#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004412finally:
4413 PyMem_Free(name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004414 return ret;
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004415}
4416
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004417PyDoc_STRVAR(ghbn_ex_doc,
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004418"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\
4419\n\
4420Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004421for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum7d896ab1998-08-04 22:16:43 +00004422
4423
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004424/* Python interface to gethostbyaddr(IP). */
4425
4426/*ARGSUSED*/
4427static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004428socket_gethostbyaddr(PyObject *self, PyObject *args)
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004429{
Charles-François Natali8b759652011-12-23 16:44:51 +01004430 sock_addr_t addr;
4431 struct sockaddr *sa = SAS2SA(&addr);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004432 char *ip_num;
4433 struct hostent *h;
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004434 PyObject *ret = NULL;
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004435#ifdef HAVE_GETHOSTBYNAME_R
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004436 struct hostent hp_allocated;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004437#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004438 struct hostent_data data;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004439#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004440 /* glibcs up to 2.10 assume that the buf argument to
4441 gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc
4442 does not ensure. The attribute below instructs the compiler
4443 to maintain this alignment. */
4444 char buf[16384] Py_ALIGNED(8);
4445 int buf_len = (sizeof buf) - 1;
4446 int errnop;
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004447#endif
Ross Lagerwall8c159762012-03-06 21:36:18 +02004448#ifdef HAVE_GETHOSTBYNAME_R_3_ARG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004449 int result;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004450#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004451#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004452 char *ap;
4453 int al;
4454 int af;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004455
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004456 if (!PyArg_ParseTuple(args, "et:gethostbyaddr", "idna", &ip_num))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004457 return NULL;
4458 af = AF_UNSPEC;
4459 if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004460 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004461 af = sa->sa_family;
4462 ap = NULL;
Brett Cannonb94767f2011-02-22 20:15:44 +00004463 /* al = 0; */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004464 switch (af) {
4465 case AF_INET:
4466 ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;
4467 al = sizeof(((struct sockaddr_in *)sa)->sin_addr);
4468 break;
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00004469#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004470 case AF_INET6:
4471 ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;
4472 al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);
4473 break;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00004474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004475 default:
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004476 PyErr_SetString(PyExc_OSError, "unsupported address family");
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004477 goto finally;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004478 }
4479 Py_BEGIN_ALLOW_THREADS
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004480#ifdef HAVE_GETHOSTBYNAME_R
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004481#if defined(HAVE_GETHOSTBYNAME_R_6_ARG)
Ross Lagerwall8c159762012-03-06 21:36:18 +02004482 gethostbyaddr_r(ap, al, af,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004483 &hp_allocated, buf, buf_len,
4484 &h, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004485#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004486 h = gethostbyaddr_r(ap, al, af,
4487 &hp_allocated, buf, buf_len, &errnop);
Guido van Rossum7b6c71f1999-03-24 17:20:40 +00004488#else /* HAVE_GETHOSTBYNAME_R_3_ARG */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004489 memset((void *) &data, '\0', sizeof(data));
4490 result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);
4491 h = (result != 0) ? NULL : &hp_allocated;
Guido van Rossume9cd07b1999-03-15 21:40:14 +00004492#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004493#else /* not HAVE_GETHOSTBYNAME_R */
Guido van Rossum3baaa131999-03-22 21:44:51 +00004494#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004495 PyThread_acquire_lock(netdb_lock, 1);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004496#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 h = gethostbyaddr(ap, al, af);
Guido van Rossum4f199ea1998-04-09 20:56:35 +00004498#endif /* HAVE_GETHOSTBYNAME_R */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 Py_END_ALLOW_THREADS
Charles-François Natali8b759652011-12-23 16:44:51 +01004500 ret = gethost_common(h, SAS2SA(&addr), sizeof(addr), af);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004501#ifdef USE_GETHOSTBYNAME_LOCK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004502 PyThread_release_lock(netdb_lock);
Guido van Rossum3baaa131999-03-22 21:44:51 +00004503#endif
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00004504finally:
4505 PyMem_Free(ip_num);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004506 return ret;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +00004507}
4508
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004509PyDoc_STRVAR(gethostbyaddr_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004510"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\
4511\n\
4512Return the true host name, a list of aliases, and a list of IP addresses,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004513for a host. The host argument is a string giving a host name or IP number.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004514
Guido van Rossum30a685f1991-06-27 15:51:29 +00004515
4516/* Python interface to getservbyname(name).
4517 This only returns the port number, since the other info is already
4518 known or not useful (like the list of aliases). */
4519
4520/*ARGSUSED*/
Guido van Rossum73624e91994-10-10 17:59:00 +00004521static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004522socket_getservbyname(PyObject *self, PyObject *args)
Guido van Rossum30a685f1991-06-27 15:51:29 +00004523{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 char *name, *proto=NULL;
4525 struct servent *sp;
4526 if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))
4527 return NULL;
4528 Py_BEGIN_ALLOW_THREADS
4529 sp = getservbyname(name, proto);
4530 Py_END_ALLOW_THREADS
4531 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004532 PyErr_SetString(PyExc_OSError, "service/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 return NULL;
4534 }
4535 return PyLong_FromLong((long) ntohs(sp->s_port));
Guido van Rossum30a685f1991-06-27 15:51:29 +00004536}
4537
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004538PyDoc_STRVAR(getservbyname_doc,
Barry Warsaw11b91a02004-06-28 00:50:43 +00004539"getservbyname(servicename[, protocolname]) -> integer\n\
Guido van Rossum82a5c661998-07-07 20:45:43 +00004540\n\
4541Return a port number from a service name and protocol name.\n\
Barry Warsaw11b91a02004-06-28 00:50:43 +00004542The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4543otherwise any protocol will match.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004544
Guido van Rossum30a685f1991-06-27 15:51:29 +00004545
Barry Warsaw11b91a02004-06-28 00:50:43 +00004546/* Python interface to getservbyport(port).
4547 This only returns the service name, since the other info is already
4548 known or not useful (like the list of aliases). */
4549
4550/*ARGSUSED*/
4551static PyObject *
4552socket_getservbyport(PyObject *self, PyObject *args)
4553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 int port;
4555 char *proto=NULL;
4556 struct servent *sp;
4557 if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))
4558 return NULL;
4559 if (port < 0 || port > 0xffff) {
4560 PyErr_SetString(
4561 PyExc_OverflowError,
4562 "getservbyport: port must be 0-65535.");
4563 return NULL;
4564 }
4565 Py_BEGIN_ALLOW_THREADS
4566 sp = getservbyport(htons((short)port), proto);
4567 Py_END_ALLOW_THREADS
4568 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004569 PyErr_SetString(PyExc_OSError, "port/proto not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 return NULL;
4571 }
4572 return PyUnicode_FromString(sp->s_name);
Barry Warsaw11b91a02004-06-28 00:50:43 +00004573}
4574
4575PyDoc_STRVAR(getservbyport_doc,
4576"getservbyport(port[, protocolname]) -> string\n\
4577\n\
4578Return the service name from a port number and protocol name.\n\
4579The optional protocol name, if given, should be 'tcp' or 'udp',\n\
4580otherwise any protocol will match.");
4581
Guido van Rossum3901d851996-12-19 16:35:04 +00004582/* Python interface to getprotobyname(name).
4583 This only returns the protocol number, since the other info is
4584 already known or not useful (like the list of aliases). */
4585
4586/*ARGSUSED*/
4587static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004588socket_getprotobyname(PyObject *self, PyObject *args)
Guido van Rossum3901d851996-12-19 16:35:04 +00004589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004590 char *name;
4591 struct protoent *sp;
4592 if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))
4593 return NULL;
4594 Py_BEGIN_ALLOW_THREADS
4595 sp = getprotobyname(name);
4596 Py_END_ALLOW_THREADS
4597 if (sp == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004598 PyErr_SetString(PyExc_OSError, "protocol not found");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004599 return NULL;
4600 }
4601 return PyLong_FromLong((long) sp->p_proto);
Guido van Rossum3901d851996-12-19 16:35:04 +00004602}
4603
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004604PyDoc_STRVAR(getprotobyname_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004605"getprotobyname(name) -> integer\n\
4606\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004607Return the protocol number for the named protocol. (Rarely used.)");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004608
Guido van Rossum3901d851996-12-19 16:35:04 +00004609
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004610#ifndef NO_DUP
4611/* dup() function for socket fds */
4612
4613static PyObject *
4614socket_dup(PyObject *self, PyObject *fdobj)
4615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004616 SOCKET_T fd, newfd;
4617 PyObject *newfdobj;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004618#ifdef MS_WINDOWS
4619 WSAPROTOCOL_INFO info;
4620#endif
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004622 fd = PyLong_AsSocket_t(fdobj);
4623 if (fd == (SOCKET_T)(-1) && PyErr_Occurred())
4624 return NULL;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004625
Victor Stinnerdaf45552013-08-28 00:53:59 +02004626#ifdef MS_WINDOWS
4627 if (WSADuplicateSocket(fd, GetCurrentProcessId(), &info))
4628 return set_error();
4629
4630 newfd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,
4631 FROM_PROTOCOL_INFO,
4632 &info, 0, WSA_FLAG_OVERLAPPED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004633 if (newfd == INVALID_SOCKET)
4634 return set_error();
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004635
Victor Stinnerdaf45552013-08-28 00:53:59 +02004636 if (!SetHandleInformation((HANDLE)newfd, HANDLE_FLAG_INHERIT, 0)) {
4637 closesocket(newfd);
4638 PyErr_SetFromWindowsErr(0);
4639 return NULL;
4640 }
4641#else
4642 /* On UNIX, dup can be used to duplicate the file descriptor of a socket */
4643 newfd = _Py_dup(fd);
4644 if (newfd == INVALID_SOCKET)
Victor Stinnere990c6e2013-11-16 00:18:58 +01004645 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004646#endif
4647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004648 newfdobj = PyLong_FromSocket_t(newfd);
4649 if (newfdobj == NULL)
4650 SOCKETCLOSE(newfd);
4651 return newfdobj;
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00004652}
4653
4654PyDoc_STRVAR(dup_doc,
4655"dup(integer) -> integer\n\
4656\n\
4657Duplicate an integer socket file descriptor. This is like os.dup(), but for\n\
4658sockets; on some platforms os.dup() won't work for socket file descriptors.");
4659#endif
4660
4661
Dave Cole331708b2004-08-09 04:51:41 +00004662#ifdef HAVE_SOCKETPAIR
4663/* Create a pair of sockets using the socketpair() function.
Dave Cole07fda7e2004-08-23 05:16:23 +00004664 Arguments as for socket() except the default family is AF_UNIX if
Dave Colee8bbfe42004-08-26 00:51:16 +00004665 defined on the platform; otherwise, the default is AF_INET. */
Dave Cole331708b2004-08-09 04:51:41 +00004666
4667/*ARGSUSED*/
4668static PyObject *
4669socket_socketpair(PyObject *self, PyObject *args)
4670{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004671 PySocketSockObject *s0 = NULL, *s1 = NULL;
4672 SOCKET_T sv[2];
4673 int family, type = SOCK_STREAM, proto = 0;
4674 PyObject *res = NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004675#ifdef SOCK_CLOEXEC
4676 int *atomic_flag_works = &sock_cloexec_works;
4677#else
4678 int *atomic_flag_works = NULL;
4679#endif
4680 int ret;
Dave Cole331708b2004-08-09 04:51:41 +00004681
4682#if defined(AF_UNIX)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004683 family = AF_UNIX;
Dave Cole331708b2004-08-09 04:51:41 +00004684#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 family = AF_INET;
Dave Cole331708b2004-08-09 04:51:41 +00004686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004687 if (!PyArg_ParseTuple(args, "|iii:socketpair",
4688 &family, &type, &proto))
4689 return NULL;
Victor Stinnerdaf45552013-08-28 00:53:59 +02004690
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004691 /* Create a pair of socket fds */
Victor Stinnerdaf45552013-08-28 00:53:59 +02004692 Py_BEGIN_ALLOW_THREADS
4693#ifdef SOCK_CLOEXEC
4694 if (sock_cloexec_works != 0) {
4695 ret = socketpair(family, type | SOCK_CLOEXEC, proto, sv);
4696 if (sock_cloexec_works == -1) {
4697 if (ret >= 0) {
4698 sock_cloexec_works = 1;
4699 }
4700 else if (errno == EINVAL) {
4701 /* Linux older than 2.6.27 does not support SOCK_CLOEXEC */
4702 sock_cloexec_works = 0;
4703 ret = socketpair(family, type, proto, sv);
4704 }
4705 }
4706 }
4707 else
4708#endif
4709 {
4710 ret = socketpair(family, type, proto, sv);
4711 }
4712 Py_END_ALLOW_THREADS
4713
4714 if (ret < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004715 return set_error();
Victor Stinnerdaf45552013-08-28 00:53:59 +02004716
4717 if (_Py_set_inheritable(sv[0], 0, atomic_flag_works) < 0)
4718 goto finally;
4719 if (_Py_set_inheritable(sv[1], 0, atomic_flag_works) < 0)
4720 goto finally;
4721
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004722 s0 = new_sockobject(sv[0], family, type, proto);
4723 if (s0 == NULL)
4724 goto finally;
4725 s1 = new_sockobject(sv[1], family, type, proto);
4726 if (s1 == NULL)
4727 goto finally;
4728 res = PyTuple_Pack(2, s0, s1);
Dave Cole331708b2004-08-09 04:51:41 +00004729
4730finally:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004731 if (res == NULL) {
4732 if (s0 == NULL)
4733 SOCKETCLOSE(sv[0]);
4734 if (s1 == NULL)
4735 SOCKETCLOSE(sv[1]);
4736 }
4737 Py_XDECREF(s0);
4738 Py_XDECREF(s1);
4739 return res;
Dave Cole331708b2004-08-09 04:51:41 +00004740}
4741
4742PyDoc_STRVAR(socketpair_doc,
Victor Stinnerdaf45552013-08-28 00:53:59 +02004743"socketpair([family[, type [, proto]]]) -> (socket object, socket object)\n\
Dave Cole331708b2004-08-09 04:51:41 +00004744\n\
4745Create a pair of socket objects from the sockets returned by the platform\n\
4746socketpair() function.\n\
Dave Cole07fda7e2004-08-23 05:16:23 +00004747The arguments are the same as for socket() except the default family is\n\
Dave Colee8bbfe42004-08-26 00:51:16 +00004748AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");
Dave Cole331708b2004-08-09 04:51:41 +00004749
4750#endif /* HAVE_SOCKETPAIR */
4751
4752
Guido van Rossum006bf911996-06-12 04:04:55 +00004753static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004754socket_ntohs(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004755{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004758 if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {
4759 return NULL;
4760 }
4761 if (x1 < 0) {
4762 PyErr_SetString(PyExc_OverflowError,
4763 "can't convert negative number to unsigned long");
4764 return NULL;
4765 }
4766 x2 = (unsigned int)ntohs((unsigned short)x1);
4767 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004768}
4769
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004770PyDoc_STRVAR(ntohs_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004771"ntohs(integer) -> integer\n\
4772\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004773Convert a 16-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004774
4775
Guido van Rossum006bf911996-06-12 04:04:55 +00004776static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004777socket_ntohl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004778{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004779 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004780
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004781 if (PyLong_Check(arg)) {
4782 x = PyLong_AsUnsignedLong(arg);
4783 if (x == (unsigned long) -1 && PyErr_Occurred())
4784 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004785#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004786 {
4787 unsigned long y;
4788 /* only want the trailing 32 bits */
4789 y = x & 0xFFFFFFFFUL;
4790 if (y ^ x)
4791 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004792 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004793 x = y;
4794 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004795#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004796 }
4797 else
4798 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004799 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004800 Py_TYPE(arg)->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004801 return PyLong_FromUnsignedLong(ntohl(x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004802}
4803
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004804PyDoc_STRVAR(ntohl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004805"ntohl(integer) -> integer\n\
4806\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004807Convert a 32-bit integer from network to host byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004808
4809
Guido van Rossum006bf911996-06-12 04:04:55 +00004810static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004811socket_htons(PyObject *self, PyObject *args)
Guido van Rossum006bf911996-06-12 04:04:55 +00004812{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004813 int x1, x2;
Guido van Rossum006bf911996-06-12 04:04:55 +00004814
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004815 if (!PyArg_ParseTuple(args, "i:htons", &x1)) {
4816 return NULL;
4817 }
4818 if (x1 < 0) {
4819 PyErr_SetString(PyExc_OverflowError,
4820 "can't convert negative number to unsigned long");
4821 return NULL;
4822 }
4823 x2 = (unsigned int)htons((unsigned short)x1);
4824 return PyLong_FromLong(x2);
Guido van Rossum006bf911996-06-12 04:04:55 +00004825}
4826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004827PyDoc_STRVAR(htons_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004828"htons(integer) -> integer\n\
4829\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004830Convert a 16-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004831
4832
Guido van Rossum006bf911996-06-12 04:04:55 +00004833static PyObject *
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004834socket_htonl(PyObject *self, PyObject *arg)
Guido van Rossum006bf911996-06-12 04:04:55 +00004835{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004836 unsigned long x;
Guido van Rossum006bf911996-06-12 04:04:55 +00004837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004838 if (PyLong_Check(arg)) {
4839 x = PyLong_AsUnsignedLong(arg);
4840 if (x == (unsigned long) -1 && PyErr_Occurred())
4841 return NULL;
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004842#if SIZEOF_LONG > 4
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004843 {
4844 unsigned long y;
4845 /* only want the trailing 32 bits */
4846 y = x & 0xFFFFFFFFUL;
4847 if (y ^ x)
4848 return PyErr_Format(PyExc_OverflowError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004849 "int larger than 32 bits");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850 x = y;
4851 }
Jeremy Hyltonc075e192002-07-25 16:01:12 +00004852#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004853 }
4854 else
4855 return PyErr_Format(PyExc_TypeError,
Serhiy Storchaka95949422013-08-27 19:40:23 +03004856 "expected int, %s found",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004857 Py_TYPE(arg)->tp_name);
4858 return PyLong_FromUnsignedLong(htonl((unsigned long)x));
Guido van Rossum006bf911996-06-12 04:04:55 +00004859}
4860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004861PyDoc_STRVAR(htonl_doc,
Guido van Rossum82a5c661998-07-07 20:45:43 +00004862"htonl(integer) -> integer\n\
4863\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004864Convert a 32-bit integer from host to network byte order.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00004865
Guido van Rossum3eede5a2002-06-07 02:08:35 +00004866/* socket.inet_aton() and socket.inet_ntoa() functions. */
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004867
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004868PyDoc_STRVAR(inet_aton_doc,
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004869"inet_aton(string) -> bytes giving packed 32-bit IP representation\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004870\n\
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004871Convert 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 +00004872binary format used in low-level network functions.");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004873
4874static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004875socket_inet_aton(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004876{
Neal Norwitz88f115b2003-02-13 02:15:42 +00004877#ifdef HAVE_INET_ATON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004878 struct in_addr buf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00004879#endif
4880
4881#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
Benjamin Petersonf91df042009-02-13 02:50:59 +00004882#if (SIZEOF_INT != 4)
4883#error "Not sure if in_addr_t exists and int is not 32-bits."
4884#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004885 /* Have to use inet_addr() instead */
4886 unsigned int packed_addr;
Tim Peters1df9fdd2003-02-13 03:13:40 +00004887#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004888 char *ip_addr;
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))
4891 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004892
Tim Peters1df9fdd2003-02-13 03:13:40 +00004893
4894#ifdef HAVE_INET_ATON
Thomas Wouters477c8d52006-05-27 19:21:47 +00004895
4896#ifdef USE_INET_ATON_WEAKLINK
4897 if (inet_aton != NULL) {
4898#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004899 if (inet_aton(ip_addr, &buf))
4900 return PyBytes_FromStringAndSize((char *)(&buf),
4901 sizeof(buf));
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004902
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004903 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004904 "illegal IP address string passed to inet_aton");
4905 return NULL;
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004906
Thomas Wouters477c8d52006-05-27 19:21:47 +00004907#ifdef USE_INET_ATON_WEAKLINK
4908 } else {
4909#endif
4910
4911#endif
4912
4913#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)
4914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 /* special-case this address as inet_addr might return INADDR_NONE
4916 * for this */
4917 if (strcmp(ip_addr, "255.255.255.255") == 0) {
Charles-François Natali24aa0412013-08-31 14:48:25 +02004918 packed_addr = INADDR_BROADCAST;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004919 } else {
Thomas Wouters477c8d52006-05-27 19:21:47 +00004920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004921 packed_addr = inet_addr(ip_addr);
Guido van Rossumc6a164b1999-08-20 19:11:27 +00004922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 if (packed_addr == INADDR_NONE) { /* invalid address */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004924 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004925 "illegal IP address string passed to inet_aton");
4926 return NULL;
4927 }
4928 }
4929 return PyBytes_FromStringAndSize((char *) &packed_addr,
4930 sizeof(packed_addr));
Thomas Wouters477c8d52006-05-27 19:21:47 +00004931
4932#ifdef USE_INET_ATON_WEAKLINK
4933 }
4934#endif
4935
Guido van Rossumad05cdf2003-02-12 23:08:22 +00004936#endif
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004937}
4938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004939PyDoc_STRVAR(inet_ntoa_doc,
Fred Drakee0661342000-03-07 14:05:16 +00004940"inet_ntoa(packed_ip) -> ip_address_string\n\
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004941\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004942Convert an IP address from 32-bit packed binary format to string format");
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004943
4944static PyObject*
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00004945socket_inet_ntoa(PyObject *self, PyObject *args)
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 char *packed_str;
4948 int addr_len;
4949 struct in_addr packed_addr;
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004950
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004951 if (!PyArg_ParseTuple(args, "y#:inet_ntoa", &packed_str, &addr_len)) {
4952 return NULL;
4953 }
Guido van Rossum48a680c2001-03-02 06:34:14 +00004954
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004955 if (addr_len != sizeof(packed_addr)) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004956 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 "packed IP wrong length for inet_ntoa");
4958 return NULL;
4959 }
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 memcpy(&packed_addr, packed_str, addr_len);
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 return PyUnicode_FromString(inet_ntoa(packed_addr));
Guido van Rossum5c9eb211999-08-20 18:21:51 +00004964}
Guido van Rossum82a5c661998-07-07 20:45:43 +00004965
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004966#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004967
4968PyDoc_STRVAR(inet_pton_doc,
4969"inet_pton(af, ip) -> packed IP address string\n\
4970\n\
4971Convert an IP address from string format to a packed string suitable\n\
4972for use with low-level network functions.");
4973
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09004974#endif
4975
4976#ifdef HAVE_INET_PTON
4977
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004978static PyObject *
4979socket_inet_pton(PyObject *self, PyObject *args)
4980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 int af;
4982 char* ip;
4983 int retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004984#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02004985 char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004986#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004987 char packed[sizeof(struct in_addr)];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00004988#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
4990 return NULL;
4991 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00004992
Martin v. Löwis04697e82004-06-02 12:35:29 +00004993#if !defined(ENABLE_IPV6) && defined(AF_INET6)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004994 if(af == AF_INET6) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02004995 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004996 "can't use AF_INET6, IPv6 is disabled");
4997 return NULL;
4998 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00004999#endif
Martin v. Löwis10649092003-08-05 06:25:06 +00005000
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005001 retval = inet_pton(af, ip, packed);
5002 if (retval < 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005003 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005004 return NULL;
5005 } else if (retval == 0) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005006 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 "illegal IP address string passed to inet_pton");
5008 return NULL;
5009 } else if (af == AF_INET) {
5010 return PyBytes_FromStringAndSize(packed,
5011 sizeof(struct in_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005012#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005013 } else if (af == AF_INET6) {
5014 return PyBytes_FromStringAndSize(packed,
5015 sizeof(struct in6_addr));
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005016#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005017 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005018 PyErr_SetString(PyExc_OSError, "unknown address family");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005019 return NULL;
5020 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005021}
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005022#elif defined(MS_WINDOWS)
5023
5024static PyObject *
5025socket_inet_pton(PyObject *self, PyObject *args)
5026{
5027 int af;
5028 char* ip;
5029 struct sockaddr_in6 addr;
5030 INT ret, size;
5031
5032 if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {
5033 return NULL;
5034 }
5035
Victor Stinnere990c6e2013-11-16 00:18:58 +01005036 size = sizeof(addr);
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005037 ret = WSAStringToAddressA(ip, af, NULL, (LPSOCKADDR)&addr, &size);
5038
5039 if (ret) {
5040 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5041 return NULL;
5042 } else if(af == AF_INET) {
5043 struct sockaddr_in *addr4 = (struct sockaddr_in*)&addr;
Victor Stinnere990c6e2013-11-16 00:18:58 +01005044 return PyBytes_FromStringAndSize((const char *)&(addr4->sin_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005045 sizeof(addr4->sin_addr));
5046 } else if (af == AF_INET6) {
Victor Stinnere990c6e2013-11-16 00:18:58 +01005047 return PyBytes_FromStringAndSize((const char *)&(addr.sin6_addr),
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005048 sizeof(addr.sin6_addr));
5049 } else {
5050 PyErr_SetString(PyExc_OSError, "unknown address family");
5051 return NULL;
5052 }
5053}
5054
5055#endif
5056
5057#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Thomas Wouters477c8d52006-05-27 19:21:47 +00005058
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005059PyDoc_STRVAR(inet_ntop_doc,
5060"inet_ntop(af, packed_ip) -> string formatted IP address\n\
5061\n\
5062Convert a packed IP address of the given family to string format.");
5063
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005064#endif
5065
5066
5067#ifdef HAVE_INET_PTON
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005068static PyObject *
5069socket_inet_ntop(PyObject *self, PyObject *args)
5070{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005071 int af;
5072 char* packed;
5073 int len;
5074 const char* retval;
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005075#ifdef ENABLE_IPV6
Victor Stinner640c35c2013-06-04 23:14:37 +02005076 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005077#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005078 char ip[INET_ADDRSTRLEN + 1];
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005079#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00005080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005081 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5082 memset((void *) &ip[0], '\0', sizeof(ip));
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005084 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5085 return NULL;
5086 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005088 if (af == AF_INET) {
5089 if (len != sizeof(struct in_addr)) {
5090 PyErr_SetString(PyExc_ValueError,
5091 "invalid length of packed IP address string");
5092 return NULL;
5093 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005094#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 } else if (af == AF_INET6) {
5096 if (len != sizeof(struct in6_addr)) {
5097 PyErr_SetString(PyExc_ValueError,
5098 "invalid length of packed IP address string");
5099 return NULL;
5100 }
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005101#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005102 } else {
5103 PyErr_Format(PyExc_ValueError,
5104 "unknown address family %d", af);
5105 return NULL;
5106 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005108 retval = inet_ntop(af, packed, ip, sizeof(ip));
5109 if (!retval) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005110 PyErr_SetFromErrno(PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005111 return NULL;
5112 } else {
5113 return PyUnicode_FromString(retval);
5114 }
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005115
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005116 /* NOTREACHED */
5117 PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");
5118 return NULL;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005119}
5120
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005121#elif defined(MS_WINDOWS)
5122
5123static PyObject *
5124socket_inet_ntop(PyObject *self, PyObject *args)
5125{
5126 int af;
5127 char* packed;
5128 int len;
5129 struct sockaddr_in6 addr;
5130 DWORD addrlen, ret, retlen;
Jason R. Coombs8ec784c2013-11-10 13:43:22 -05005131#ifdef ENABLE_IPV6
5132 char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
5133#else
5134 char ip[INET_ADDRSTRLEN + 1];
5135#endif
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005136
5137 /* Guarantee NUL-termination for PyUnicode_FromString() below */
5138 memset((void *) &ip[0], '\0', sizeof(ip));
5139
5140 if (!PyArg_ParseTuple(args, "iy#:inet_ntop", &af, &packed, &len)) {
5141 return NULL;
5142 }
5143
5144 if (af == AF_INET) {
5145 struct sockaddr_in * addr4 = (struct sockaddr_in *)&addr;
5146
5147 if (len != sizeof(struct in_addr)) {
5148 PyErr_SetString(PyExc_ValueError,
5149 "invalid length of packed IP address string");
5150 return NULL;
5151 }
5152 memset(addr4, 0, sizeof(struct sockaddr_in));
5153 addr4->sin_family = AF_INET;
5154 memcpy(&(addr4->sin_addr), packed, sizeof(addr4->sin_addr));
5155 addrlen = sizeof(struct sockaddr_in);
5156 } else if (af == AF_INET6) {
5157 if (len != sizeof(struct in6_addr)) {
5158 PyErr_SetString(PyExc_ValueError,
5159 "invalid length of packed IP address string");
5160 return NULL;
5161 }
5162
5163 memset(&addr, 0, sizeof(addr));
5164 addr.sin6_family = AF_INET6;
5165 memcpy(&(addr.sin6_addr), packed, sizeof(addr.sin6_addr));
5166 addrlen = sizeof(addr);
5167 } else {
5168 PyErr_Format(PyExc_ValueError,
5169 "unknown address family %d", af);
5170 return NULL;
5171 }
5172
5173 retlen = sizeof(ip);
Victor Stinnere990c6e2013-11-16 00:18:58 +01005174 ret = WSAAddressToStringA((struct sockaddr*)&addr, addrlen, NULL,
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005175 ip, &retlen);
5176
5177 if (ret) {
5178 PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError());
5179 return NULL;
5180 } else {
5181 return PyUnicode_FromString(ip);
5182 }
5183}
5184
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005185#endif /* HAVE_INET_PTON */
5186
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005187/* Python interface to getaddrinfo(host, port). */
5188
5189/*ARGSUSED*/
5190static PyObject *
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005191socket_getaddrinfo(PyObject *self, PyObject *args, PyObject* kwargs)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005192{
Victor Stinner77af1722011-05-26 14:05:59 +02005193 static char* kwnames[] = {"host", "port", "family", "type", "proto",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005194 "flags", 0};
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005195 struct addrinfo hints, *res;
5196 struct addrinfo *res0 = NULL;
5197 PyObject *hobj = NULL;
5198 PyObject *pobj = (PyObject *)NULL;
5199 char pbuf[30];
5200 char *hptr, *pptr;
5201 int family, socktype, protocol, flags;
5202 int error;
5203 PyObject *all = (PyObject *)NULL;
5204 PyObject *idna = NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005205
Georg Brandl6083a4b2013-10-14 06:51:46 +02005206 socktype = protocol = flags = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005207 family = AF_UNSPEC;
Victor Stinner77af1722011-05-26 14:05:59 +02005208 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|iiii:getaddrinfo",
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005209 kwnames, &hobj, &pobj, &family, &socktype,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005210 &protocol, &flags)) {
5211 return NULL;
5212 }
5213 if (hobj == Py_None) {
5214 hptr = NULL;
5215 } else if (PyUnicode_Check(hobj)) {
Victor Stinnerec1a4982015-09-11 12:37:30 +02005216 idna = PyUnicode_AsEncodedString(hobj, "idna", NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 if (!idna)
5218 return NULL;
5219 assert(PyBytes_Check(idna));
5220 hptr = PyBytes_AS_STRING(idna);
5221 } else if (PyBytes_Check(hobj)) {
5222 hptr = PyBytes_AsString(hobj);
5223 } else {
5224 PyErr_SetString(PyExc_TypeError,
5225 "getaddrinfo() argument 1 must be string or None");
5226 return NULL;
5227 }
5228 if (PyLong_CheckExact(pobj)) {
5229 long value = PyLong_AsLong(pobj);
5230 if (value == -1 && PyErr_Occurred())
5231 goto err;
5232 PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);
5233 pptr = pbuf;
5234 } else if (PyUnicode_Check(pobj)) {
5235 pptr = _PyUnicode_AsString(pobj);
Alexander Belopolskye239d232010-12-08 23:31:48 +00005236 if (pptr == NULL)
5237 goto err;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005238 } else if (PyBytes_Check(pobj)) {
Alexander Belopolskye239d232010-12-08 23:31:48 +00005239 pptr = PyBytes_AS_STRING(pobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005240 } else if (pobj == Py_None) {
5241 pptr = (char *)NULL;
5242 } else {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005243 PyErr_SetString(PyExc_OSError, "Int or String expected");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005244 goto err;
5245 }
Ronald Oussorena822d3662013-06-10 10:36:28 +02005246#if defined(__APPLE__) && defined(AI_NUMERICSERV)
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005247 if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {
5248 /* On OSX upto at least OSX 10.8 getaddrinfo crashes
Christian Heimesaf01f662013-12-21 16:19:10 +01005249 * if AI_NUMERICSERV is set and the servname is NULL or "0".
5250 * This workaround avoids a segfault in libsystem.
5251 */
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02005252 pptr = "00";
5253 }
5254#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 memset(&hints, 0, sizeof(hints));
5256 hints.ai_family = family;
5257 hints.ai_socktype = socktype;
5258 hints.ai_protocol = protocol;
5259 hints.ai_flags = flags;
5260 Py_BEGIN_ALLOW_THREADS
5261 ACQUIRE_GETADDRINFO_LOCK
5262 error = getaddrinfo(hptr, pptr, &hints, &res0);
5263 Py_END_ALLOW_THREADS
5264 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5265 if (error) {
5266 set_gaierror(error);
5267 goto err;
5268 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005269
Benjamin Peterson4fd929b2015-04-01 11:16:40 -04005270 all = PyList_New(0);
5271 if (all == NULL)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005272 goto err;
5273 for (res = res0; res; res = res->ai_next) {
5274 PyObject *single;
5275 PyObject *addr =
5276 makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);
5277 if (addr == NULL)
5278 goto err;
5279 single = Py_BuildValue("iiisO", res->ai_family,
5280 res->ai_socktype, res->ai_protocol,
5281 res->ai_canonname ? res->ai_canonname : "",
5282 addr);
5283 Py_DECREF(addr);
5284 if (single == NULL)
5285 goto err;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005287 if (PyList_Append(all, single))
5288 goto err;
5289 Py_XDECREF(single);
5290 }
5291 Py_XDECREF(idna);
5292 if (res0)
5293 freeaddrinfo(res0);
5294 return all;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005295 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005296 Py_XDECREF(all);
5297 Py_XDECREF(idna);
5298 if (res0)
5299 freeaddrinfo(res0);
5300 return (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005301}
5302
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005303PyDoc_STRVAR(getaddrinfo_doc,
Berker Peksaga6ec5ee2014-06-30 11:28:40 +03005304"getaddrinfo(host, port [, family, type, proto, flags])\n\
5305 -> list of (family, type, proto, canonname, sockaddr)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005306\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005307Resolve host and port into addrinfo struct.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005308
5309/* Python interface to getnameinfo(sa, flags). */
5310
5311/*ARGSUSED*/
5312static PyObject *
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005313socket_getnameinfo(PyObject *self, PyObject *args)
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005314{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005315 PyObject *sa = (PyObject *)NULL;
5316 int flags;
5317 char *hostp;
Charles-François Natali366999a2012-01-02 15:47:29 +01005318 int port;
5319 unsigned int flowinfo, scope_id;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005320 char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];
5321 struct addrinfo hints, *res = NULL;
5322 int error;
5323 PyObject *ret = (PyObject *)NULL;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005325 flags = flowinfo = scope_id = 0;
5326 if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))
5327 return NULL;
5328 if (!PyTuple_Check(sa)) {
5329 PyErr_SetString(PyExc_TypeError,
5330 "getnameinfo() argument 1 must be a tuple");
5331 return NULL;
5332 }
Charles-François Natali366999a2012-01-02 15:47:29 +01005333 if (!PyArg_ParseTuple(sa, "si|II",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005334 &hostp, &port, &flowinfo, &scope_id))
5335 return NULL;
Charles-François Natali9b0c0062012-06-23 10:17:05 +02005336 if (flowinfo > 0xfffff) {
Charles-François Natali366999a2012-01-02 15:47:29 +01005337 PyErr_SetString(PyExc_OverflowError,
5338 "getsockaddrarg: flowinfo must be 0-1048575.");
5339 return NULL;
5340 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005341 PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);
5342 memset(&hints, 0, sizeof(hints));
5343 hints.ai_family = AF_UNSPEC;
5344 hints.ai_socktype = SOCK_DGRAM; /* make numeric port happy */
Martin v. Löwis112c0f32010-08-25 07:38:15 +00005345 hints.ai_flags = AI_NUMERICHOST; /* don't do any name resolution */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 Py_BEGIN_ALLOW_THREADS
5347 ACQUIRE_GETADDRINFO_LOCK
5348 error = getaddrinfo(hostp, pbuf, &hints, &res);
5349 Py_END_ALLOW_THREADS
5350 RELEASE_GETADDRINFO_LOCK /* see comment in setipaddr() */
5351 if (error) {
5352 set_gaierror(error);
5353 goto fail;
5354 }
5355 if (res->ai_next) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005356 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 "sockaddr resolved to multiple addresses");
5358 goto fail;
5359 }
5360 switch (res->ai_family) {
5361 case AF_INET:
5362 {
5363 if (PyTuple_GET_SIZE(sa) != 2) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005364 PyErr_SetString(PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005365 "IPv4 sockaddr must be 2 tuple");
5366 goto fail;
5367 }
5368 break;
5369 }
Martin v. Löwis44ddbde2001-12-02 10:15:37 +00005370#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005371 case AF_INET6:
5372 {
5373 struct sockaddr_in6 *sin6;
5374 sin6 = (struct sockaddr_in6 *)res->ai_addr;
Charles-François Natali366999a2012-01-02 15:47:29 +01005375 sin6->sin6_flowinfo = htonl(flowinfo);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005376 sin6->sin6_scope_id = scope_id;
5377 break;
5378 }
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005379#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005380 }
Antoine Pitrou19467d22010-08-17 19:33:30 +00005381 error = getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005382 hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);
5383 if (error) {
5384 set_gaierror(error);
5385 goto fail;
5386 }
5387 ret = Py_BuildValue("ss", hbuf, pbuf);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005388
5389fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005390 if (res)
5391 freeaddrinfo(res);
5392 return ret;
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005393}
5394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005395PyDoc_STRVAR(getnameinfo_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005396"getnameinfo(sockaddr, flags) --> (host, port)\n\
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005397\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005398Get host and port for a sockaddr.");
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005399
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005400
5401/* Python API to getting and setting the default timeout value. */
5402
5403static PyObject *
5404socket_getdefaulttimeout(PyObject *self)
5405{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005406 if (defaulttimeout < 0.0) {
5407 Py_INCREF(Py_None);
5408 return Py_None;
5409 }
5410 else
5411 return PyFloat_FromDouble(defaulttimeout);
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005412}
5413
5414PyDoc_STRVAR(getdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005415"getdefaulttimeout() -> timeout\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005416\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005417Returns the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005418A value of None indicates that new socket objects have no timeout.\n\
5419When the socket module is first imported, the default is None.");
5420
5421static PyObject *
5422socket_setdefaulttimeout(PyObject *self, PyObject *arg)
5423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005424 double timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005426 if (arg == Py_None)
5427 timeout = -1.0;
5428 else {
5429 timeout = PyFloat_AsDouble(arg);
5430 if (timeout < 0.0) {
5431 if (!PyErr_Occurred())
5432 PyErr_SetString(PyExc_ValueError,
5433 "Timeout value out of range");
5434 return NULL;
5435 }
5436 }
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005437
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005438 defaulttimeout = timeout;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005439
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005440 Py_INCREF(Py_None);
5441 return Py_None;
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005442}
5443
5444PyDoc_STRVAR(setdefaulttimeout_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005445"setdefaulttimeout(timeout)\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005446\n\
Ezio Melotti388c9452011-08-14 08:28:57 +03005447Set the default timeout in seconds (float) for new socket objects.\n\
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00005448A value of None indicates that new socket objects have no timeout.\n\
5449When the socket module is first imported, the default is None.");
5450
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005451#ifdef HAVE_IF_NAMEINDEX
5452/* Python API for getting interface indices and names */
5453
5454static PyObject *
5455socket_if_nameindex(PyObject *self, PyObject *arg)
5456{
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005457 PyObject *list;
Charles-François Natali60713592011-05-20 16:55:06 +02005458 int i;
5459 struct if_nameindex *ni;
Victor Stinner77af1722011-05-26 14:05:59 +02005460
Charles-François Natali60713592011-05-20 16:55:06 +02005461 ni = if_nameindex();
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005462 if (ni == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005463 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005464 return NULL;
5465 }
5466
5467 list = PyList_New(0);
5468 if (list == NULL) {
5469 if_freenameindex(ni);
5470 return NULL;
5471 }
5472
Charles-François Natali60713592011-05-20 16:55:06 +02005473 for (i = 0; ni[i].if_index != 0 && i < INT_MAX; i++) {
5474 PyObject *ni_tuple = Py_BuildValue("IO&",
5475 ni[i].if_index, PyUnicode_DecodeFSDefault, ni[i].if_name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005476
5477 if (ni_tuple == NULL || PyList_Append(list, ni_tuple) == -1) {
5478 Py_XDECREF(ni_tuple);
Charles-François Natali60713592011-05-20 16:55:06 +02005479 Py_DECREF(list);
5480 if_freenameindex(ni);
5481 return NULL;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005482 }
5483 Py_DECREF(ni_tuple);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005484 }
5485
5486 if_freenameindex(ni);
5487 return list;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005488}
5489
5490PyDoc_STRVAR(if_nameindex_doc,
5491"if_nameindex()\n\
5492\n\
5493Returns a list of network interface information (index, name) tuples.");
5494
Charles-François Natali60713592011-05-20 16:55:06 +02005495static PyObject *
5496socket_if_nametoindex(PyObject *self, PyObject *args)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005497{
Charles-François Natali60713592011-05-20 16:55:06 +02005498 PyObject *oname;
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005499 unsigned long index;
5500
Charles-François Natali60713592011-05-20 16:55:06 +02005501 if (!PyArg_ParseTuple(args, "O&:if_nametoindex",
5502 PyUnicode_FSConverter, &oname))
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005503 return NULL;
5504
Charles-François Natali60713592011-05-20 16:55:06 +02005505 index = if_nametoindex(PyBytes_AS_STRING(oname));
5506 Py_DECREF(oname);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005507 if (index == 0) {
Charles-François Natali60713592011-05-20 16:55:06 +02005508 /* if_nametoindex() doesn't set errno */
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005509 PyErr_SetString(PyExc_OSError, "no interface with this name");
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005510 return NULL;
5511 }
5512
5513 return PyLong_FromUnsignedLong(index);
5514}
5515
5516PyDoc_STRVAR(if_nametoindex_doc,
5517"if_nametoindex(if_name)\n\
5518\n\
5519Returns the interface index corresponding to the interface name if_name.");
5520
Charles-François Natali60713592011-05-20 16:55:06 +02005521static PyObject *
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005522socket_if_indextoname(PyObject *self, PyObject *arg)
5523{
Charles-François Natali60713592011-05-20 16:55:06 +02005524 unsigned long index;
5525 char name[IF_NAMESIZE + 1];
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005526
Charles-François Natali60713592011-05-20 16:55:06 +02005527 index = PyLong_AsUnsignedLong(arg);
5528 if (index == (unsigned long) -1)
5529 return NULL;
5530
5531 if (if_indextoname(index, name) == NULL) {
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005532 PyErr_SetFromErrno(PyExc_OSError);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005533 return NULL;
5534 }
5535
Charles-François Natali60713592011-05-20 16:55:06 +02005536 return PyUnicode_DecodeFSDefault(name);
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005537}
5538
5539PyDoc_STRVAR(if_indextoname_doc,
5540"if_indextoname(if_index)\n\
5541\n\
5542Returns the interface name corresponding to the interface index if_index.");
5543
5544#endif /* HAVE_IF_NAMEINDEX */
5545
5546
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005547#ifdef CMSG_LEN
5548/* Python interface to CMSG_LEN(length). */
5549
5550static PyObject *
5551socket_CMSG_LEN(PyObject *self, PyObject *args)
5552{
5553 Py_ssize_t length;
5554 size_t result;
5555
5556 if (!PyArg_ParseTuple(args, "n:CMSG_LEN", &length))
5557 return NULL;
5558 if (length < 0 || !get_CMSG_LEN(length, &result)) {
5559 PyErr_Format(PyExc_OverflowError, "CMSG_LEN() argument out of range");
5560 return NULL;
5561 }
5562 return PyLong_FromSize_t(result);
5563}
5564
5565PyDoc_STRVAR(CMSG_LEN_doc,
5566"CMSG_LEN(length) -> control message length\n\
5567\n\
5568Return the total length, without trailing padding, of an ancillary\n\
5569data item with associated data of the given length. This value can\n\
5570often be used as the buffer size for recvmsg() to receive a single\n\
5571item of ancillary data, but RFC 3542 requires portable applications to\n\
5572use CMSG_SPACE() and thus include space for padding, even when the\n\
5573item will be the last in the buffer. Raises OverflowError if length\n\
5574is outside the permissible range of values.");
5575
5576
5577#ifdef CMSG_SPACE
5578/* Python interface to CMSG_SPACE(length). */
5579
5580static PyObject *
5581socket_CMSG_SPACE(PyObject *self, PyObject *args)
5582{
5583 Py_ssize_t length;
5584 size_t result;
5585
5586 if (!PyArg_ParseTuple(args, "n:CMSG_SPACE", &length))
5587 return NULL;
5588 if (length < 0 || !get_CMSG_SPACE(length, &result)) {
5589 PyErr_SetString(PyExc_OverflowError,
5590 "CMSG_SPACE() argument out of range");
5591 return NULL;
5592 }
5593 return PyLong_FromSize_t(result);
5594}
5595
5596PyDoc_STRVAR(CMSG_SPACE_doc,
5597"CMSG_SPACE(length) -> buffer size\n\
5598\n\
5599Return the buffer size needed for recvmsg() to receive an ancillary\n\
5600data item with associated data of the given length, along with any\n\
5601trailing padding. The buffer space needed to receive multiple items\n\
5602is the sum of the CMSG_SPACE() values for their associated data\n\
5603lengths. Raises OverflowError if length is outside the permissible\n\
5604range of values.");
5605#endif /* CMSG_SPACE */
5606#endif /* CMSG_LEN */
5607
5608
Guido van Rossum30a685f1991-06-27 15:51:29 +00005609/* List of functions exported by this module. */
5610
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005611static PyMethodDef socket_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005612 {"gethostbyname", socket_gethostbyname,
5613 METH_VARARGS, gethostbyname_doc},
5614 {"gethostbyname_ex", socket_gethostbyname_ex,
5615 METH_VARARGS, ghbn_ex_doc},
5616 {"gethostbyaddr", socket_gethostbyaddr,
5617 METH_VARARGS, gethostbyaddr_doc},
5618 {"gethostname", socket_gethostname,
5619 METH_NOARGS, gethostname_doc},
Antoine Pitrou061cfb52011-02-28 22:25:22 +00005620#ifdef HAVE_SETHOSTNAME
5621 {"sethostname", socket_sethostname,
5622 METH_VARARGS, sethostname_doc},
5623#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005624 {"getservbyname", socket_getservbyname,
5625 METH_VARARGS, getservbyname_doc},
5626 {"getservbyport", socket_getservbyport,
5627 METH_VARARGS, getservbyport_doc},
5628 {"getprotobyname", socket_getprotobyname,
5629 METH_VARARGS, getprotobyname_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005630#ifndef NO_DUP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005631 {"dup", socket_dup,
5632 METH_O, dup_doc},
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005633#endif
Dave Cole331708b2004-08-09 04:51:41 +00005634#ifdef HAVE_SOCKETPAIR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005635 {"socketpair", socket_socketpair,
5636 METH_VARARGS, socketpair_doc},
Dave Cole331708b2004-08-09 04:51:41 +00005637#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005638 {"ntohs", socket_ntohs,
5639 METH_VARARGS, ntohs_doc},
5640 {"ntohl", socket_ntohl,
5641 METH_O, ntohl_doc},
5642 {"htons", socket_htons,
5643 METH_VARARGS, htons_doc},
5644 {"htonl", socket_htonl,
5645 METH_O, htonl_doc},
5646 {"inet_aton", socket_inet_aton,
5647 METH_VARARGS, inet_aton_doc},
5648 {"inet_ntoa", socket_inet_ntoa,
5649 METH_VARARGS, inet_ntoa_doc},
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09005650#if defined(HAVE_INET_PTON) || defined(MS_WINDOWS)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005651 {"inet_pton", socket_inet_pton,
5652 METH_VARARGS, inet_pton_doc},
5653 {"inet_ntop", socket_inet_ntop,
5654 METH_VARARGS, inet_ntop_doc},
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005655#endif
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00005656 {"getaddrinfo", (PyCFunction)socket_getaddrinfo,
5657 METH_VARARGS | METH_KEYWORDS, getaddrinfo_doc},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005658 {"getnameinfo", socket_getnameinfo,
5659 METH_VARARGS, getnameinfo_doc},
5660 {"getdefaulttimeout", (PyCFunction)socket_getdefaulttimeout,
5661 METH_NOARGS, getdefaulttimeout_doc},
5662 {"setdefaulttimeout", socket_setdefaulttimeout,
5663 METH_O, setdefaulttimeout_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005664#ifdef HAVE_IF_NAMEINDEX
5665 {"if_nameindex", socket_if_nameindex,
5666 METH_NOARGS, if_nameindex_doc},
5667 {"if_nametoindex", socket_if_nametoindex,
Charles-François Natali60713592011-05-20 16:55:06 +02005668 METH_VARARGS, if_nametoindex_doc},
Gregory P. Smith5ed2e772011-05-15 00:26:45 -07005669 {"if_indextoname", socket_if_indextoname,
5670 METH_O, if_indextoname_doc},
5671#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005672#ifdef CMSG_LEN
5673 {"CMSG_LEN", socket_CMSG_LEN,
5674 METH_VARARGS, CMSG_LEN_doc},
5675#ifdef CMSG_SPACE
5676 {"CMSG_SPACE", socket_CMSG_SPACE,
5677 METH_VARARGS, CMSG_SPACE_doc},
5678#endif
5679#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005680 {NULL, NULL} /* Sentinel */
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005681};
5682
Guido van Rossum30a685f1991-06-27 15:51:29 +00005683
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005684#ifdef MS_WINDOWS
5685#define OS_INIT_DEFINED
5686
5687/* Additional initialization and cleanup for Windows */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005688
5689static void
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005690os_cleanup(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005691{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005692 WSACleanup();
Guido van Rossumbe32c891996-06-20 16:25:29 +00005693}
5694
5695static int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005696os_init(void)
Guido van Rossumbe32c891996-06-20 16:25:29 +00005697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005698 WSADATA WSAData;
5699 int ret;
5700 ret = WSAStartup(0x0101, &WSAData);
5701 switch (ret) {
5702 case 0: /* No error */
5703 Py_AtExit(os_cleanup);
5704 return 1; /* Success */
5705 case WSASYSNOTREADY:
5706 PyErr_SetString(PyExc_ImportError,
5707 "WSAStartup failed: network not ready");
5708 break;
5709 case WSAVERNOTSUPPORTED:
5710 case WSAEINVAL:
5711 PyErr_SetString(
5712 PyExc_ImportError,
5713 "WSAStartup failed: requested version not supported");
5714 break;
5715 default:
5716 PyErr_Format(PyExc_ImportError, "WSAStartup failed: error code %d", ret);
5717 break;
5718 }
5719 return 0; /* Failure */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005720}
5721
Guido van Rossum8d665e61996-06-26 18:22:49 +00005722#endif /* MS_WINDOWS */
Guido van Rossumbe32c891996-06-20 16:25:29 +00005723
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005724
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005725
5726#ifndef OS_INIT_DEFINED
5727static int
5728os_init(void)
5729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 return 1; /* Success */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005731}
5732#endif
5733
5734
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005735/* C API table - always add new things to the end for binary
5736 compatibility. */
5737static
5738PySocketModule_APIObject PySocketModuleAPI =
5739{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005740 &sock_type,
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005741 NULL,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005742 NULL
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005743};
5744
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005745
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005746/* Initialize the _socket module.
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005747
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005748 This module is actually called "_socket", and there's a wrapper
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005749 "socket.py" which implements some additional functionality.
5750 The import of "_socket" may fail with an ImportError exception if
5751 os-specific initialization fails. On Windows, this does WINSOCK
Ezio Melotti13925002011-03-16 11:05:33 +02005752 initialization. When WINSOCK is initialized successfully, a call to
Guido van Rossum7d0a8262007-05-21 23:13:11 +00005753 WSACleanup() is scheduled to be made at exit time.
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005754*/
Guido van Rossum3eede5a2002-06-07 02:08:35 +00005755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005756PyDoc_STRVAR(socket_doc,
Guido van Rossum22a97152002-08-08 20:37:08 +00005757"Implementation module for socket operations.\n\
5758\n\
5759See the socket module for documentation.");
Guido van Rossum82a5c661998-07-07 20:45:43 +00005760
Martin v. Löwis1a214512008-06-11 05:26:20 +00005761static struct PyModuleDef socketmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005762 PyModuleDef_HEAD_INIT,
5763 PySocket_MODULE_NAME,
5764 socket_doc,
5765 -1,
5766 socket_methods,
5767 NULL,
5768 NULL,
5769 NULL,
5770 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00005771};
5772
Mark Hammondfe51c6d2002-08-02 02:27:13 +00005773PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00005774PyInit__socket(void)
Guido van Rossum6574b3e1991-06-25 21:36:08 +00005775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005776 PyObject *m, *has_ipv6;
Fred Drake4baedc12002-04-01 14:53:37 +00005777
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005778 if (!os_init())
5779 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005780
Victor Stinnerdaf45552013-08-28 00:53:59 +02005781#ifdef MS_WINDOWS
5782 if (support_wsa_no_inherit == -1) {
5783 DWORD version = GetVersion();
5784 DWORD major = (DWORD)LOBYTE(LOWORD(version));
5785 DWORD minor = (DWORD)HIBYTE(LOWORD(version));
5786 /* need Windows 7 SP1, 2008 R2 SP1 or later */
5787 support_wsa_no_inherit = (major >= 6 && minor >= 1);
5788 }
5789#endif
5790
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005791 Py_TYPE(&sock_type) = &PyType_Type;
5792 m = PyModule_Create(&socketmodule);
5793 if (m == NULL)
5794 return NULL;
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00005795
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005796 Py_INCREF(PyExc_OSError);
5797 PySocketModuleAPI.error = PyExc_OSError;
5798 Py_INCREF(PyExc_OSError);
5799 PyModule_AddObject(m, "error", PyExc_OSError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 socket_herror = PyErr_NewException("socket.herror",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005801 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005802 if (socket_herror == NULL)
5803 return NULL;
5804 Py_INCREF(socket_herror);
5805 PyModule_AddObject(m, "herror", socket_herror);
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005806 socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005807 NULL);
5808 if (socket_gaierror == NULL)
5809 return NULL;
5810 Py_INCREF(socket_gaierror);
5811 PyModule_AddObject(m, "gaierror", socket_gaierror);
5812 socket_timeout = PyErr_NewException("socket.timeout",
Antoine Pitrou6b4883d2011-10-12 02:54:14 +02005813 PyExc_OSError, NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005814 if (socket_timeout == NULL)
5815 return NULL;
Antoine Pitrouc4df7842010-12-03 19:59:41 +00005816 PySocketModuleAPI.timeout_error = socket_timeout;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005817 Py_INCREF(socket_timeout);
5818 PyModule_AddObject(m, "timeout", socket_timeout);
5819 Py_INCREF((PyObject *)&sock_type);
5820 if (PyModule_AddObject(m, "SocketType",
5821 (PyObject *)&sock_type) != 0)
5822 return NULL;
5823 Py_INCREF((PyObject *)&sock_type);
5824 if (PyModule_AddObject(m, "socket",
5825 (PyObject *)&sock_type) != 0)
5826 return NULL;
Guido van Rossum09be4091999-08-09 14:40:40 +00005827
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005828#ifdef ENABLE_IPV6
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005829 has_ipv6 = Py_True;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005830#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005831 has_ipv6 = Py_False;
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005832#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005833 Py_INCREF(has_ipv6);
5834 PyModule_AddObject(m, "has_ipv6", has_ipv6);
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00005835
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005836 /* Export C API */
5837 if (PyModule_AddObject(m, PySocket_CAPI_NAME,
5838 PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)
5839 ) != 0)
5840 return NULL;
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +00005841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005842 /* Address families (we only support AF_INET and AF_UNIX) */
Guido van Rossum09be4091999-08-09 14:40:40 +00005843#ifdef AF_UNSPEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005844 PyModule_AddIntMacro(m, AF_UNSPEC);
Guido van Rossum09be4091999-08-09 14:40:40 +00005845#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005846 PyModule_AddIntMacro(m, AF_INET);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005847#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005848 PyModule_AddIntMacro(m, AF_INET6);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00005849#endif /* AF_INET6 */
Andrew MacIntyred12dfbb2004-04-04 07:13:49 +00005850#if defined(AF_UNIX)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005851 PyModule_AddIntMacro(m, AF_UNIX);
Guido van Rossumb6775db1994-08-01 11:34:53 +00005852#endif /* AF_UNIX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005853#ifdef AF_AX25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005854 /* Amateur Radio AX.25 */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005855 PyModule_AddIntMacro(m, AF_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005856#endif
5857#ifdef AF_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005858 PyModule_AddIntMacro(m, AF_IPX); /* Novell IPX */
Guido van Rossum09be4091999-08-09 14:40:40 +00005859#endif
5860#ifdef AF_APPLETALK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005861 /* Appletalk DDP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005862 PyModule_AddIntMacro(m, AF_APPLETALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00005863#endif
5864#ifdef AF_NETROM
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005865 /* Amateur radio NetROM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005866 PyModule_AddIntMacro(m, AF_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00005867#endif
5868#ifdef AF_BRIDGE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005869 /* Multiprotocol bridge */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005870 PyModule_AddIntMacro(m, AF_BRIDGE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005871#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005872#ifdef AF_ATMPVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005873 /* ATM PVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005874 PyModule_AddIntMacro(m, AF_ATMPVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005875#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00005876#ifdef AF_AAL5
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005877 /* Reserved for Werner's ATM */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005878 PyModule_AddIntMacro(m, AF_AAL5);
Guido van Rossum09be4091999-08-09 14:40:40 +00005879#endif
5880#ifdef AF_X25
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005881 /* Reserved for X.25 project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005882 PyModule_AddIntMacro(m, AF_X25);
Guido van Rossum09be4091999-08-09 14:40:40 +00005883#endif
5884#ifdef AF_INET6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005885 PyModule_AddIntMacro(m, AF_INET6); /* IP version 6 */
Guido van Rossum09be4091999-08-09 14:40:40 +00005886#endif
5887#ifdef AF_ROSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005888 /* Amateur Radio X.25 PLP */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005889 PyModule_AddIntMacro(m, AF_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00005890#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005891#ifdef AF_DECnet
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005892 /* Reserved for DECnet project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005893 PyModule_AddIntMacro(m, AF_DECnet);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005894#endif
5895#ifdef AF_NETBEUI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005896 /* Reserved for 802.2LLC project */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005897 PyModule_AddIntMacro(m, AF_NETBEUI);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005898#endif
5899#ifdef AF_SECURITY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005900 /* Security callback pseudo AF */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005901 PyModule_AddIntMacro(m, AF_SECURITY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005902#endif
5903#ifdef AF_KEY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005904 /* PF_KEY key management API */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005905 PyModule_AddIntMacro(m, AF_KEY);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005906#endif
5907#ifdef AF_NETLINK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005908 /* */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005909 PyModule_AddIntMacro(m, AF_NETLINK);
5910 PyModule_AddIntMacro(m, NETLINK_ROUTE);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005911#ifdef NETLINK_SKIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005912 PyModule_AddIntMacro(m, NETLINK_SKIP);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005913#endif
5914#ifdef NETLINK_W1
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005915 PyModule_AddIntMacro(m, NETLINK_W1);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005916#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005917 PyModule_AddIntMacro(m, NETLINK_USERSOCK);
5918 PyModule_AddIntMacro(m, NETLINK_FIREWALL);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005919#ifdef NETLINK_TCPDIAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005920 PyModule_AddIntMacro(m, NETLINK_TCPDIAG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005921#endif
5922#ifdef NETLINK_NFLOG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005923 PyModule_AddIntMacro(m, NETLINK_NFLOG);
Guido van Rossum668a94a2006-02-21 01:07:27 +00005924#endif
Neal Norwitz65851662006-01-16 04:31:40 +00005925#ifdef NETLINK_XFRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005926 PyModule_AddIntMacro(m, NETLINK_XFRM);
Neal Norwitz65851662006-01-16 04:31:40 +00005927#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005928#ifdef NETLINK_ARPD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005929 PyModule_AddIntMacro(m, NETLINK_ARPD);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005930#endif
5931#ifdef NETLINK_ROUTE6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005932 PyModule_AddIntMacro(m, NETLINK_ROUTE6);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005933#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005934 PyModule_AddIntMacro(m, NETLINK_IP6_FW);
Thomas Wouterscf297e42007-02-23 15:07:44 +00005935#ifdef NETLINK_DNRTMSG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005936 PyModule_AddIntMacro(m, NETLINK_DNRTMSG);
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00005937#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005938#ifdef NETLINK_TAPBASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005939 PyModule_AddIntMacro(m, NETLINK_TAPBASE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005940#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005941#endif /* AF_NETLINK */
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005942#ifdef AF_ROUTE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005943 /* Alias to emulate 4.4BSD */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005944 PyModule_AddIntMacro(m, AF_ROUTE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005945#endif
Giampaolo Rodola'80e1c432013-05-21 21:02:04 +02005946#ifdef AF_LINK
5947 PyModule_AddIntMacro(m, AF_LINK);
5948#endif
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005949#ifdef AF_ASH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005950 /* Ash */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005951 PyModule_AddIntMacro(m, AF_ASH);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005952#endif
5953#ifdef AF_ECONET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 /* Acorn Econet */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005955 PyModule_AddIntMacro(m, AF_ECONET);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005956#endif
5957#ifdef AF_ATMSVC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005958 /* ATM SVCs */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005959 PyModule_AddIntMacro(m, AF_ATMSVC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005960#endif
5961#ifdef AF_SNA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005962 /* Linux SNA Project (nutters!) */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005963 PyModule_AddIntMacro(m, AF_SNA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005964#endif
5965#ifdef AF_IRDA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005966 /* IRDA sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005967 PyModule_AddIntMacro(m, AF_IRDA);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005968#endif
5969#ifdef AF_PPPOX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 /* PPPoX sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005971 PyModule_AddIntMacro(m, AF_PPPOX);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005972#endif
5973#ifdef AF_WANPIPE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005974 /* Wanpipe API Sockets */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005975 PyModule_AddIntMacro(m, AF_WANPIPE);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005976#endif
5977#ifdef AF_LLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005978 /* Linux LLC */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005979 PyModule_AddIntMacro(m, AF_LLC);
Martin v. Löwis81aec4b2004-07-19 17:01:20 +00005980#endif
Martin v. Löwis12af0482004-01-31 12:34:17 +00005981
Hye-Shik Chang81268602004-02-02 06:05:24 +00005982#ifdef USE_BLUETOOTH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005983 PyModule_AddIntMacro(m, AF_BLUETOOTH);
5984 PyModule_AddIntMacro(m, BTPROTO_L2CAP);
5985 PyModule_AddIntMacro(m, BTPROTO_HCI);
5986 PyModule_AddIntMacro(m, SOL_HCI);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005987#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005988 PyModule_AddIntMacro(m, HCI_FILTER);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005989#endif
Hye-Shik Chang81268602004-02-02 06:05:24 +00005990#if !defined(__FreeBSD__)
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005991#if !defined(__NetBSD__) && !defined(__DragonFly__)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005992 PyModule_AddIntMacro(m, HCI_TIME_STAMP);
Gregory P. Smith3e85dfd2010-10-17 00:43:10 +00005993#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005994 PyModule_AddIntMacro(m, HCI_DATA_DIR);
5995 PyModule_AddIntMacro(m, BTPROTO_SCO);
Hye-Shik Chang81268602004-02-02 06:05:24 +00005996#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02005997 PyModule_AddIntMacro(m, BTPROTO_RFCOMM);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005998 PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");
5999 PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");
Martin v. Löwis12af0482004-01-31 12:34:17 +00006000#endif
6001
Charles-François Natali47413c12011-10-06 19:47:44 +02006002#ifdef AF_CAN
6003 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006004 PyModule_AddIntMacro(m, AF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006005#endif
6006#ifdef PF_CAN
6007 /* Controller Area Network */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006008 PyModule_AddIntMacro(m, PF_CAN);
Charles-François Natali47413c12011-10-06 19:47:44 +02006009#endif
6010
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006011/* Reliable Datagram Sockets */
6012#ifdef AF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006013 PyModule_AddIntMacro(m, AF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006014#endif
6015#ifdef PF_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006016 PyModule_AddIntMacro(m, PF_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006017#endif
6018
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006019/* Kernel event messages */
6020#ifdef PF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006021 PyModule_AddIntMacro(m, PF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006022#endif
6023#ifdef AF_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006024 PyModule_AddIntMacro(m, AF_SYSTEM);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006025#endif
6026
Antoine Pitroub156a462010-10-27 20:13:57 +00006027#ifdef AF_PACKET
6028 PyModule_AddIntMacro(m, AF_PACKET);
6029#endif
6030#ifdef PF_PACKET
6031 PyModule_AddIntMacro(m, PF_PACKET);
6032#endif
6033#ifdef PACKET_HOST
6034 PyModule_AddIntMacro(m, PACKET_HOST);
6035#endif
6036#ifdef PACKET_BROADCAST
6037 PyModule_AddIntMacro(m, PACKET_BROADCAST);
6038#endif
6039#ifdef PACKET_MULTICAST
6040 PyModule_AddIntMacro(m, PACKET_MULTICAST);
6041#endif
6042#ifdef PACKET_OTHERHOST
6043 PyModule_AddIntMacro(m, PACKET_OTHERHOST);
6044#endif
6045#ifdef PACKET_OUTGOING
6046 PyModule_AddIntMacro(m, PACKET_OUTGOING);
6047#endif
6048#ifdef PACKET_LOOPBACK
6049 PyModule_AddIntMacro(m, PACKET_LOOPBACK);
6050#endif
6051#ifdef PACKET_FASTROUTE
6052 PyModule_AddIntMacro(m, PACKET_FASTROUTE);
Guido van Rossum48a680c2001-03-02 06:34:14 +00006053#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006054
Christian Heimes043d6f62008-01-07 17:19:16 +00006055#ifdef HAVE_LINUX_TIPC_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006056 PyModule_AddIntMacro(m, AF_TIPC);
Christian Heimes043d6f62008-01-07 17:19:16 +00006057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006058 /* for addresses */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006059 PyModule_AddIntMacro(m, TIPC_ADDR_NAMESEQ);
6060 PyModule_AddIntMacro(m, TIPC_ADDR_NAME);
6061 PyModule_AddIntMacro(m, TIPC_ADDR_ID);
Christian Heimes043d6f62008-01-07 17:19:16 +00006062
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006063 PyModule_AddIntMacro(m, TIPC_ZONE_SCOPE);
6064 PyModule_AddIntMacro(m, TIPC_CLUSTER_SCOPE);
6065 PyModule_AddIntMacro(m, TIPC_NODE_SCOPE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 /* for setsockopt() */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006068 PyModule_AddIntMacro(m, SOL_TIPC);
6069 PyModule_AddIntMacro(m, TIPC_IMPORTANCE);
6070 PyModule_AddIntMacro(m, TIPC_SRC_DROPPABLE);
6071 PyModule_AddIntMacro(m, TIPC_DEST_DROPPABLE);
6072 PyModule_AddIntMacro(m, TIPC_CONN_TIMEOUT);
Christian Heimes043d6f62008-01-07 17:19:16 +00006073
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006074 PyModule_AddIntMacro(m, TIPC_LOW_IMPORTANCE);
6075 PyModule_AddIntMacro(m, TIPC_MEDIUM_IMPORTANCE);
6076 PyModule_AddIntMacro(m, TIPC_HIGH_IMPORTANCE);
6077 PyModule_AddIntMacro(m, TIPC_CRITICAL_IMPORTANCE);
Christian Heimes043d6f62008-01-07 17:19:16 +00006078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006079 /* for subscriptions */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006080 PyModule_AddIntMacro(m, TIPC_SUB_PORTS);
6081 PyModule_AddIntMacro(m, TIPC_SUB_SERVICE);
Christian Heimes25bb7832008-01-11 16:17:00 +00006082#ifdef TIPC_SUB_CANCEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006083 /* doesn't seem to be available everywhere */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006084 PyModule_AddIntMacro(m, TIPC_SUB_CANCEL);
Christian Heimes25bb7832008-01-11 16:17:00 +00006085#endif
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006086 PyModule_AddIntMacro(m, TIPC_WAIT_FOREVER);
6087 PyModule_AddIntMacro(m, TIPC_PUBLISHED);
6088 PyModule_AddIntMacro(m, TIPC_WITHDRAWN);
6089 PyModule_AddIntMacro(m, TIPC_SUBSCR_TIMEOUT);
6090 PyModule_AddIntMacro(m, TIPC_CFG_SRV);
6091 PyModule_AddIntMacro(m, TIPC_TOP_SRV);
Christian Heimes043d6f62008-01-07 17:19:16 +00006092#endif
6093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 /* Socket types */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006095 PyModule_AddIntMacro(m, SOCK_STREAM);
6096 PyModule_AddIntMacro(m, SOCK_DGRAM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006097/* We have incomplete socket support. */
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006098 PyModule_AddIntMacro(m, SOCK_RAW);
6099 PyModule_AddIntMacro(m, SOCK_SEQPACKET);
Martin v. Löwiscf8f47e2002-12-11 13:10:57 +00006100#if defined(SOCK_RDM)
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006101 PyModule_AddIntMacro(m, SOCK_RDM);
Guido van Rossumbcc20741998-08-04 22:53:56 +00006102#endif
Antoine Pitroub1c54962010-10-14 15:05:38 +00006103#ifdef SOCK_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006104 PyModule_AddIntMacro(m, SOCK_CLOEXEC);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006105#endif
6106#ifdef SOCK_NONBLOCK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006107 PyModule_AddIntMacro(m, SOCK_NONBLOCK);
Antoine Pitroub1c54962010-10-14 15:05:38 +00006108#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006110#ifdef SO_DEBUG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006111 PyModule_AddIntMacro(m, SO_DEBUG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006112#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006113#ifdef SO_ACCEPTCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006114 PyModule_AddIntMacro(m, SO_ACCEPTCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006115#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006116#ifdef SO_REUSEADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006117 PyModule_AddIntMacro(m, SO_REUSEADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006118#endif
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006119#ifdef SO_EXCLUSIVEADDRUSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006120 PyModule_AddIntMacro(m, SO_EXCLUSIVEADDRUSE);
Andrew M. Kuchling42851ab2004-07-10 14:19:21 +00006121#endif
6122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006123#ifdef SO_KEEPALIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006124 PyModule_AddIntMacro(m, SO_KEEPALIVE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006125#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006126#ifdef SO_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006127 PyModule_AddIntMacro(m, SO_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006128#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006129#ifdef SO_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006130 PyModule_AddIntMacro(m, SO_BROADCAST);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006131#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006132#ifdef SO_USELOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006133 PyModule_AddIntMacro(m, SO_USELOOPBACK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006134#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006135#ifdef SO_LINGER
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006136 PyModule_AddIntMacro(m, SO_LINGER);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006137#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006138#ifdef SO_OOBINLINE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006139 PyModule_AddIntMacro(m, SO_OOBINLINE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006140#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006141#ifdef SO_REUSEPORT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006142 PyModule_AddIntMacro(m, SO_REUSEPORT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006143#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144#ifdef SO_SNDBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006145 PyModule_AddIntMacro(m, SO_SNDBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006146#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147#ifdef SO_RCVBUF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006148 PyModule_AddIntMacro(m, SO_RCVBUF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006149#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006150#ifdef SO_SNDLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006151 PyModule_AddIntMacro(m, SO_SNDLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006152#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006153#ifdef SO_RCVLOWAT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006154 PyModule_AddIntMacro(m, SO_RCVLOWAT);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006155#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006156#ifdef SO_SNDTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006157 PyModule_AddIntMacro(m, SO_SNDTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006158#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006159#ifdef SO_RCVTIMEO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006160 PyModule_AddIntMacro(m, SO_RCVTIMEO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006161#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006162#ifdef SO_ERROR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006163 PyModule_AddIntMacro(m, SO_ERROR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006164#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006165#ifdef SO_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006166 PyModule_AddIntMacro(m, SO_TYPE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006167#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006168#ifdef SO_SETFIB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006169 PyModule_AddIntMacro(m, SO_SETFIB);
Larry Hastingsf0f37952010-04-02 11:47:10 +00006170#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006171#ifdef SO_PASSCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006172 PyModule_AddIntMacro(m, SO_PASSCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006173#endif
6174#ifdef SO_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006175 PyModule_AddIntMacro(m, SO_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006176#endif
6177#ifdef LOCAL_PEERCRED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006178 PyModule_AddIntMacro(m, LOCAL_PEERCRED);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006179#endif
Victor Stinnercb98bed2011-10-25 13:45:48 +02006180#ifdef SO_BINDTODEVICE
6181 PyModule_AddIntMacro(m, SO_BINDTODEVICE);
6182#endif
Benjamin Peterson1314ef72013-11-27 09:18:54 -06006183#ifdef SO_PRIORITY
6184 PyModule_AddIntMacro(m, SO_PRIORITY);
6185#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006186
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006187 /* Maximum number of connections for "listen" */
6188#ifdef SOMAXCONN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006189 PyModule_AddIntMacro(m, SOMAXCONN);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006190#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006191 PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006192#endif
6193
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006194 /* Ancilliary message types */
6195#ifdef SCM_RIGHTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006196 PyModule_AddIntMacro(m, SCM_RIGHTS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006197#endif
6198#ifdef SCM_CREDENTIALS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006199 PyModule_AddIntMacro(m, SCM_CREDENTIALS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006200#endif
6201#ifdef SCM_CREDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006202 PyModule_AddIntMacro(m, SCM_CREDS);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006203#endif
6204
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006205 /* Flags for send, recv */
6206#ifdef MSG_OOB
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006207 PyModule_AddIntMacro(m, MSG_OOB);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006208#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006209#ifdef MSG_PEEK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006210 PyModule_AddIntMacro(m, MSG_PEEK);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006211#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006212#ifdef MSG_DONTROUTE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006213 PyModule_AddIntMacro(m, MSG_DONTROUTE);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006214#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006215#ifdef MSG_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006216 PyModule_AddIntMacro(m, MSG_DONTWAIT);
Guido van Rossum2c8bcb82000-04-25 21:34:53 +00006217#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006218#ifdef MSG_EOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006219 PyModule_AddIntMacro(m, MSG_EOR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006220#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006221#ifdef MSG_TRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006222 PyModule_AddIntMacro(m, MSG_TRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006223#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006224#ifdef MSG_CTRUNC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006225 PyModule_AddIntMacro(m, MSG_CTRUNC);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006226#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006227#ifdef MSG_WAITALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006228 PyModule_AddIntMacro(m, MSG_WAITALL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006229#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230#ifdef MSG_BTAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006231 PyModule_AddIntMacro(m, MSG_BTAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006232#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233#ifdef MSG_ETAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006234 PyModule_AddIntMacro(m, MSG_ETAG);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006235#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006236#ifdef MSG_NOSIGNAL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006237 PyModule_AddIntMacro(m, MSG_NOSIGNAL);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006238#endif
6239#ifdef MSG_NOTIFICATION
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006240 PyModule_AddIntMacro(m, MSG_NOTIFICATION);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006241#endif
6242#ifdef MSG_CMSG_CLOEXEC
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006243 PyModule_AddIntMacro(m, MSG_CMSG_CLOEXEC);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006244#endif
6245#ifdef MSG_ERRQUEUE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006246 PyModule_AddIntMacro(m, MSG_ERRQUEUE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006247#endif
6248#ifdef MSG_CONFIRM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006249 PyModule_AddIntMacro(m, MSG_CONFIRM);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006250#endif
6251#ifdef MSG_MORE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006252 PyModule_AddIntMacro(m, MSG_MORE);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006253#endif
6254#ifdef MSG_EOF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006255 PyModule_AddIntMacro(m, MSG_EOF);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006256#endif
6257#ifdef MSG_BCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006258 PyModule_AddIntMacro(m, MSG_BCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006259#endif
6260#ifdef MSG_MCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006261 PyModule_AddIntMacro(m, MSG_MCAST);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006262#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006263#ifdef MSG_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006264 PyModule_AddIntMacro(m, MSG_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006265#endif
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006267 /* Protocol level and numbers, usable for [gs]etsockopt */
6268#ifdef SOL_SOCKET
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006269 PyModule_AddIntMacro(m, SOL_SOCKET);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006270#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006271#ifdef SOL_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006272 PyModule_AddIntMacro(m, SOL_IP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006273#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006274 PyModule_AddIntConstant(m, "SOL_IP", 0);
Guido van Rossum09be4091999-08-09 14:40:40 +00006275#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006276#ifdef SOL_IPX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006277 PyModule_AddIntMacro(m, SOL_IPX);
Guido van Rossum09be4091999-08-09 14:40:40 +00006278#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006279#ifdef SOL_AX25
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006280 PyModule_AddIntMacro(m, SOL_AX25);
Guido van Rossum09be4091999-08-09 14:40:40 +00006281#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006282#ifdef SOL_ATALK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006283 PyModule_AddIntMacro(m, SOL_ATALK);
Guido van Rossum09be4091999-08-09 14:40:40 +00006284#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006285#ifdef SOL_NETROM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006286 PyModule_AddIntMacro(m, SOL_NETROM);
Guido van Rossum09be4091999-08-09 14:40:40 +00006287#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006288#ifdef SOL_ROSE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006289 PyModule_AddIntMacro(m, SOL_ROSE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006290#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006291#ifdef SOL_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006292 PyModule_AddIntMacro(m, SOL_TCP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006293#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006294 PyModule_AddIntConstant(m, "SOL_TCP", 6);
Guido van Rossum09be4091999-08-09 14:40:40 +00006295#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006296#ifdef SOL_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006297 PyModule_AddIntMacro(m, SOL_UDP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006298#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006299 PyModule_AddIntConstant(m, "SOL_UDP", 17);
Guido van Rossum09be4091999-08-09 14:40:40 +00006300#endif
Charles-François Natali47413c12011-10-06 19:47:44 +02006301#ifdef SOL_CAN_BASE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006302 PyModule_AddIntMacro(m, SOL_CAN_BASE);
Charles-François Natali47413c12011-10-06 19:47:44 +02006303#endif
6304#ifdef SOL_CAN_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006305 PyModule_AddIntMacro(m, SOL_CAN_RAW);
6306 PyModule_AddIntMacro(m, CAN_RAW);
Charles-François Natali47413c12011-10-06 19:47:44 +02006307#endif
6308#ifdef HAVE_LINUX_CAN_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006309 PyModule_AddIntMacro(m, CAN_EFF_FLAG);
6310 PyModule_AddIntMacro(m, CAN_RTR_FLAG);
6311 PyModule_AddIntMacro(m, CAN_ERR_FLAG);
Charles-François Natali47413c12011-10-06 19:47:44 +02006312
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006313 PyModule_AddIntMacro(m, CAN_SFF_MASK);
6314 PyModule_AddIntMacro(m, CAN_EFF_MASK);
6315 PyModule_AddIntMacro(m, CAN_ERR_MASK);
Charles-François Natali47413c12011-10-06 19:47:44 +02006316#endif
6317#ifdef HAVE_LINUX_CAN_RAW_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006318 PyModule_AddIntMacro(m, CAN_RAW_FILTER);
6319 PyModule_AddIntMacro(m, CAN_RAW_ERR_FILTER);
6320 PyModule_AddIntMacro(m, CAN_RAW_LOOPBACK);
6321 PyModule_AddIntMacro(m, CAN_RAW_RECV_OWN_MSGS);
Charles-François Natali47413c12011-10-06 19:47:44 +02006322#endif
Charles-François Natali773e42d2013-02-05 19:42:01 +01006323#ifdef HAVE_LINUX_CAN_BCM_H
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006324 PyModule_AddIntMacro(m, CAN_BCM);
Charles-François Natali773e42d2013-02-05 19:42:01 +01006325 PyModule_AddIntConstant(m, "CAN_BCM_TX_SETUP", TX_SETUP);
6326 PyModule_AddIntConstant(m, "CAN_BCM_TX_DELETE", TX_DELETE);
6327 PyModule_AddIntConstant(m, "CAN_BCM_TX_READ", TX_READ);
6328 PyModule_AddIntConstant(m, "CAN_BCM_TX_SEND", TX_SEND);
6329 PyModule_AddIntConstant(m, "CAN_BCM_RX_SETUP", RX_SETUP);
6330 PyModule_AddIntConstant(m, "CAN_BCM_RX_DELETE", RX_DELETE);
6331 PyModule_AddIntConstant(m, "CAN_BCM_RX_READ", RX_READ);
6332 PyModule_AddIntConstant(m, "CAN_BCM_TX_STATUS", TX_STATUS);
6333 PyModule_AddIntConstant(m, "CAN_BCM_TX_EXPIRED", TX_EXPIRED);
6334 PyModule_AddIntConstant(m, "CAN_BCM_RX_STATUS", RX_STATUS);
6335 PyModule_AddIntConstant(m, "CAN_BCM_RX_TIMEOUT", RX_TIMEOUT);
6336 PyModule_AddIntConstant(m, "CAN_BCM_RX_CHANGED", RX_CHANGED);
6337#endif
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006338#ifdef SOL_RDS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006339 PyModule_AddIntMacro(m, SOL_RDS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006340#endif
6341#ifdef RDS_CANCEL_SENT_TO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006342 PyModule_AddIntMacro(m, RDS_CANCEL_SENT_TO);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006343#endif
6344#ifdef RDS_GET_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006345 PyModule_AddIntMacro(m, RDS_GET_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006346#endif
6347#ifdef RDS_FREE_MR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006348 PyModule_AddIntMacro(m, RDS_FREE_MR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006349#endif
6350#ifdef RDS_RECVERR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006351 PyModule_AddIntMacro(m, RDS_RECVERR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006352#endif
6353#ifdef RDS_CONG_MONITOR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006354 PyModule_AddIntMacro(m, RDS_CONG_MONITOR);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006355#endif
6356#ifdef RDS_GET_MR_FOR_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006357 PyModule_AddIntMacro(m, RDS_GET_MR_FOR_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006358#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006359#ifdef IPPROTO_IP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006360 PyModule_AddIntMacro(m, IPPROTO_IP);
Guido van Rossum578de301998-05-28 20:18:18 +00006361#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006362 PyModule_AddIntConstant(m, "IPPROTO_IP", 0);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006363#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006364#ifdef IPPROTO_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006365 PyModule_AddIntMacro(m, IPPROTO_HOPOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006366#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006367#ifdef IPPROTO_ICMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006368 PyModule_AddIntMacro(m, IPPROTO_ICMP);
Guido van Rossum578de301998-05-28 20:18:18 +00006369#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006370 PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006371#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006372#ifdef IPPROTO_IGMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006373 PyModule_AddIntMacro(m, IPPROTO_IGMP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006374#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006375#ifdef IPPROTO_GGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006376 PyModule_AddIntMacro(m, IPPROTO_GGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006377#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006378#ifdef IPPROTO_IPV4
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006379 PyModule_AddIntMacro(m, IPPROTO_IPV4);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006380#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006381#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006382 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisa0f17342003-10-03 13:56:20 +00006383#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006384#ifdef IPPROTO_IPIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006385 PyModule_AddIntMacro(m, IPPROTO_IPIP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006386#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006387#ifdef IPPROTO_TCP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006388 PyModule_AddIntMacro(m, IPPROTO_TCP);
Guido van Rossum578de301998-05-28 20:18:18 +00006389#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006390 PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006391#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006392#ifdef IPPROTO_EGP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006393 PyModule_AddIntMacro(m, IPPROTO_EGP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006394#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006395#ifdef IPPROTO_PUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006396 PyModule_AddIntMacro(m, IPPROTO_PUP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006397#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006398#ifdef IPPROTO_UDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006399 PyModule_AddIntMacro(m, IPPROTO_UDP);
Guido van Rossum578de301998-05-28 20:18:18 +00006400#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006401 PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006402#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006403#ifdef IPPROTO_IDP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006404 PyModule_AddIntMacro(m, IPPROTO_IDP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006405#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006406#ifdef IPPROTO_HELLO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006407 PyModule_AddIntMacro(m, IPPROTO_HELLO);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006408#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006409#ifdef IPPROTO_ND
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006410 PyModule_AddIntMacro(m, IPPROTO_ND);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006411#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006412#ifdef IPPROTO_TP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006413 PyModule_AddIntMacro(m, IPPROTO_TP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006414#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006415#ifdef IPPROTO_IPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006416 PyModule_AddIntMacro(m, IPPROTO_IPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006417#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006418#ifdef IPPROTO_ROUTING
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006419 PyModule_AddIntMacro(m, IPPROTO_ROUTING);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006420#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006421#ifdef IPPROTO_FRAGMENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006422 PyModule_AddIntMacro(m, IPPROTO_FRAGMENT);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006423#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006424#ifdef IPPROTO_RSVP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006425 PyModule_AddIntMacro(m, IPPROTO_RSVP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006426#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006427#ifdef IPPROTO_GRE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006428 PyModule_AddIntMacro(m, IPPROTO_GRE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006429#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006430#ifdef IPPROTO_ESP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006431 PyModule_AddIntMacro(m, IPPROTO_ESP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006432#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006433#ifdef IPPROTO_AH
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006434 PyModule_AddIntMacro(m, IPPROTO_AH);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006435#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006436#ifdef IPPROTO_MOBILE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006437 PyModule_AddIntMacro(m, IPPROTO_MOBILE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006438#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006439#ifdef IPPROTO_ICMPV6
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006440 PyModule_AddIntMacro(m, IPPROTO_ICMPV6);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006441#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006442#ifdef IPPROTO_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006443 PyModule_AddIntMacro(m, IPPROTO_NONE);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006444#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006445#ifdef IPPROTO_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006446 PyModule_AddIntMacro(m, IPPROTO_DSTOPTS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006447#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006448#ifdef IPPROTO_XTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006449 PyModule_AddIntMacro(m, IPPROTO_XTP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006450#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006451#ifdef IPPROTO_EON
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006452 PyModule_AddIntMacro(m, IPPROTO_EON);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006453#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006454#ifdef IPPROTO_PIM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006455 PyModule_AddIntMacro(m, IPPROTO_PIM);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006456#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006457#ifdef IPPROTO_IPCOMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006458 PyModule_AddIntMacro(m, IPPROTO_IPCOMP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006459#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006460#ifdef IPPROTO_VRRP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006461 PyModule_AddIntMacro(m, IPPROTO_VRRP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006462#endif
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006463#ifdef IPPROTO_SCTP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006464 PyModule_AddIntMacro(m, IPPROTO_SCTP);
Nick Coghlan96fe56a2011-08-22 11:55:57 +10006465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006466#ifdef IPPROTO_BIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006467 PyModule_AddIntMacro(m, IPPROTO_BIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006468#endif
6469/**/
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006470#ifdef IPPROTO_RAW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006471 PyModule_AddIntMacro(m, IPPROTO_RAW);
Guido van Rossum578de301998-05-28 20:18:18 +00006472#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006473 PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006474#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006475#ifdef IPPROTO_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006476 PyModule_AddIntMacro(m, IPPROTO_MAX);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006477#endif
6478
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006479#ifdef SYSPROTO_CONTROL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006480 PyModule_AddIntMacro(m, SYSPROTO_CONTROL);
Martin v. Löwis9d6c6692012-02-03 17:44:58 +01006481#endif
6482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006483 /* Some port configuration */
6484#ifdef IPPORT_RESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006485 PyModule_AddIntMacro(m, IPPORT_RESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006486#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006487 PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006489#ifdef IPPORT_USERRESERVED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006490 PyModule_AddIntMacro(m, IPPORT_USERRESERVED);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006491#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006492 PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006493#endif
6494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006495 /* Some reserved IP v.4 addresses */
6496#ifdef INADDR_ANY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006497 PyModule_AddIntMacro(m, INADDR_ANY);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006498#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006499 PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006500#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006501#ifdef INADDR_BROADCAST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006502 PyModule_AddIntMacro(m, INADDR_BROADCAST);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006503#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006504 PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006505#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006506#ifdef INADDR_LOOPBACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006507 PyModule_AddIntMacro(m, INADDR_LOOPBACK);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006508#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006509 PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006510#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006511#ifdef INADDR_UNSPEC_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006512 PyModule_AddIntMacro(m, INADDR_UNSPEC_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006513#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006514 PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006515#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006516#ifdef INADDR_ALLHOSTS_GROUP
6517 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",
6518 INADDR_ALLHOSTS_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006519#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006520 PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006521#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006522#ifdef INADDR_MAX_LOCAL_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006523 PyModule_AddIntMacro(m, INADDR_MAX_LOCAL_GROUP);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006524#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006525 PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006526#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006527#ifdef INADDR_NONE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006528 PyModule_AddIntMacro(m, INADDR_NONE);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006529#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006530 PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);
Guido van Rossum5f05eb41995-02-17 15:11:07 +00006531#endif
6532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006533 /* IPv4 [gs]etsockopt options */
6534#ifdef IP_OPTIONS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006535 PyModule_AddIntMacro(m, IP_OPTIONS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006536#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006537#ifdef IP_HDRINCL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006538 PyModule_AddIntMacro(m, IP_HDRINCL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006539#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006540#ifdef IP_TOS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006541 PyModule_AddIntMacro(m, IP_TOS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006542#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006543#ifdef IP_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006544 PyModule_AddIntMacro(m, IP_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006545#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006546#ifdef IP_RECVOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006547 PyModule_AddIntMacro(m, IP_RECVOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006548#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006549#ifdef IP_RECVRETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006550 PyModule_AddIntMacro(m, IP_RECVRETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006552#ifdef IP_RECVDSTADDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006553 PyModule_AddIntMacro(m, IP_RECVDSTADDR);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006554#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006555#ifdef IP_RETOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006556 PyModule_AddIntMacro(m, IP_RETOPTS);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006557#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006558#ifdef IP_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006559 PyModule_AddIntMacro(m, IP_MULTICAST_IF);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006560#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006561#ifdef IP_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006562 PyModule_AddIntMacro(m, IP_MULTICAST_TTL);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006563#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006564#ifdef IP_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006565 PyModule_AddIntMacro(m, IP_MULTICAST_LOOP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006566#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006567#ifdef IP_ADD_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006568 PyModule_AddIntMacro(m, IP_ADD_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006569#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006570#ifdef IP_DROP_MEMBERSHIP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006571 PyModule_AddIntMacro(m, IP_DROP_MEMBERSHIP);
Guido van Rossum3fdf58b1995-02-07 15:39:52 +00006572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006573#ifdef IP_DEFAULT_MULTICAST_TTL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006574 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_TTL);
Guido van Rossum09be4091999-08-09 14:40:40 +00006575#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006576#ifdef IP_DEFAULT_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006577 PyModule_AddIntMacro(m, IP_DEFAULT_MULTICAST_LOOP);
Guido van Rossum09be4091999-08-09 14:40:40 +00006578#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006579#ifdef IP_MAX_MEMBERSHIPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006580 PyModule_AddIntMacro(m, IP_MAX_MEMBERSHIPS);
Guido van Rossum09be4091999-08-09 14:40:40 +00006581#endif
Charles-François Natali564a42c2011-12-17 14:59:56 +01006582#ifdef IP_TRANSPARENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006583 PyModule_AddIntMacro(m, IP_TRANSPARENT);
Charles-François Natali564a42c2011-12-17 14:59:56 +01006584#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006586 /* IPv6 [gs]etsockopt options, defined in RFC2553 */
6587#ifdef IPV6_JOIN_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006588 PyModule_AddIntMacro(m, IPV6_JOIN_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006589#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006590#ifdef IPV6_LEAVE_GROUP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006591 PyModule_AddIntMacro(m, IPV6_LEAVE_GROUP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006592#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006593#ifdef IPV6_MULTICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006594 PyModule_AddIntMacro(m, IPV6_MULTICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006595#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006596#ifdef IPV6_MULTICAST_IF
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006597 PyModule_AddIntMacro(m, IPV6_MULTICAST_IF);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006599#ifdef IPV6_MULTICAST_LOOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006600 PyModule_AddIntMacro(m, IPV6_MULTICAST_LOOP);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006601#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006602#ifdef IPV6_UNICAST_HOPS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006603 PyModule_AddIntMacro(m, IPV6_UNICAST_HOPS);
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006604#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006605 /* Additional IPV6 socket options, defined in RFC 3493 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006606#ifdef IPV6_V6ONLY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006607 PyModule_AddIntMacro(m, IPV6_V6ONLY);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006608#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006609 /* Advanced IPV6 socket options, from RFC 3542 */
Martin v. Löwisda91d022003-12-30 11:14:01 +00006610#ifdef IPV6_CHECKSUM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006611 PyModule_AddIntMacro(m, IPV6_CHECKSUM);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006612#endif
6613#ifdef IPV6_DONTFRAG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006614 PyModule_AddIntMacro(m, IPV6_DONTFRAG);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006615#endif
6616#ifdef IPV6_DSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006617 PyModule_AddIntMacro(m, IPV6_DSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006618#endif
6619#ifdef IPV6_HOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006620 PyModule_AddIntMacro(m, IPV6_HOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006621#endif
6622#ifdef IPV6_HOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006623 PyModule_AddIntMacro(m, IPV6_HOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006624#endif
6625#ifdef IPV6_NEXTHOP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006626 PyModule_AddIntMacro(m, IPV6_NEXTHOP);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006627#endif
6628#ifdef IPV6_PATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006629 PyModule_AddIntMacro(m, IPV6_PATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006630#endif
6631#ifdef IPV6_PKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006632 PyModule_AddIntMacro(m, IPV6_PKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006633#endif
6634#ifdef IPV6_RECVDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006635 PyModule_AddIntMacro(m, IPV6_RECVDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006636#endif
6637#ifdef IPV6_RECVHOPLIMIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006638 PyModule_AddIntMacro(m, IPV6_RECVHOPLIMIT);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006639#endif
6640#ifdef IPV6_RECVHOPOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006641 PyModule_AddIntMacro(m, IPV6_RECVHOPOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006642#endif
6643#ifdef IPV6_RECVPKTINFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006644 PyModule_AddIntMacro(m, IPV6_RECVPKTINFO);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006645#endif
6646#ifdef IPV6_RECVRTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006647 PyModule_AddIntMacro(m, IPV6_RECVRTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006648#endif
6649#ifdef IPV6_RECVTCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006650 PyModule_AddIntMacro(m, IPV6_RECVTCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006651#endif
6652#ifdef IPV6_RTHDR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006653 PyModule_AddIntMacro(m, IPV6_RTHDR);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006654#endif
6655#ifdef IPV6_RTHDRDSTOPTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006656 PyModule_AddIntMacro(m, IPV6_RTHDRDSTOPTS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006657#endif
6658#ifdef IPV6_RTHDR_TYPE_0
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006659 PyModule_AddIntMacro(m, IPV6_RTHDR_TYPE_0);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006660#endif
6661#ifdef IPV6_RECVPATHMTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006662 PyModule_AddIntMacro(m, IPV6_RECVPATHMTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006663#endif
6664#ifdef IPV6_TCLASS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006665 PyModule_AddIntMacro(m, IPV6_TCLASS);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006666#endif
6667#ifdef IPV6_USE_MIN_MTU
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006668 PyModule_AddIntMacro(m, IPV6_USE_MIN_MTU);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006669#endif
Martin v. Löwisbcf4b352001-08-04 22:37:23 +00006670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006671 /* TCP options */
6672#ifdef TCP_NODELAY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006673 PyModule_AddIntMacro(m, TCP_NODELAY);
Guido van Rossum09be4091999-08-09 14:40:40 +00006674#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006675#ifdef TCP_MAXSEG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006676 PyModule_AddIntMacro(m, TCP_MAXSEG);
Guido van Rossum09be4091999-08-09 14:40:40 +00006677#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006678#ifdef TCP_CORK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006679 PyModule_AddIntMacro(m, TCP_CORK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006680#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006681#ifdef TCP_KEEPIDLE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006682 PyModule_AddIntMacro(m, TCP_KEEPIDLE);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006683#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006684#ifdef TCP_KEEPINTVL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006685 PyModule_AddIntMacro(m, TCP_KEEPINTVL);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006686#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006687#ifdef TCP_KEEPCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006688 PyModule_AddIntMacro(m, TCP_KEEPCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006689#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006690#ifdef TCP_SYNCNT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006691 PyModule_AddIntMacro(m, TCP_SYNCNT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006692#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006693#ifdef TCP_LINGER2
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006694 PyModule_AddIntMacro(m, TCP_LINGER2);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006695#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006696#ifdef TCP_DEFER_ACCEPT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006697 PyModule_AddIntMacro(m, TCP_DEFER_ACCEPT);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006698#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006699#ifdef TCP_WINDOW_CLAMP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006700 PyModule_AddIntMacro(m, TCP_WINDOW_CLAMP);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006701#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006702#ifdef TCP_INFO
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006703 PyModule_AddIntMacro(m, TCP_INFO);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006704#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006705#ifdef TCP_QUICKACK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006706 PyModule_AddIntMacro(m, TCP_QUICKACK);
Martin v. Löwis3cde2cb2001-12-22 15:05:32 +00006707#endif
Benjamin Peterson57b66722012-12-12 22:24:47 -05006708#ifdef TCP_FASTOPEN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006709 PyModule_AddIntMacro(m, TCP_FASTOPEN);
Benjamin Peterson57b66722012-12-12 22:24:47 -05006710#endif
Guido van Rossum09be4091999-08-09 14:40:40 +00006711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006712 /* IPX options */
6713#ifdef IPX_TYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006714 PyModule_AddIntMacro(m, IPX_TYPE);
Guido van Rossum09be4091999-08-09 14:40:40 +00006715#endif
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006716
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006717/* Reliable Datagram Sockets */
6718#ifdef RDS_CMSG_RDMA_ARGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006719 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_ARGS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006720#endif
6721#ifdef RDS_CMSG_RDMA_DEST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006722 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_DEST);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006723#endif
6724#ifdef RDS_CMSG_RDMA_MAP
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006725 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_MAP);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006726#endif
6727#ifdef RDS_CMSG_RDMA_STATUS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006728 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_STATUS);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006729#endif
6730#ifdef RDS_CMSG_RDMA_UPDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006731 PyModule_AddIntMacro(m, RDS_CMSG_RDMA_UPDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006732#endif
6733#ifdef RDS_RDMA_READWRITE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006734 PyModule_AddIntMacro(m, RDS_RDMA_READWRITE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006735#endif
6736#ifdef RDS_RDMA_FENCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006737 PyModule_AddIntMacro(m, RDS_RDMA_FENCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006738#endif
6739#ifdef RDS_RDMA_INVALIDATE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006740 PyModule_AddIntMacro(m, RDS_RDMA_INVALIDATE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006741#endif
6742#ifdef RDS_RDMA_USE_ONCE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006743 PyModule_AddIntMacro(m, RDS_RDMA_USE_ONCE);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006744#endif
6745#ifdef RDS_RDMA_DONTWAIT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006746 PyModule_AddIntMacro(m, RDS_RDMA_DONTWAIT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006747#endif
6748#ifdef RDS_RDMA_NOTIFY_ME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006749 PyModule_AddIntMacro(m, RDS_RDMA_NOTIFY_ME);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006750#endif
6751#ifdef RDS_RDMA_SILENT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006752 PyModule_AddIntMacro(m, RDS_RDMA_SILENT);
Charles-François Natali10b8cf42011-11-10 19:21:37 +01006753#endif
6754
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006755 /* get{addr,name}info parameters */
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006756#ifdef EAI_ADDRFAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006757 PyModule_AddIntMacro(m, EAI_ADDRFAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006758#endif
6759#ifdef EAI_AGAIN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006760 PyModule_AddIntMacro(m, EAI_AGAIN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006761#endif
6762#ifdef EAI_BADFLAGS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006763 PyModule_AddIntMacro(m, EAI_BADFLAGS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006764#endif
6765#ifdef EAI_FAIL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006766 PyModule_AddIntMacro(m, EAI_FAIL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006767#endif
6768#ifdef EAI_FAMILY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006769 PyModule_AddIntMacro(m, EAI_FAMILY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006770#endif
6771#ifdef EAI_MEMORY
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006772 PyModule_AddIntMacro(m, EAI_MEMORY);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006773#endif
6774#ifdef EAI_NODATA
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006775 PyModule_AddIntMacro(m, EAI_NODATA);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006776#endif
6777#ifdef EAI_NONAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006778 PyModule_AddIntMacro(m, EAI_NONAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006779#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006780#ifdef EAI_OVERFLOW
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006781 PyModule_AddIntMacro(m, EAI_OVERFLOW);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006782#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006783#ifdef EAI_SERVICE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006784 PyModule_AddIntMacro(m, EAI_SERVICE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006785#endif
6786#ifdef EAI_SOCKTYPE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006787 PyModule_AddIntMacro(m, EAI_SOCKTYPE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006788#endif
6789#ifdef EAI_SYSTEM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006790 PyModule_AddIntMacro(m, EAI_SYSTEM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006791#endif
6792#ifdef EAI_BADHINTS
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006793 PyModule_AddIntMacro(m, EAI_BADHINTS);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006794#endif
6795#ifdef EAI_PROTOCOL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006796 PyModule_AddIntMacro(m, EAI_PROTOCOL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006797#endif
6798#ifdef EAI_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006799 PyModule_AddIntMacro(m, EAI_MAX);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006800#endif
6801#ifdef AI_PASSIVE
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006802 PyModule_AddIntMacro(m, AI_PASSIVE);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006803#endif
6804#ifdef AI_CANONNAME
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006805 PyModule_AddIntMacro(m, AI_CANONNAME);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006806#endif
6807#ifdef AI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006808 PyModule_AddIntMacro(m, AI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006809#endif
Martin v. Löwisda91d022003-12-30 11:14:01 +00006810#ifdef AI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006811 PyModule_AddIntMacro(m, AI_NUMERICSERV);
Martin v. Löwisda91d022003-12-30 11:14:01 +00006812#endif
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006813#ifdef AI_MASK
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006814 PyModule_AddIntMacro(m, AI_MASK);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006815#endif
6816#ifdef AI_ALL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006817 PyModule_AddIntMacro(m, AI_ALL);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006818#endif
6819#ifdef AI_V4MAPPED_CFG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006820 PyModule_AddIntMacro(m, AI_V4MAPPED_CFG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006821#endif
6822#ifdef AI_ADDRCONFIG
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006823 PyModule_AddIntMacro(m, AI_ADDRCONFIG);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006824#endif
6825#ifdef AI_V4MAPPED
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006826 PyModule_AddIntMacro(m, AI_V4MAPPED);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006827#endif
6828#ifdef AI_DEFAULT
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006829 PyModule_AddIntMacro(m, AI_DEFAULT);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006830#endif
6831#ifdef NI_MAXHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006832 PyModule_AddIntMacro(m, NI_MAXHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006833#endif
6834#ifdef NI_MAXSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006835 PyModule_AddIntMacro(m, NI_MAXSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006836#endif
6837#ifdef NI_NOFQDN
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006838 PyModule_AddIntMacro(m, NI_NOFQDN);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006839#endif
6840#ifdef NI_NUMERICHOST
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006841 PyModule_AddIntMacro(m, NI_NUMERICHOST);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006842#endif
6843#ifdef NI_NAMEREQD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006844 PyModule_AddIntMacro(m, NI_NAMEREQD);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006845#endif
6846#ifdef NI_NUMERICSERV
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006847 PyModule_AddIntMacro(m, NI_NUMERICSERV);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006848#endif
6849#ifdef NI_DGRAM
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006850 PyModule_AddIntMacro(m, NI_DGRAM);
Martin v. Löwis2d8d4272001-07-21 18:05:31 +00006851#endif
6852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006853 /* shutdown() parameters */
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006854#ifdef SHUT_RD
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006855 PyModule_AddIntMacro(m, SHUT_RD);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006856#elif defined(SD_RECEIVE)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006857 PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006858#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006859 PyModule_AddIntConstant(m, "SHUT_RD", 0);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006860#endif
6861#ifdef SHUT_WR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006862 PyModule_AddIntMacro(m, SHUT_WR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006863#elif defined(SD_SEND)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006864 PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006865#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006866 PyModule_AddIntConstant(m, "SHUT_WR", 1);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006867#endif
6868#ifdef SHUT_RDWR
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006869 PyModule_AddIntMacro(m, SHUT_RDWR);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006870#elif defined(SD_BOTH)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006871 PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006872#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006873 PyModule_AddIntConstant(m, "SHUT_RDWR", 2);
Martin v. Löwis94681fc2003-11-27 19:40:22 +00006874#endif
6875
Christian Heimesfaf2f632008-01-06 16:59:19 +00006876#ifdef SIO_RCVALL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006877 {
6878 DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};
6879 const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};
6880 int i;
Victor Stinner63941882011-09-29 00:42:28 +02006881 for(i = 0; i<Py_ARRAY_LENGTH(codes); ++i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006882 PyObject *tmp;
6883 tmp = PyLong_FromUnsignedLong(codes[i]);
6884 if (tmp == NULL)
6885 return NULL;
6886 PyModule_AddObject(m, names[i], tmp);
6887 }
6888 }
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006889 PyModule_AddIntMacro(m, RCVALL_OFF);
6890 PyModule_AddIntMacro(m, RCVALL_ON);
6891 PyModule_AddIntMacro(m, RCVALL_SOCKETLEVELONLY);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006892#ifdef RCVALL_IPLEVEL
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006893 PyModule_AddIntMacro(m, RCVALL_IPLEVEL);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006894#endif
6895#ifdef RCVALL_MAX
Charles-Francois Natali74ca8862013-05-20 19:13:19 +02006896 PyModule_AddIntMacro(m, RCVALL_MAX);
Amaury Forgeot d'Arc762681b2008-06-12 23:03:41 +00006897#endif
Christian Heimesfaf2f632008-01-06 16:59:19 +00006898#endif /* _MSTCPIP_ */
6899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006900 /* Initialize gethostbyname lock */
Just van Rossum1040d2c2003-05-09 07:53:18 +00006901#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006902 netdb_lock = PyThread_allocate_lock();
Guido van Rossum4f199ea1998-04-09 20:56:35 +00006903#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006904 return m;
Guido van Rossum6574b3e1991-06-25 21:36:08 +00006905}
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006906
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006907
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006908#ifndef HAVE_INET_PTON
Christian Heimes96e7b3d2007-11-20 06:51:17 +00006909#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006910
6911/* Simplistic emulation code for inet_pton that only works for IPv4 */
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00006912/* These are not exposed because they do not set errno properly */
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006913
Guido van Rossum3eede5a2002-06-07 02:08:35 +00006914int
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006915inet_pton(int af, const char *src, void *dst)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006917 if (af == AF_INET) {
Benjamin Petersonf91df042009-02-13 02:50:59 +00006918#if (SIZEOF_INT != 4)
6919#error "Not sure if in_addr_t exists and int is not 32-bits."
6920#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006921 unsigned int packed_addr;
6922 packed_addr = inet_addr(src);
6923 if (packed_addr == INADDR_NONE)
6924 return 0;
6925 memcpy(dst, &packed_addr, 4);
6926 return 1;
6927 }
6928 /* Should set errno to EAFNOSUPPORT */
6929 return -1;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006930}
6931
Martin v. Löwisc925b1532001-07-21 09:42:15 +00006932const char *
6933inet_ntop(int af, const void *src, char *dst, socklen_t size)
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006934{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006935 if (af == AF_INET) {
6936 struct in_addr packed_addr;
6937 if (size < 16)
6938 /* Should set errno to ENOSPC. */
6939 return NULL;
6940 memcpy(&packed_addr, src, sizeof(packed_addr));
6941 return strncpy(dst, inet_ntoa(packed_addr), size);
6942 }
6943 /* Should set errno to EAFNOSUPPORT */
6944 return NULL;
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006945}
Guido van Rossumc4fcfa32002-06-07 03:19:37 +00006946
Martin v. Löwisb9ab1592001-06-24 21:18:26 +00006947#endif
Christian Heimesb6150692007-11-15 23:37:07 +00006948#endif